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

Jisコード用いたBASE64メール送信

環境/言語:[OS : Windows XP Professional / 言語 : Visual Basic .NET / .NET Framework : 2.0]
分類:[.NET]

【解決したい問題】

はじめまして

.netの標準クラスを用いて
VB.netでJisコード用いてBASE64でメール送るには
どうすればよいでしょうか。
> .netの標準クラスを用いて
> VB.netでJisコード用いてBASE64でメール送るには
> どうすればよいでしょうか。

基本的に、System.Net.Mail(.NET 2.0 以降)または System.Web.Mail(.NET 1.1 以前)名前空間配下のクラスや定義を使うことになりますが、具体的に何をどうしたいのかがよく分からないです。

日本語の電子メールを送る場合、文字コードに JIS コード(iso-2022jp)を使用するのが通例で、その場合は BASE64 エンコードは不要です。

また、BASE64 でエンコードしたコンテンツを送信する場合、文字コードはいわゆる ASCII の範囲内に収まるので、JIS コードを使用することは無いはずです。
■No15524に返信(渋木宏明(ひどり)さんの記事)
ご回答頂き有難うございます。

現在、System.Net.Mailのクラスを用いて携帯電話に対してメールを
送ろうとした際に、ヘッダー部分が文字化けを起こすものが
一部発生しました。(本文は正常でした)

> 日本語の電子メールを送る場合、文字コードに JIS コード(iso-2022jp)を
> 使用するのが通例で、その場合は BASE64 エンコードは不要です。
発生がヘッダー部分で発生していることから
BASE64 エンコードが原因かと思い
System.Net.Mailのクラスでの
Jisコード・BASE64で送る方法を
とおもったのですが。
> 現在、System.Net.Mailのクラスを用いて携帯電話に対してメールを
> 送ろうとした際に、ヘッダー部分が文字化けを起こすものが
> 一部発生しました。(本文は正常でした)

「ヘッダー部分」とは Subject ヘッダ(=件名)等のことですか?

メッセージヘッダには 7bit ASCII 文字しか使ってはいけない事になっているので、BASE64 エンコード+αが必要です。

具体的にどんな書式で記述すればよいかは、インターネット標準の MIME 仕様で定められているとおりです。

試していませんが、例えば Subject ヘッダに関しては、MailMessage.SubjectEncoding プロパティで iso-2022jp を指定するのではだめでしょうか?
■No15540に返信(渋木宏明(ひどり)さんの記事)
度々ご返答頂き有難うございます。

> 「ヘッダー部分」とは Subject ヘッダ(=件名)等のことですか?
はい、件名になります。

>MailMessage.SubjectEncoding プロパティで iso-2022jp を
>指定するのではだめでしょうか?
MailMessage.SubjectEncodingにiso-2022jpを指定した場合、
受信側のSubjectを確認するとQエンコードの設定になっていました。
ちなみにMailMessage.SubjectEncodingにutf-8にすると
BASE64エンコードが設定されましたが、送る携帯・携帯キャリアにより
文字化けが発生するCASEがありました。
utf-8の文字コードの為かと思われます。

MailMessageクラスでは指定文字コードによりQエンコード・
BASE64エンコードが自動で設定されてしまいます。

現在のPGではPC・携帯電話に対してメールを送る為
私としては全てSubjectに関してJisコードのBASE64コード
を用いて送りたいと思っており、設定に困っております。
>>「ヘッダー部分」とは Subject ヘッダ(=件名)等のことですか?
> はい、件名になります。

