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;