アプリケーションから 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
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送信機能実装したほうが早かったかもしれません。。。)