読者です 読者をやめる 読者になる 読者になる

System.Net.Mail.SmtpClientでケータイへメール送信すると文字化けする

C# .NET

ぐぐってみるとみなさん苦労されているようで、参考になるページがいっぱいあります。

で、結局おがわみつぎ様のブログのエントリを参考にして下記のようにしてみました。

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Net.Mail;
using System.Net.Mime;
using System.IO;

namespace BabyDaemons
{
    class Jis7BitsMail
    {
        private SmtpClient client;

        public Jis7BitsMail(string host)
        {
            this.client = new SmtpClient(host);
        }

        public void send(string subject, string from, string to, string body)
        {
            using (MailMessage mailMessage = new MailMessage(from, to))
            {
                // HTML メールではない
                mailMessage.IsBodyHtml = false;

                // バイト配列化
                Encoding encoding = Encoding.GetEncoding("iso-2022-jp");
                body = Regex.Replace(body, "(\r)?\n", "\r\n", RegexOptions.Multiline);
                byte[] buffer = encoding.GetBytes(body);

                // バイト配列をメモリストリームに格納
                MemoryStream memoryStream = new MemoryStream(buffer);
                // 代替表示クラス生成
                AlternateView alternateView = new AlternateView(memoryStream, new ContentType("text/plain; charset=" + encoding.HeaderName));
                // Content-Transfer-Encoding を7bit にする
                alternateView.TransferEncoding = TransferEncoding.SevenBit;
                // メッセージに代替表示を追加
                mailMessage.AlternateViews.Add(alternateView);

                // メール本文は空にする
                mailMessage.Body = "";

                // 表題を=?言語名?B?base64 文字列?= 形式に変換
                string base64Subject = Convert.ToBase64String(encoding.GetBytes(subject), Base64FormattingOptions.None);
                mailMessage.Subject = String.Format("=?{0}?B?{1}?=", encoding.HeaderName, base64Subject);

                client.Send(mailMessage);
            }
        }
    }
}

お手軽にアットマーク・アイティの記事の通りにしててもGmailでは問題なく読めてたので安心してたのですが、ケータイに送ったとたん文字化けしてて半日くらいはまりました。ほかのページで裏取りしなかった自分が悪いんですけど。orz