DOBON.NET DOBON.NETプログラミング掲示板過去ログ

auスマートフォンにメールした時の本文文字化け

環境/言語:[VB2005 NETFramework2.0]
分類:[.NET]

以下のソースでHTML形式のメール送信していますが、
(当然、text/plain 形式も組み込んでいます)

Dim curClient As New SmtpClient(strSMTPHostName, 25)
Dim msgTest As MailMessage
msgTest = New MailMessage(strMailFrom, strTo)

'text/plain 形式の追加(Shift_JIS形式にする)
Dim textView As System.Net.Mail.AlternateView
textView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(strTextMsg, _
           System.Text.Encoding.GetEncoding("Shift_JIS"), System.Net.Mime.MediaTypeNames.Text.Plain)
msgTest.AlternateViews.Add(textView)

'HTML形式の追加(Shift_JIS形式にする)
Dim htmlView As System.Net.Mail.AlternateView
htmlView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(strHTMLMsg, _
           System.Text.Encoding.GetEncoding("Shift_JIS"), System.Net.Mime.MediaTypeNames.Text.Html)
msgTest.AlternateViews.Add(htmlView)

'メール送信
curClient.Send(msgTest)

宛先である、strTo が au携帯のメールアドレスの場合は、
Shift_JIS形式なのでHTML本文が文字化けしませんが、
au携帯のスマートフォンメールアドレスでは、
Shift_JIS形式であるにもかかわらず、HTML本文が文字化けする
現象が発生しました。

au携帯のスマートフォンメールアドレスにメール送信する際、
本文がShift_JIS形式で送信しても、HTML本文が文字化けする原因について
教えていただけませんでしょうか?
# 検証せずに回答しています。

■No29103に返信(kaneさんの記事)
> htmlView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(strHTMLMsg, _
> System.Text.Encoding.GetEncoding("Shift_JIS"), System.Net.Mime.MediaTypeNames.Text.Html)

strHTMLMsg 内にある HTML データには、meta タグによる
charset 指定は含まれているのでしょうか?


> Shift_JIS形式であるにもかかわらず、HTML本文が文字化けする
> 現象が発生しました。
切り分けが必要かも。

(1) サーバーへ送信されたデータ自体に問題がある?
(2) サーバー側で何らかの変換が行われており、
 端末側で受信した時点で化けている?
(3) 端末側のアプリの問題で、表示上の文字化けが発生している?


> Shift_JIS形式なのでHTML本文が文字化けしませんが、
そのメールを、スマートフォンに転送した場合は化けますか?
あるいは逆に、スマートフォン側から転送してもらった場合はどうですか?


> au携帯のスマートフォンメールアドレスにメール送信する際、
WindowsPhone でも Android 系でも同様ですか?
メールメッセージは正しいけれども、スマートフォンのメーラーが正しく解釈
できない。または、メールメッセージの情報に齟齬があって、スマートフォン
のメーラーが正しく解釈できない。そのあたりを突き詰める必要があるのだと
思います。

送信時のメールメッセージの情報に齟齬があるという特殊な状況を想定したば
あいの話なのですが、プログラムですこし気になるところがあります。

Shift_JISを扱うEncodingオブジェクトのBodyNameプロパティはiso-2022-jpを
返します。AlternateView.CreateAlternateViewFromStringメソッドの引数に
Encodingオブジェクトを指定するばあい、AlternateViewオブジェクトは
EncodingオブジェクトのBodyNameプロパティを参照してメールメッセージの
Charsetを出力します。

Dim textContent As String = "わんだほ"
Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Dim plainType As String = System.Net.Mime.MediaTypeNames.Text.Plain
Dim textView As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString _
    (textContent, sjis, plainType)

たとえば上記のようにAlternateViewを構成したばあい。

Content-Type: text/plain; charset=shift_jis
Content-Transfer-Encoding: quoted-printable

=82=ED=82=F1=82=BE=82=D9

期待される出力は上ですが、実際の出力は下です。

Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: quoted-printable

=82=ED=82=F1=82=BE=82=D9

本文がiso-2022-jpでエンコードされているということをcharsetは表しますが、
実際にはShift_JISで本文はエンコードされています。charsetと実際のエンコ
ードの間に齟齬があります。

実際のエンコードにcharsetを合わせるか、または、charsetに実際のエンコー
ドを合わせればよいと思います。

Dim textContent As String = "わんだほ"
Dim textContentType As New System.Net.Mime.ContentType()
textContentType.MediaType = System.Net.Mime.MediaTypeNames.Text.Plain
textContentType.CharSet = "shift_jis"
Dim textView As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString _
    (textContent, textContentType)

Dim textContent As String = "わんだほ"
Dim iso2022jp As System.Text.Encoding = System.Text.Encoding.GetEncoding("iso-2022-jp")
Dim plainType As String = System.Net.Mime.MediaTypeNames.Text.Plain
Dim textView As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString _
    (textContent, iso2022jp, plainType)
もりおさん、以下のように
実際のエンコードにcharsetを合わせる方法で解決しました。
(スマートフォンの文字化け解決しました)

> Dim textContent As String = "わんだほ"
> Dim textContentType As New System.Net.Mime.ContentType()
> textContentType.MediaType = System.Net.Mime.MediaTypeNames.Text.Plain
> textContentType.CharSet = "shift_jis"
> Dim textView As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString _
> (textContent, textContentType)

どうもありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板