Neutral Scent

App developments & Gadgets

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コントロールとかメール送信機能あった気がするけど、だいじょうぶなのかな? 使ってないからいいけど。