Ruby
Emacs
org-mode
Outlook
EmacsDay 11

MS Exchange のメールを MS Outlook を使って読み書きする

More than 1 year has passed since last update.

はじめに

MS Exchange のメールを MS Outlook を使って読み書きします.

Emacs の MS Outlook 対応状況

MS Outlook のメールを Emacs で読み書きするライブラリが欲しくなったとします。そんな場合でも、自分が欲しいものは他の誰かが作っていることがほとんどです. そこで,自分で作る前に,既存のライブラリで何とかならないかを調べてみました. 既存ライブラリの情報は EmacsWiki にまとまっています.

http://www.emacswiki.org/emacs/MsOutlook

MS Exchange Server のクライアントを使う

方法その 1 は MS Exchange Server に対応済のメールクライアントを使うことです. たとえば,Gnus などがそれにあたります.しかし,これらのメールクライアントを使った場合, 「MS Outlook でメールを読み書きすること」というポリシーに反するので, この方法は採用できません.

devmail

方法その 2 は devmail というツールを使うことです.

http://davmail.sourceforge.net/

devmail は Outlook web url をプロキシする POP3/IMAP サーバです. しかし,今回目的とするサーバは MS Exchange Server なので, この方法も採用できません.

Message Outlook

方法その 3 は Message Outlook というライブラリを使うことです.

http://www.emacswiki.org/emacs/MessageOutlook

このライブラリを使えば MS Outlook を使ってメールを送ることができます. 厳密にいうと「送る直前までの作業」を実行できます.ですので,本当にメールを送信するには MS Outlook 上の Send ボタンを押す必要があり Emacs だけでメールを送れません. また,メールの受信もできないので,この方法も採用できません.

Windows Script Glue

方法その 3 は Windows Script Glue を使うことです.

http://www.emacswiki.org/emacs/MsOutlook#toc1

この Windows Script Glue は,MS Outlook に表示中のメール本文を Emacs のバッファに取り込むことができます.このメール本文を Emacs 上で編集して MS Outlook のウィンドウに反映させます. 編集対象のメールを MS Outlook に毎回表示させる作業が面倒ですし, Message Outlook と同じく Emacs だけでメール送受信を完結させることができないので, この方法も採用できません.

tcom

Windows Script Glue には Tcl 版の tcom というものもあります.

https://github.com/dholm/outlookedit

機能・欠点は Windows Script Glue と同じなので,この方法も採用できません.

結局のところ

これまでに見たライブラリは Emacs でのメール作成を実現するものでしたが, よくできている Windows Script Glue でも, MS Outlook のウィンドウに表示中のメール本文を Emacs に取り込んで編集するだけでした. 一通毎に MS Outlook と Emacs を交互に操作する必要があり, Emacs 上でのメールの読み書きにはほど遠いものでした.

Olm: 全く新しくない MS Outlook インタフェース

既存のライブラリに期待しましたが,思っていたものはありません. 仕方が無いので,自分で作ることにします.メール送受信や管理機能は全て MS Outlook 側のものを使い, Emacs 側ではそれらを操作するインタフェースを提供することにします. Emacs でメールを読み書きできればそれで十分なので,新しい試みは一切せずに, 既にあるものの設計や機能を参考にします.見た目や使い勝手は Mew/Wanderlust になるべく似せています.結果,全く新しくないメールインタフェースが誕生しました.

この全く新しくない MS Outlook インタフェースを Olm と呼ぶこととし,以下,Olm の機能について紹介していきます.

機能紹介 (1): メールを読む

~M-x olm~ を実行すると上のようなバッファが表示されます. 読みたいメールの行にポイントを合わせて, . をタイプすると, バッファが分割されメール本文が表示されます.

~p~, n, SPC などのキーは,だいたい,想像どおりの動作をするように作ってあります.

機能紹介 (2): メールを書く

~M-x olm~ で表示されるバッファのどこかで w を押すか, M-x olm-summary-write か,のどちらかを実行するとメール作成用のドラフトが用意されます.

メールを編集して C-c C-s で保存, C-c C-c で送信です.

  • ヘッダと本文との区切りが空行ではなく ---- となっていること
  • メールアドレスの区切り文字が ~,~ ではなく MS Exchange 流に ; となっていること

にだけ注意すれば,使い方の説明無しにメールを書けると思います.

Olm にはメールアドレス入力を助けるためのアドレスブック機能は用意されていません. MS Exchange を使っている環境であれば Active Directory を運用していることが普通で, メールインタフェースにアドレスブック機能を用意するのは筋が悪いと考えたからです. Active Directory を Emacs で利用するための helm source として helm-ad というものがあるので,そちらのご利用をご検討ください.

機能紹介 (3): 全員に返信・転送

