ichiroc subset

書きながら考える・考えをまとめる場所

Outlook のメールを org-mode の TODO に連携させる

背景

タスクはメールから発生する事が多い。

会社では、タスクは org-mode で管理して、メールは Outlook で受け取っている。 コピーペーストもいい加減面倒になってきたので、連携させた。

Outlookのタスクと連携させる (org-outlook.el)http://www.emacswiki.org/emacs/OrgOutlook なるものも有った。 しかし、あくまでメールを直接連携させたいので、自前で何とかする事にした。

想定する利用方法

  1. メール受信
  2. TODO 登録したいメールだったら、マクロ実行(キーボードショートカット)
  3. org-mode にメール本文と共に TODO 登録される
  4. org-mode 側から、Outlookのメールへジャンプ出来る

コード

マクロ

Outlook 側のマクロにModuleを追加して、コードを記述。 署名もしておかないと、デフォルトのセキュリティ設定では実行出来ないので注意。

Sub WriteToOrgFile()
    Dim orgFilePath As String
    orgFilePath = "c:\your\org\file\path.org"
    
    Dim mail As MailItem
    Set mail = ActiveExplorer.Selection.Item(1)
    
    
    Dim outlookLink As String
    outlookLink = "[[outlook:" & mail.EntryID & "][" & "Message link" & "]]"
    
    Dim orgEntry As String
    orgEntry = "* TODO " & mail.Subject & "      :outlook:" & Chr(10) & outlookLink & Chr(10) & mail.Body
        
    Dim orgFile
    Set orgFile = CreateObject("ADODB.Stream")
    orgFile.Type = 2 ' 2=text , 1=bynary
    orgFile.Charset = "utf-8"
    Call orgFile.Open
    orgFile.LoadFromFile (orgFilePath)
    orgFileBody = orgFile.readText(-1) ' -1=全行 , -2=1行ずつ
    Call orgFile.Close
    
    Set orgFile = CreateObject("ADODB.Stream")
    orgFile.Type = 2 ' 2=text , 1=bynary
    orgFile.Charset = "utf-8"
    Call orgFile.Open
    orgFile.WriteText (orgFileBody & Chr(10) & orgEntry)
    Call orgFile.saveToFile(orgFilePath, 2)    ' 2=上書き , 1=新規作成
    Call orgFile.Close
    MsgBox "[" & mail.Subject & "]" & Chr(10) & "Send to org file."
End Sub
  • Function じゃなくて Sub にしないと、Outlook のマクロのメニューに表示されないので注意。
  • クイックアクセスツールバーに登録しておけば、 Alt + 数字 で呼び出せて便利。
  • FileSystemObject はWindows31-jしか使えないので、ADODB.Stream でutf-8対応している。

レジストリ

Outlook 2010 を使用していたので、Outlook のメールを開くURLが使えない。 下記をレジストリに登録する事で、 outlook:$EntryID 形式のURLが動作するようになる。

コピペして .reg 形式で保存してダブルクリックすると楽。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\outlook]
@="URL:Outlook Folders"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\outlook\DefaultIcon]
@="\"C:\\Program Files\\Microsoft Office\\Office14\\OUTLOOK.EXE\""

[HKEY_CLASSES_ROOT\outlook\shell]
@="open"

[HKEY_CLASSES_ROOT\outlook\shell\open]
@=""

[HKEY_CLASSES_ROOT\outlook\shell\open\command]
@="\"C:\\Program Files\\Microsoft Office\\Office14\\OUTLOOK.EXE\" /select \"%1\""

elisp

outlook:$EntryID が普通のURLとして扱われなかったので、独自関数を定義して関連付け。 オリジナルは http://lists.gnu.org/archive/html/emacs-orgmode/2008-08/msg00172.html こちら。

;; outlook 形式のURLを開く
;; see http://lists.gnu.org/archive/html/emacs-orgmode/2008-08/msg00172.html
(defun org-open-outlook-url (uid)
  "Open an outlook format url"
  (interactive "sGUID: ")
  (w32-shell-execute nil (format "outlook:%s" uid)))
(org-add-link-type "outlook" 'org-open-outlook-url)

まとめ

自分の環境ではOutlookでメールを開いて Alt+2 でorg-modeに書き出される。 org ファイルを再読込させる手間が有るが、許容している。 書き出されたエントリの冒頭にある Message link の上で C-cC-o すると元のメールにジャンプ出来る。

結構便利。

会社で Windows/Outlook を使わなくていけない Emacs ユーザというニッチな分野で着実に成長してる。