カテゴリー別アーカイブ: lazarus

Lazarus Indy Smtp 日本語対応 IdMessage1InitializeISO

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;