SmtpClientで日本語(JIS)が化ける
なんなんでしょうね、またもやこれで日本語版というのはおかしい、という仕様ですが...。
System.Net.Mail.SmtpClientでメールを送信する際に、ふつうにMailMessageを作成して送信すると、まず文字コードがデフォルトでUTF-8になります。
まぁ、それはご愛敬でもいい(良くないが...)。ちゃんとMailMessageオブジェクトにBodyEncodingとSubjectEncodingプロパティがあるのでEncoding.GetEncoding("iso-2022-jp")して突っ込んでやると...。
化け化けです。いや、それが読めるメーラーもあるんだろうけど、それじゃケータイで受信できんのですよ...。
細部までは追ってないのですが、結論としては、JISを指定したメールでContent-Transfer-Encodingがquoted-printableになっている、ということらしい。↓おがわみつぎさんによるサンプルと解説。
[.NET 2.0]日本語(ISO-2022-JP) を Content-Transfer-Encoding: 7bit で送信する方法
http://blogs.sqlpassj.org/mitsugi/archive/2006/02/23/16237.aspx
日本語(ISO-2022-JP)で Content-Transfer-Encoding を 7bit
http://vsug.jp/tabid/63/forumid/51/postid/2870/view/topic/Default.aspx
とりあえず、手元で本文は問題なかったので
SmtpClient client = new SmtpClient(); Encoding enc = Encoding.GetEncoding("iso-2022-jp"); using (MailMessage message = new MailMessage(from, to)) { message.Body = body; message.BodyEncoding = enc; message.Subject = String.Format("=?{0}?B?{1}?=" , enc.HeaderName , Convert.ToBase64String(enc.GetBytes(subject), Base64FormattingOptions.None)); // message.Subject = subject; // message.SubjectEncoding = enc; client.Send(message); }
という感じにしてみました。
MembershipのCreateUserWizardコントロールとかメール送信機能あった気がするけど、だいじょうぶなのかな? 使ってないからいいけど。