OutlookのドラフトメールをRubyで作成する

最近、Outlookの定形メールのドラフト版を、Rubyを使って半自動的に作っている。目的は下記の通り。

  • 置換作業の削減
    例えば、毎月送信するメールを作る場合、前月分のメールを参照して宛先 (to, cc, bcc)、件名、本文をコピペした後、該当する部分のみ書き換えることが多いだろう。でも、「4月」に送付したメールを「5月」に変更して流用する際に、『件名は「5月」なのに、本文は「4月」のままになっている』変更漏れメールを送信してしまった苦い経験を持つ人は多いはずだ(でしょ?)。こんな手作業に頼るからミスは減らないのであって、スクリプトを使って機械的に文言を置換えてしまえば、全ての「4月」は必ず「5月」に置き換わる。これなら置換えミスは決して起こり得ない。
  • 手作業の削減
    コピペすれば簡単に過去メールを流用できるというのは事実だけど、それはあくまでも最終手段であって、繰り返すことが分かっている将来の作業にまで手作業を予約してしまうのは感心できない。これからも繰り返すことが分かっているのなら、少しでも自動化を図り、人間の作業を介在させないようにすべきだろう。そもそも「内容にミスがないように気をつけてメールを作成する」という無駄なことにまで気を使ってしまうから、本来注意すべき重要な作業が疎かになってしまうのだ。気を使う作業は少しでも減らしておきたい。
  • 送信前の事前確認
    SMTPを使うメールの仕組みでは全てのメールを送ってしまうので、「送信前に一旦目視で確認しておきたい」という(我がままな)要求を満たすことが出来ない。その点、Outlookならドラフトメールの状態で保存されるので、不要なメールは送信せずに捨てて良いし、必要なら変更した形で送信することも出来るし、送信するタイミングを任意に選ぶことも出来る。

動作環境

スクリプト

下記に載っているサンプルをそのまま使えば良い。

require 'win32ole'
outlook = WIN32OLE.new('Outlook.Application')
message = outlook.CreateItem(0)
message.Subject = "Hey look a subject!"
message.Body = "Yes this is dog"
message.Recipients.Add 'dog@dog.com'
message.Recipients.Add 'cat@dog.com'
message.Attachments.Add('C:\Path\To\File.txt')
#Want to save as a draft?
message.Save
What's the easiest way to send a message through Outlook with Ruby? - Stack Overflow

この例では決め打ちのテキストだけど、実際には過去のメールをテンプレートとしてテキストファイルに保存しておき、該当ファイルから必要な箇所のみ(上記の例なら送信月毎に変わる「4月」の部分)ERBで文字列を書き換えてしまえば良い。これならバッチファイルを叩くだけで「宛先 (to, cc, bcc)、件名、本文」の全てが整ったドラフトメールが一瞬で出来上がってしまう。しかも件名も本文も全て「5月」に置き換わっているのだ。これなら申し分ない。後は内容を確認して送信ボタンを押すだけなのでなかなか便利だ。この便利さに慣れてしまうと、以前のような「コピペでメールを流用作成」なんて手間のかかる作業なんて面倒臭くて嫌になってしまう。

応用

手元の環境では同じWindows上でJenkinsを稼働させており、Jenkinsのトリガーを利用してドラフトメールを自動的に作成させている。これならTODOリストに「xxxへメールを送る」という項目すら作る必要が無いわけで、注意を払うのはドラフトメールのフォルダだけになる。下記はそうやって作るメールの一例だ。

  • 毎月(毎週)決まった日に送信するメール
  • サーバ上のファイルに変更が見つかった場合に送信するメール

なお、メール作成だけではなく、添付ファイルの自動保存やToDoの作成など、OutlookRubyで操作するための豊富なレシピが下記のサイトに載っている。これを使えば、作業効率は更に上がるだろう。

少しばかりの工夫で仕事は楽できるし、時間も手間も省くことが出来る。「時間が足りない」と愚痴をこぼす人に限って、退屈なコピペを延々繰り返しているのは残念なことだと思っている。