2015/10/29

Delphi/Indy10 TMessage の長い Subject で文字化け(文字切れ)

Delphi Indy10 TMessage の Subject へ長い文字列を投入して、TIdSMTP 等で送信すると受信環境により、文字が途中までしか表示されない
これは、TMessage の Subjectヘッダが 75文字(エンコード後)を超えると改行されるという仕様によるもの(受信環境が Outlook や Gmail, Yahoo Mail 等は、この改行を連結してくれる)

ならば
Msg.Subject := MyBase64(ASubject);

みたいに独自のエンコードで、Base64した ASCIIを投入してやればいいのかというと、それもNG。というのも、投入したエンコード後の値が75文字を超えると、更にBase64でエンコードして、改行してくれるというお節介ぶり

では、最終的な実態である
IdMsg.LastGeneratedHeaders.Values['Subject']

プロパティへ直接投入すればよいと思ったが、Subjectプロパティからこの値が生成されるタイミング(GenerateHeaderメソッド)は、TIdSMTP では、メール送信時なので入れなおすスキが無い

最終的に Indyのソースをいじるわけですが
インストール時のソースを変更しても変化しませんし、パッケージをコンパイルしなおす場合、変更による他アプリケーションへの影響も気になります

という事でピンポイントで変更するため、Indyのソースから該当のファイルを取り出して、プロジェクトのディレクトリへコピーします

具体的には(今回の場合) Indyのソースディレクトリ
C:\Program Files (x86)\Embarcadero\Studio\[バージョン]\source\Indy10\Protocols
から
IdCoderHeader.pas
IdCompilerDefines.inc
をプロジェクトディレクトリへコピーして、都合の良いソースに書き換えます

MaxEncLen を大きな数字にするか、該当の箇所をコメントアウトします
  procedure EncodeWord(AP: Integer);
  const
    MaxEncLen = 2048;// 75;
  var
    LQ: Integer;
    EncLen: Integer;
    Enc1: string;
  begin //...
これでコンパイルを行うと、プロジェクトディレクトの IdCoderHeader.pas が優先して読み込まれて、今回のみ変更が反映されるという具合です

0 件のコメント: