Partager via


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);

   }