11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

.NET 4.5 での SmtpClient に於ける Subject が文字化けする件について

Last updated at Posted at 2015-05-21

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講座さん助かりました!

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?