System.Net.Mail で ISO-2022-JP の Base64 でエンコードした件名を複数行のヘッダーで構成して送信する方法
今回は System.Net.Mail で日本語の件名を B エンコードで送信する際に複数行の Subject ヘッダーにしてメールを送信する方法についてご紹介いたします。
過去に以下の記事でも記載しました通り、System.Net.Mail の MailMessage では SubjectEncoding に "iso-2022-jp" を設定した場合には Q エンコードが使用されてメールが送信されます。
日本語の件名を B エンコードで構成されたメールにして送信したい場合、B エンコードした文字列 (.NET Framework 4.5 では二重にエンコードした文字列) を Subject に設定することで対応することができました。
Title: .NET Framework 4.5 の System.Net.Mail で日本語の件名を ISO-2022-JP の Base64 でエンコードして送信する方法
URL: https://blogs.technet.com/b/exchangeteamjp/archive/2012/10/05/3524293.aspx
なお、この方法で送信したメールの Subject ヘッダーは長い文字列の件名を指定していても 1 行で構成されて送信されます。
RFC 2822 ではヘッダーの各行は 78 文字以下が推奨 (998 文字は超えてはならない) と定義されていますので、メールの件名が長い場合には上記の方法でメールを送信すると RFC 2822 で定義されている文字数を超過する可能性があります。
本動作に関しては後述のサンプルのように Subject を設定することで複数行のヘッダーに分割してメールを送信することができます。
- 前提条件
今回の例では件名が「メール送信時の文字化け対策に関して」のメールを送信する際に Subject ヘッダーの各行に以下の文字が配置されるサンプルを記載しています。
1 行目: メール送信時の
2 行目: 文字化け対策に
3 行目: 関して
- .NET Framework 4 以前の場合
using System.Net.Mail; using System.Text; public static void SendMessage(string server) { string from = "userA@contoso.com"; string to = "userB@contoso.com"; string body = "メッセージの本文";
// Subject ヘッダーに配置する各行の文字列を個別にエンコード string str1 = EncodeMailHeader("メール送信時の"); string str2 = EncodeMailHeader("文字化け対策に"); string str3 = EncodeMailHeader("関して");
// 個別にエンコードした文字列を半角スペース (" ") で区切って結合 string subject = str1 + " " + str2 + " " + str3;
MailMessage msg = new MailMessage(from, to); msg.Subject = subject; msg.Body = body; msg.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");
SmtpClient sc = new SmtpClient(server); sc.Send(msg); }
// 「=?iso-2022-jp?B?<エンコード文字列>?=」形式に変換 public static string EncodeMailHeader(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 の場合
.NET Framework 4 以前と .NET Framework 4.5 の違いは赤字部分のみとなります。
using System.Net.Mail; using System.Text;
public static void SendMessage(string server) { string from = "userA@contoso.com"; string to = "userB@contoso.com"; string body = "メッセージの本文";
// Subject ヘッダーに配置する各行の文字列を個別にエンコード string str1 = EncodeMailHeader("メール送信時の"); string str2 = EncodeMailHeader("文字化け対策に"); string str3 = EncodeMailHeader("関して");
// 個別にエンコードした文字列を半角スペース (" ") で区切って結合 string subject1 = str1 + " " + str2 + " " + str3; 上記で用意した文字列全体を再度エンコード string subject2 = EncodeMailHeader(subject1);
MailMessage msg = new MailMessage(from, to); msg.Subject = subject2; msg.Body = body; msg.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");
SmtpClient sc = new SmtpClient(server); sc.Send(msg); }
// 「=?iso-2022-jp?B?<エンコード文字列>?=」形式に変換 public static string EncodeMailHeader(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); } |