.NET2.0でのメール送信と文字化けのテスト

お仕事で作った.NET2.0アプリのメール送信と文字化けのテストを行いました。さすがに文字化けのテストはテスト駆動開発というわけにもイカンので、実際に自分の目で見て確認しました。面倒だけどしょうがない。


メール送信の実装のポイントは、MailMessageクラスのEncoding関連のプロパティでした。

まずは、メール本文のエンコーディングであるBodyEncodingプロパティ。こちらはデフォルトで"us-ascii"が使用されるとのこと、そりゃ文字化けするよなぁ。。。こちらはISO-2022-JPに変更してあげることで対応できました。


一番やっかいだったのが、メール件名のエンコーディング。当初は、メール本文と同様にSubjectEncodingプロパティをISO-2022-JPに変更して試してみましたがどうしてもG-MAILで文字化けしてしまう...


いろいろ調べてみて結局おがわみつぎさんの下記ブログを参考にして、件名を自分でBASE64エンコーディングして解決しました。

おがわみつぎさんブログ
http://blogs.sqlpassj.org/mitsugi/archive/2006/02/23/16237.aspx

ちなみに最終的にこんな感じの実装になりました。

...
MailMessage email = new MailMessage(fromAddress, toAddress);
email.BodyEncoding = System.Text.Encoding.GetEncoding("csISO2022JP");
email.Subject = ConvertBase64Subject(System.Text.Encoding.GetEncoding("csISO2022JP"), "件名です");
...

internal string ConvertBase64Subject(Encoding subjectEncoding, string sourceText)
{
    string subjectFormat = "=?{0}?B?{1}?=";
    return string.Format(
        subjectFormat,
        subjectEncoding.HeaderName,
        Convert.ToBase64String(subjectEncoding.GetBytes(sourceText), Base64FormattingOptions.None)
    );
}

で、最終的にSubjectEncodingプロパティは使用しませんでした。使うとQエンコードに勝手になっちゃうので文字化けしちゃうんですよ、これが。

私が実際にテストしたメールクライアントを後世に残しておきます。。。というのは大袈裟だけど(^^;;
ちなみにHTMLメールはテストしてないのであしからず。

メールクライアント 件名 本文 備考
Outlook 2003
Outlook Express 6
Beckey V2
Thunderbird(FireFox)1.5.05 Shift-JISでは全て文字化け
Eudora 6.2J
Hotmail
Yahoo!メール
G-MAIL Shift-JISでは全て文字化け、Qエンコードでは件名文字化け
gooメール
Exciteメール Shift-JISでは件名が文字化け
Infoseekメール Shift-JISでは本文が文字化け
AU W21S 携帯メール
AU A5505SA 携帯メール
DOCOMO F901iC 携帯メール
DOCOMO 506i 携帯メール
VODAFONE 802SE 携帯メール
R25モバイルサイトフリーメール

全てのインターネットフリーメールをテストするのは無理なので、こんなところで。
結論は。

本文 -> BodyEncodingプロパティをISO-2022-JPエンコーディングを指定する
件名 -> 自分でBASE64エンコーディングしてあげる

こんなとこでしょうか。