C++Builder 2010のIndyでメール送信について

C++Builder 2010のTIdMessageは、プロパティのCharSetとContentTransferEncodingから、適切に文字コードを変換してエンコードしてくれるようになった。
これによって、C++Builder 2009のときのように、ISO-2022-JPに変換したバイト列をUnicodeStringに代入するという奇妙なコードが不要になった。

しかし、これによって新たに問題が生じている。

一つはWindows 2000におけるWideCharToMultiByte関数の不具合
これによって、Windows 2000ではISO-2022-JPに変換した文字は文字化けする。

もう一つは波ダッシュ問題
WideCharToMultiByte関数による変換では波ダッシュ問題が発生する。

この2つの問題は、Win32APIのWideCharToMultiByte関数が原因なので、Indyの不具合とは言えないと思う。

C++Builder 2009のときには、プログラム側で文字コードを変換しBase64エンコードをしなければならなかった。
一方で、プログラム側でこれらの問題に対応する余地があったとも言える。
C++Builder 2010ではライブラリ側が自動で変換するために、プログラム側では打つ手が見当たらない。

次の問題は、Indyのバグかもしれない。
プロジェクトオプションで、「実行時パッケージを使って構築」のチェックを外すと、
「ERangeError(メッセージ’範囲チェックエラー)」が送出される。

最後に問題が発生するサンプルコードを示す。

std::unique_ptr<TIdMessage> msg(new TIdMessage(NULL));
msg->CharSet = "ISO-2022-JP";
msg->ContentTransferEncoding = "base64";
msg->ContentType = "text/plain; charset=\"ISO-2022-JP\"";
msg->Subject = L"メールの件名"; //=> Windows2000なら件名が消える
msg->Body->Text = L"10~20"; //=> ~が文字化けする
msg->SaveToFile(ChangeFileExt(Application->ExeName, ".eml"), false);

うまい解決策があったら教えて下さい。

追記
波ダッシュ問題は、MECSUtilsのMecsMappingFix_UnicodeToJISX0208()関数を使用することで回避できます。
詳しくは「UnicodeStringの波ダッシュ問題の回避策のまとめ」をご覧ください。

コメント

  1. Pingback: C++Builder 2010のIndy10を修正してメールを送信する | 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください