(.Net)mailtoの文字化け問題を何とかしようとしたけれど。

アプリケーションから mailto を使ってメーラーを起動させる仕組みを作っていたのですが、宛先や件名、本文に日本語を使った時に文字化けにハマりました。

@IT プログラムからブラウザやメーラを起動するには?を見ながら、Shift-JIS で UrlEncode をかけたのですが、mailto で立ち上がるアプリケーションを Outlook 2007 にしていると文字化けするのです。(OSは Windows Vista)

Outlook 2007 の設定で オプション → メール形式 → 文字設定オプション → malto:プロトコルでUTF-8をサポートする のチェックを外すと Shift-JIS のURLエンコードでも文字化けせずにでました。

もしくは、URLエンコードを UTF-8 にすると、Outlook 2007 では正常にでます。
しかし、それだと Windows メール(Outlook Express) や 他のメーラ(今回テストしたのはBecky!)は文字化けしました。


ということで、mailto で立ち上がるアプリケーションを取得して、それによりエンコードする文字コードを切り分けようと考えました。

調査したところ、 mailto で起動するメーラーは下記のレジストリに入っているっぽいです。
HKEY_CLASSES_ROOT\mailto\shell\open\command

確認すると、確かに値が下記のように Outlook になっています。
"C:\PROGRA~1\MICROS~4\Office12\OUTLOOK.EXE" -c IPM.Note /m "%1"

しかし、ここではっとしまいした。さっきテストで、コントロールパネル → 既定のプログラム → 既定のプログラムを設定する より、Becky! を mailto で起動するアプリに変えたはずなのに。。。
ちなみに、OS が XP だと、インターネットオプションで選択したメーラーのパスになっています。

どうやら、Vista の場合、このレジストリ項目では判断できそうにないです。
ちなみに、この項目は、mailto で開くメーラーではなく、規定のメーラー(Vistaだと、コントロールパネル → 既定のプログラム → プログラムのアクセスとコンピュータの既定の設定の値)の値を格納しているっぽいです。

あと、HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mailでも、メーラーがわかるらしいのですが、mailto で開くメーラーは分かりませんでした。(時間なかったので調査不足かも知れませんが。。)

と、思ってたら、Vista の場合、下記のレジストリに mailto で起動するソフトが設定されているっぽいです。
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\MAILTO\UserChoice
ここに、Progidという文字列値があり、mailto で開くプログラムID(?)が格納されてます。
このプログラムIDと同名のキーが HKEY_CLASSES_ROOT の直下に存在するので、そこから起動するアプリのパスが取得できます。

(XP の場合は、上記のキーはありませんでした。おそらく、Vista のように、mailto と 既定のメーラーと分けず、すべてを既定のメーラーもだけで指定してるからでしょう。)

ちなみに、手持ちのメーラーだと Progid のデータは下記のようになっていました。
Outlook2007 Outlook.URL.mailto
Windowsメール WindowsMail.Url.mailto
Opera Opera.Protocol
Becky! BeckyMail.Url.mailto


ということで、OSによって、mailto で起動するメーラーの取得が異なることが分かりました。
まとめると、
XP : HKEY_CLASSES_ROOT\mailto\shell\open\command
Vista: HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\MAILTO\UserChoice
ということになります。


これで、メーラーによってURLエンコードの文字コードを変更できると思ったのですが、すでに書いたように、Outlook2007 の場合、設定でプロトコルのUTF-8のサポートをオンオフできます。この情報を取得しない限りは、切り分けができません。
結局ここでつまってしまい、先に進めませんでした。

だれかこの情報を知ってたら提供願います。

(ここまでやったら、System.Net.Mail とか Agiletech.Net.Mail (携帯文字化け/RFC非準拠アドレス対応メールライブラリ)とか使って、SMTP送信機能実装したほうが早かったかもしれません。。。)
[PR]
by jehoshaphat | 2009-03-01 00:07 | .Net開発 | Trackback | Comments(0)
トラックバックURL : http://jehupc.exblog.jp/tb/9727243
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。


<< (JavaScript)マウス... (.Net)mailto でc... >>