SmtpClient にて、メールを送信するときに、SubjectEncoding を "iso-2022-jp" と指定した場合、Qエンコードが使用されメールが送信されるようです。
Qエンコードに対応してるクライアントソフトでは特に文字化けの問題は起きないのですが、たとえば OSX の標準メールクライントでは文字化けを起こしてしまいます。
.NET 4 までは、対象文字列を以下の様なメソッドでエンコードしてあげれば問題がなかったのですが
public string EncodeSubject(string subject)
{
Encoding enc = Encoding.GetEncoding("iso-2022-jp");
string strBase64 = Convert.ToBase64String(enc.GetBytes(subject));
return string.Format("=?{0}?B?{1}?=", "iso-2022-jp", strBase64);
}
それでも文字化けを起こしていたので困っていました。
いろいろと調べてみると、
.NET Framework 4.5 の System.Net.Mail で日本語の件名を ISO-2022-JP の Base64 でエンコードして送信する方法
を発見。
どうやら、.NET 4.5 内部の実装の変更があったようで、それで上記の(ような)コードでも文字化けを起こしてしまうそうです。
これを解決するには、以下のように2重にエンコードしてあげれば、Bエンコードでの送信ができるようになるそうです。
msg.Subject = EncodeSubject(EncodeSubject(subject));
見た目的にちょっとあれですが、これで文字化けを回避することができました。
ちなみに
Bエンコードは
主にメールヘッダのエンコードに使われます。encoded-wordのことをいう場合もありますが、encoded-textを指す場合はBase64と同じです。
Qエンコードは
主にメールヘッダのエンコードに使われます。
8bitデータを「=nn」(nnは16進数の文字コード。大文字で表記)にするという変換はQuoted-printableと同じですが、ヘッダという特殊な場所で使われるので、エンコードすべき文字が多くなります。
半角スペースは「」(あるいは=20) にします。「=?」以外の文字はそのまま書かれることになりますが、タブ改行はエンコードします。
()で囲われたコメント部分で使う時は「()」もエンコードします。
phrase内の単語、例えばFrom, To, Ccヘッダのaddressに先行する部分で使う時は、アルファベットと数字、「!*+-/」以外の文字はエンコードします。
Quoted-printableの省略呼称として使われることもありますが、厳密に言えば違います。
だそうです。
Exchange ブログ JAPAN さん、Web&Mail&Mac講座さん助かりました!