DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

SmtpMailクラスでメールを送るとQuoted-Printableでエンコードされる問題の解決法

注意:ここで紹介しているコードを実際に使用する場合は、必ずSMTPサーバー、送信者、宛先などの設定を適切に変更してください。

SMTPでメールを送信する」のように、SmtpMailクラスのSendメソッドを使用してメールを送ると、メールがQuoted-Printableでエンコードされることがあります。この問題に関しては、掲示板になかさんよりご報告をいただきました(過去ログはこちら)。

SmtpMailクラスはCDOSYS(Collaboration Data Objects for Windows 2000)メッセージコンポーネントを使用してメールを送信しますが、マイクロソフトサポート技術情報412833の「[IIS]CDONTSで送信するメールがQuoted-Printableでエンコードされる」で説明されているのと同じことがCDOSYSでも起こるようです。

サポート技術情報412833での説明によると、メール本文の1行の文字数が76バイト以上になることが予想される場合、Quoted-Printableを適用し、転送時のみ75バイト以内に折り返す仕様になっているということです。さらに、半角文字と全角文字を何回か繰り返した場合もエンコードされるそうです(また同じ内容のメールであっても環境によって、エンコードされたりされなかったりすることがあるようです)。

サポート技術情報412833で提示されている解決法は、あらかじめメールの本文をチェックし、一行が75バイト以下になるように改行を入れておくというものです。

この解決法が適切なのだろうと思いますが、なかさんからのご報告では、メールメッセージの"Content-Transfer-Encoding"ヘッダを"7bit"に変更すると、Quoted-Printableエンコードされなくなったとのことです。

"Content-Transfer-Encoding"ヘッダを"7bit"に変更してメールを送信する例を以下に示します。

VB.NET
コードを隠すコードを選択
Dim mm As New System.Web.Mail.MailMessage()
'送信者
mm.From = "sender@xxx.xx.com"
'送信先
mm.To = "recipient1@xxx.xx.com"
'題名
mm.Subject = "テスト"
'本文
mm.Body = "こんにちは。これはテストです。"
'JISコードに変換する
mm.BodyEncoding = System.Text.Encoding.GetEncoding(50220)
'無理やりContent-Transfer-Encoding=7bitとする
mm.Headers("Content-Transfer-Encoding") = "7bit"
'SMTPサーバーを指定する
System.Web.Mail.SmtpMail.SmtpServer = "(SMTPサーバーを指定する)"
'送信する
System.Web.Mail.SmtpMail.Send(mm)
C#
コードを隠すコードを選択
System.Web.Mail.MailMessage mm = new System.Web.Mail.MailMessage();
//送信者
mm.From = "sender@xxx.xx.com";
//送信先
mm.To = "recipient1@xxx.xx.com";
//題名
mm.Subject = "テスト";
//本文
mm.Body = "こんにちは。これはテストです。";
//JISコードに変換する
mm.BodyEncoding = System.Text.Encoding.GetEncoding(50220);
//無理やりContent-Transfer-Encoding=7bitとする
mm.Headers("Content-Transfer-Encoding") = "7bit";
//SMTPサーバーを指定する
System.Web.Mail.SmtpMail.SmtpServer = "(SMTPサーバーを指定する)";
//送信する
System.Web.Mail.SmtpMail.Send(mm);

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。