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

メールでの半角カナの送信

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

【解決したい問題】

MailMessageクラスとSmtpMailクラスを使ってメールの送信をしようとしています。
訳ありで、送信する本文に半角カナ文字を含めざるを得ず、
Dim mm as MailMessage
..
mm.BodyEncoding = GetEncoding("Shift-JIS")
として送信を試みたのですが、本文中の半角カナ文字が全て全角カナへ変換されてしまいました。
半角カナを半角のまま送信する方法は無いでしょうか?

【解決するために何をしたか】

まず、MailMessageクラスのBodyへ渡される文字列中の半角カナ文字が確かに半角である事を確認しました。
それから自分のメールアドレスへ送信を行い、受信したメールの本文にあるべき半角カナ文字が全角カナに変換されている事を確認しました。
ウイルスチェッカーやメールサーバによるメールスキャンで文字が変換された可能性も否定できないため、比較対象としてOutlook2003で送信のエンコードをシフトJISにして同様の本文を送信したところ、今度は半角カナ文字がそのまま送信されました。

【追加事項】

GetEncoding("Shift-JIS")の戻り値を調べると、BodyNameやHeaderNameなどのプロパティに"shift-jis"ではなく"iso-2022-jp"という文字列が設定されていました。
確か、"iso-2022-jp"だと半角カナ文字が定義されないため、内部で自動的に全角カナに変換されているのでは無いかと想像しています。
しかし、これらのプロパティは書き込み不可のため変更することが出来ません。
> GetEncoding("Shift-JIS")の戻り値を調べると、BodyNameやHeaderNameなどのプロパティに"shift-jis"ではなく"iso-2022-jp"という文字列が設定されていました。
> 確か、"iso-2022-jp"だと半角カナ文字が定義されないため、内部で自動的に全角カナに変換されているのでは無いかと想像しています。
> しかし、これらのプロパティは書き込み不可のため変更することが出来ません。

 でしたら、 Encoding クラスを継承したクラスを作成して GetEncoding("Shift-JIS") で取得したオブジェクトのラッパとして振舞うようにしてみては如何でしょう?
 BodyName プロパティと HeaderName プロパティの返す値だけ変えてあげれば上手くいくかも知れません(未検証)
#内部的にどのような使われ方をしているか判りませんので、徒労に終わるかもですけど(^_^;)
> 訳ありで、送信する本文に半角カナ文字を含めざるを得ず、

UTF-8 を採用する……というのは駄目でしょうか?
■No11164に返信(魔界の仮面弁士さんの記事)
> UTF-8 を採用する……というのは駄目でしょうか?

ありがとうございます。
さっそく試してみました。

まず、CCで自分に送ったメールを受信。
しっかり半角なので大丈夫かも・・・
すると送り先システムからエラーメールを受信。
残念ながらUTF-8を認識しないようです。(UTF-7でも駄目でした。)
■No11162に返信(深山さんの記事)
>  でしたら、 Encoding クラスを継承したクラスを作成して GetEncoding("Shift-JIS") で取得したオブジェクトのラッパとして振舞うようにしてみては如何でしょう?
>  BodyName プロパティと HeaderName プロパティの返す値だけ変えてあげれば上手くいくかも知れません(未検証)

アイデアのご提供ありがとうございます。
その手は思いつきませんでしたので一度やってみようと思います。
ちょっと検証に手間がかかりそうなので結果の報告はまた後日ということで・・・

> #内部的にどのような使われ方をしているか判りませんので、徒労に終わるかもですけど(^_^;)

確かにそうですね。
最悪の場合、上記のプロパティだけでなくGetString, GetEncoder, GetDecoder等のメソッドもオーバーライドする必要があるかもしれません。
もしそうなったらOutlookをShift-JISエンコードモードにしておいて、プログラムからCOMインターフェイス経由で操作して送信した方がずっと楽でしょうし・・・
(負荷に対する耐久性が心配ですが。)

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