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 ...