SyntaxHighlighter

2016年2月13日土曜日

Outlook 2010 で外部エディタでメールを編集するマクロ

Outlook 2010 で外部エディタでメールを編集するマクロ

メーラーとして Outlook 2010 を使う場合に、メールを外部のテキストエディタで編集するマクロを作りました。
GitHub で External Editor for Outlook 2010 として公開していますので、よければお使いください。

概要

Outlook 2010 では、メールの編集画面として、 Word のような独自の編集画面が用意されています。
他のメーラーと比べて特に劣っているわけではないと思いますが、私はテキストエディタの方が使いなれているので、できれば編集は好きなエディタでやりたいです。

そこで、外部テキストエディタでメールを編集できる VBA マクロを作ってみました。

マクロの仕組み

このマクロは、 Using Vim as an External Editor with Outlook のマクロを元に、種々の変更を加えて作りました。

下記のような動作になっています。

  1. 現在アクティブなメールエディタの本文を、指定されたディレクトリの下に一時ファイルとして保存する。
  2. そのファイルを引数として、外部のエディタを CreateProcess API で実行する。
  3. SetTimer API で、定期的にエディタのプロセスが終了したかどうかをチェックする。
  4. プロセスが終了したら、一時ファイルの内容をメールエディタの本文に反映させる。

元のマクロと大きく異なる部分は、上記の 3 の SetTimer で待つ部分です。

元のマクロでは、 DoEvents を呼びながらプロセスの終了を待ち続けていたのですが、この実装では、なぜか Outlook 側で他のフォルダを開くことができません。
理由はよく分かりませんが、 Outlook 2010 では、 VBA のプロシージャを抜けるまではフォルダの切り替えができないようです。
そのため、 SetTimer API で待ってみることにしました。

素朴な疑問

いつも疑問に思うのですが、 Microsoft の技術者は Outlook を使っているのでしょうか。

Outlook は一般ユーザー向けには悪くないと思いますが、あまりプログラマーに好まれるものではないように思います。
マクロ言語の VBA は、プログラミング言語として洗練されているとは言い難く、 Outlook 自体のメール仕分けも正規表現が使えないなど、プログラマが不満を持ちそうなポイントが多くあるように感じます。

誰か Microsoft の内情を知っていたら教えてください。