Lazarus Lazarus Indy Smtp
にて、メール送信時の、Subject(題名)日本語対応
環境
Ubuntu 16
Lazarus 20.0.10
現象
メイル本文、送信者などの日本語対応ができたが
題名(Subject)が日本語にならない
IdMessage1のイベントで(IdMessage1InitializeISO)での
対応を行おうとIdMessage1InitializeISOを作成しようとするとにエラーとなり、作成できなかった
その他の対策(うまく行かなかった)
IdMessage(Indy)以外として
lNet,Synapse,jConvertなど行ったがうまくいかなかった(解決法があるかもしれないが。。。)
参考ページ
//https://wiki.freepascal.org/Networking_libraries
//https://www.migaro.co.jp/contents/support/technical_seminar_search/07th/Session3.pdf
対策
これでいいかわからないが、IdMessage1InitializeISO作成時のエラーをコメントアウトした
修正前(IdGlobal)
GOffsetFromUTC: TDateTime = 0{$IFDEF HAS_DEPRECATED}{$IFDEF USE_SEMICOLON_BEFORE_DEPRECATED};{$ENDIF} deprecated{$ENDIF}; {$IFDEF OSX} GMachTimeBaseInfo: TTimebaseInfoData; {$ENDIF}
修正後
GOffsetFromUTC: TDateTime = 0 // {$IFDEF HAS_DEPRECATED}{$IFDEF USE_SEMICOLON_BEFORE_DEPRECATED};{$ENDIF} deprecated{$ENDIF}; GMachTimeBaseInfo: TTimebaseInfoData; {$IFDEF OSX} GMachTimeBaseInfo: TTimebaseInfoData; {$ENDIF}
修正前(TIdMessage)
IdCharSets,IdGlobalProtocols, IdMessageCoder, IdResourceStringsProtocols,
修正後
//IdCharSets, IdGlobalProtocols, IdMessageCoder, IdResourceStringsProtocols,
本体
インスタンスはcreateせずに、設置したものを使用した
procedure TForm1.IdMessage1InitializeISO(var VHeaderEncoding: Char; var VCharSet: string); begin VHeaderEncoding := 'B'; VCharSet := 'UTF-8'; end; procedure TForm1.Button1Click(Sender: TObject); begin try try IdSMTP1.HOST:='xxx.com'; IdSMTP1.PORT:=587; IdSMTP1.Username:='xxx@xxx.com'; IdSMTP1.Password:='xxxxxx'; IdSMTP1.Connect; IdMessage1.ContentType := 'text/plain'; // コンテンツタイプ IdMessage1.CharSet := 'UTF-8'; // 文字セット IdMessage1.ContentTransferEncoding := 'BASE64'; IdMessage1.From.Address := 'info@atiinelab.com'; IdMessage1.Recipients.EMailAddresses := 'xxxxx@xxxx.com'; IdMessage1.ReplyTo.EMailAddresses:='xxx@xxx.com'; IdMessage1.Body.Text :='メール本文'; // IdMessage1.Subject := EncodeHeader(UTF8Encode('アカウントを送付します'), '', 'B', 'UTF-8'); IdMessage1.Subject := '日本語の題名'; IdMessage1.From.Name := EncodeHeader('送信者名', '', 'B', 'UTF-8'); //*=== メール送信 ===*/ IdSMTP1.Send(IdMessage1); except end; finally //*=== SMTPサーバの切断 ===*/ if IdSMTP1 <> nil then begin IdSMTP1.Disconnect; end; end; end;