新規作成以外に私がよく使う機能として「全員に返信」と「転送」とがあったので, こちらも Olm 上で実行できるようにしました. M-x olm で返信・転送したいメールの行にポイントを合わせて, A または f で,「全員に返信」または「転送」できます. 「全員に返信」または「転送」の場合,宛先と件名は変更できないようにロックされます.

機能紹介 (4): 楽々リファイル

Olm はマークとマークによるリファイルをサポートしています.使えるマークは,

  • D
  • o
  • *

です.マークの意味はだいたい想像した通りになっていると思います.

リファイル先のフォルダを選択する際には,上の図のように helm による補完が効くようになっています. MS Outlook のようにマウスを使わなくても,数ストロークでメールをリファイルできて便利です.

設計方針

このようにそこそこの機能をもつ Olm ですが,その実装は手抜きです.ここでは,その設計方針について紹介します.

設計方針 (1): Scripting Glue

全てを Emacs Lisp で書ければ最高なのですが, 残念ながら Windows 版の Emacs でも Emacs Lisp で直接 MS Outlook を直接操作することはできません. Emacs が外部コマンドとうまく連携しながら豊富な機能を実現している, という前例にのっとり,標準入出力経由で MS Outlook を操作するコマンドを作成しました.

開発に着手したのが MS の .NET Framework オープンソース化アナウンスの前だったというのもあり, コマンドは Ruby スクリプトで実現しました.Ruby の win32ole.rb というライブラリを使えば, Ruby スクリプトから MS Outlook を操作することができます.この Ruby スクリプトは,別に, olm という同名の gem として RubyGems でパッケージ化しました.Ruby 2.0.0 で動作します.

  +----------+               +--------- +              +---------+
  |          |               |          |              |         |
  |  Emacs   |               |   Ruby   |              | Outlook |
  | (olm.el) |<=[stdin/out]=>| (olm.rb) |<=[Win32OLE]=>|   App.  |
  |          |               |          |              |         |
  +----------+               +----------+              +---------+

設計方針 (2): 欲張らない・MS の流儀に従う

今回は最初からフル機能を実装せずに,私がよく使う機能から順番に実装していきました.というのも,今回は MS Outlook の存在が前提なので,未実装の機能は Outlook 側で操作すれば良いからです.このおかげで,作り始めてからすぐに動くものを用意でき, 必要に応じて継続的に改善することができました. 最終的には 8:2 くらいで Emacs に機能を移せたと思います. おかげで,Emacs 上のメーラーとして Olm をみると機能が恐しく不足していますが, その状態でも,Outlook があるのでメールを使う作業には全く支障がありません.

また,今回はインターネット標準ではなく MS の流儀に従うことにもしています. MS Exchange メールのクライアントを作るときに一番問題となるのが, MS Outlook のメール形式がインターネット標準のものとは異なることです. とりわけ,Message-ID が無いなど, ヘッダがインターネットメールとは異なるところをどうしようか迷ったのですが,おとなしく MS の流儀に従うことにしました.

MS Outlook はフォルダやメールに対して EntryID という一意な値を設定し, この EntryID をキーとしてメール・フォルダを管理しています. Olm も基本的にはフォルダ・メールの取得時には EntryID 文字列を使っています.

設計方針 (3): Mew/Wanderlust に敬意を払う

2 ペインのデザイン,マークの種類・意味,キーバインディングは Mew/Wanderlust に敬意を払い, なるべくそのままになるようにしました.見た目と使い勝手を似せることで,Mew/Wanderlust を普段使っているユーザが違和感なく使えるようにしています.

おまけ

Olm (olm.el) には org-olm.el というミニライブラリが付属します. ファイル名から想像できるように,このミニライブラリは,Org mode から MS Outlook メールへのリンクを可能とするものです.Org mode のタスクに MS Outlook のメールへのリンクを追加できるようになるので,便利です.

おわりに

MS Outlook を使って MS Exchange メールを読み書きする Emacs のインタフェースを作りました. メールの読み書きは MS Outlook が行っているため, 「メールクライアントは MS Outlook を使わなければならない」 ようなポリシーを設定している環境でも, ポリシーを破らずに Emacs でメールを読み書きできます.

最後になりますが,私は MS Outlook を使わなくなってしまったので,Olm を使うことはもうありませんし, 今後,Olm がサポート・メンテナンスされることはありません. 参考までに GitHub のリポジトリは https://github.com/tnoda/olm にありますので, 興味がありましたら,ご自由にフォークください.

サポートはできませんが,フィードバックは歓迎ですので,何かコメントがありましたら, この Qiita 記事のコメント欄までお寄せください.できる範囲で,とはなりますが,気がつけばお返事します.