3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.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送信機能実装したほうが早かったかもしれません。。。)