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']
最終的に Indyのソースをいじるわけですが
インストール時のソースを変更しても変化しませんし、パッケージをコンパイルしなおす場合、変更による他アプリケーションへの影響も気になります
という事でピンポイントで変更するため、Indyのソースから該当のファイルを取り出して、プロジェクトのディレクトリへコピーします
具体的には(今回の場合) Indyのソースディレクトリ
C:\Program Files (x86)\Embarcadero\Studio\[バージョン]\source\Indy10\Protocols
から
IdCoderHeader.pas
IdCompilerDefines.inc
をプロジェクトディレクトリへコピーして、都合の良いソースに書き換えます
MaxEncLen を大きな数字にするか、該当の箇所をコメントアウトします
これは、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のソースディレクトリ
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 が優先して読み込まれて、今回のみ変更が反映されるという具合です
コメント