最初からそう書きましょうね (^^;
本文のことなのかどうかも分からなかったです>最初の投稿

> >MailMessage.SubjectEncoding プロパティで iso-2022jp を
> >指定するのではだめでしょうか?
> MailMessage.SubjectEncodingにiso-2022jpを指定した場合、
> 受信側のSubjectを確認するとQエンコードの設定になっていました。
> ちなみにMailMessage.SubjectEncodingにutf-8にすると
> BASE64エンコードが設定されましたが、送る携帯・携帯キャリアにより
> 文字化けが発生するCASEがありました。
> utf-8の文字コードの為かと思われます。
>
> MailMessageクラスでは指定文字コードによりQエンコード・
> BASE64エンコードが自動で設定されてしまいます。

ということなんですね。

> 現在のPGではPC・携帯電話に対してメールを送る為
> 私としては全てSubjectに関してJisコードのBASE64コード
> を用いて送りたいと思っており、設定に困っております。

System.Net.Mail 配下のクラス・定義を見る限り、設定はなさそうですね。

MailMessage.SubjectEncoding に 7bit 符号(8259 でしたっけ?)を指定して、BASE64 エンコード+αした iso-2022jp 文字列を Subject に設定するしかないように思います。

BASE64 エンコードは、SOAP 系の名前空間の配下にあったような気がします。
■No15543に返信(渋木宏明(ひどり)さんの記事)

> 最初からそう書きましょうね (^^;
> 本文のことなのかどうかも分からなかったです>最初の投稿
すいませんでした。

> MailMessage.SubjectEncoding に 7bit 符号(8259 でしたっけ?)を
> 指定して、BASE64 エンコード+αした iso-2022jp 文字列を Subject に
> 設定するしかないように思います。
MailMessageのSubjectには設定値が文字列として認識されてしまうみたいで
BASE64エンコード+αしたコードがそのまま表示されてしまいました。
受信側のをへッダーコードを確認しても
「subject: =?utf-7?Q?aQBzA...(略)...Lg-?=」となっており
utf-7コードのQエンコードとして送信されておりました。

MailMessageクラス利用しての送信では難しいのでしょうか?
■No15547に返信(Turuさんの記事)

>iso-2022jp
ハイフンが抜けてるだけなんてオチは無いですか?
MailMessageを使ったことはないのでちょっとあれですが。

Encoding encoding = Encoding.GetEncoding("iso-2022-jp")
>>指定して、BASE64 エンコード+αした iso-2022jp 文字列を Subject に
>>設定するしかないように思います。
> MailMessageのSubjectには設定値が文字列として認識されてしまうみたいで
> BASE64エンコード+αしたコードがそのまま表示されてしまいました。
> 受信側のをへッダーコードを確認しても
> 「subject: =?utf-7?Q?aQBzA...(略)...Lg-?=」となっており
> utf-7コードのQエンコードとして送信されておりました。

ごめんなさい、Subject プロパティが string 型である以上、そういう動きになっちゃいますよね。

> MailMessageクラス利用しての送信では難しいのでしょうか?

ちょっと辛そうですね。

.NET 2.0 からは System.Net.Mail を使うことが推奨されていますが、実は System.Web.Mail ではこういう問題は起きなかったりします。。。
■No15556に返信(渋木宏明(ひどり)さんの記事)

> .NET 2.0 からは System.Net.Mail を使うことが推奨されていますが、
>実は System.Web.Mail ではこういう問題は起きなかったりします。。。
System.Web.Mailの使用若しくは、別Toolの使用等もふまえて
もう一度検討してみます。

色々ご教授頂き有難う御座いました。
解決済み!
>>.NET 2.0 からは System.Net.Mail を使うことが推奨されていますが、
> >実は System.Web.Mail ではこういう問題は起きなかったりします。。。
> System.Web.Mailの使用若しくは、別Toolの使用等もふまえて
> もう一度検討してみます。

試していませんが、MailMessage.Subject を指定しないで、MailMessage.Headers で Subject ヘッダを与えると、期待する動作をしたりはしないですかね?
■No15595に返信(渋木宏明(ひどり)さんの記事)

> 試していませんが、MailMessage.Subject を指定しないで、
>MailMessage.Headers で Subject ヘッダを与えると、期待する
>動作をしたりはしないですかね?
ご指摘いただきましたとおり試したところ出来ました。
受信側も確認した所下記の通りになりました。
subject: =?ISO-2022-JP?B?Gy〜(略)〜KEI=?=
下記にソースを記載致します。
色々有難う御座いました。
**********************************
Dim str As String = "変換文字"
Dim byt() As Byte

byt = System.Text.Encoding.GetEncoding("ISO-2022-JP").GetBytes(str)
Dim strConvert As String = Convert.ToBase64String(byt)

MailMessage.Headers("Subject") = "=?ISO-2022-JP?B?" _
+ strConvert + "?="
**********************************
解決済み!
>>試していませんが、MailMessage.Subject を指定しないで、
> >MailMessage.Headers で Subject ヘッダを与えると、期待する
> >動作をしたりはしないですかね?
> ご指摘いただきましたとおり試したところ出来ました。

おお、よかったですねw
ワークアラウンドとして覚えとこ (^^;

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