平衡点
2011/05/09
_ 快適なメール環境の構築(1/n): offlineimap の設定
最近になって Wanderlust + offlineimap + offlineimap-el (+ epa) で, ようやく幸せな気分になったので, そのメモを残しておこうかと (というか, 周りで Gmail + Wanderlust な人がけっこういるので, 参考になったら良いなぁ, とか).
offlineimap
まずは offlineimap の設定のお話.
多くの MUA では, IMAP サーバとのやりとりの際に, メール全文を取得せずヘッダのみを取得してスレッド表示させたりしている (Wanderlust もそうですね), これだとネットワーク接続が無い場合にメール本文が取得できないし, 検索するのも具合が良くない.
offlineimap は, その名前の通り IMAPサーバ上のメールと local の Maildir を同期してくれるソフトウェア. local の Maildir でメールの振り分け(ファイルの移動)や メールの削除(Trash への移動, 削除)などを行なうと, その結果を IMAP サーバと同期してくれる. 当然 IMAP サーバ側でメールを操作していても, 同期時にそれを反映してくれる.
Debian の場合, install は
$ apt-get install offlineimap
で OK.
設定例は /usr/share/doc/offlineimap/examples/offlineimap.conf.gz にあるので
$ zcat /usr/hare/doc/offlineimap/examples/offlineimap.conf.gz \ > ~/.offlineimaprc
とでもしてから .offlineimaprc を編集すれば良い. 注意すべきは "[Gmail]/All Mail" を同期しないようにすることかな(しても良いけどエライ時間かかるし, あんまり見ないでしょ?).
設定例は例えば如何の通り
[general] metadata = ~/Mail/.offlineimap accounts = Gmail [Account Gmail] localrepository = LocalGmail remoterepository = RemoteGmail [Repository LocalGMail] type = Maildir localfolders = ~/Mail/Gmail restoreatime = no [Repository RemoteGmail] type = Gmail remoteuser = [gmail のメールアドレス] realdelete = no nametrans = lambda foldername: re.sub('^\[Gmail\]/Starred', 'Starred', re.sub('^\[Gmail\]/Spam', 'Spam', foldername)) folderfilter = lambda foldername: foldername not in ['[Gmail]/All Mail', '[Gmail]/Trash','[Gmail]/Sent Mail','[Gmail]/Drafts']
この設定では
- offlineimap のメタデータは ~/Mail/.offlineimap 以下に格納
- メールは ~/Mail/Gmail 以下に格納(複数アカウント用に)
- [Gmail]/All Mail, [Gmail]/Trash, [Gmail]/Sent Mail, [Gmail]/Drafts は同期しない
となっている.
この設定で offlineimap を走らせるとパスワードの入力待ちになるので, 適宜入力して同期が終わるのを待つ. maxconnection とか適宜設定しておくと, スレッド並列で同期しはじめるので, 初回には良いかもしれない.
他の Gmail アカウントや他の IMAP サーバとの同期設定も必要ならしておくと良い.
パスワード管理
examples にある offlineimap の設定例でも述べられているけれど, offlineimaprc 内に password を書くことも可能.
以下は gpg で暗号化したファイル内にパスワードを書いておく場合の設定. 以下の python スクリプトを適当な場所に置いておく. (ここでは ~/bin/offlineimap_auth.py とする).
#!/usr/bin/python import re, os def get_authinfo_password(machine, login, port): s = "machine %s login %s password ([^ ]*) port %s" % (machine, login, port) p = re.compile(s) authinfo = os.popen("gpg -q --no-tty -d ~/.offlineimap-pass.gpg").read() return p.search(authinfo).group(1)
.offlineimap-pass.gpg がパスワードが書かれたファイル. 適宜場所や名前を好みに合わせて変えると良い. ファイルの形式は netrc と同じで
machine [IMAPサーバ名] [認証方式] [アカウント名] password [パスワード] port [ポート番号]
例えば Gmail であれば
machine imap.gmail.com login [Gmail のメールアドレス] password [パスワード] port 993
で ok. 認証方式は login 以外は試していない(cram-md5 とかできるのかしらん).
でもって, 実際には
[general] metadata = ~/Mail/.offlineimap accounts = Gmail # パスワードを読みだす python スクリプト pythonfile = ~/bin/offlineimap_auth.py ... - snip - ... [Repository RemoteGmail] type = Gmail remoteuser = [gmail のメールアドレス] remotepasseval = get_authinfo_password("imap.gmail.com", [gmailのメールアドレス], 993) ...
としておくと, offlineimap を動作させる際に gpg でファイルの複合を行なうことになる.
予定
パスワード管理に gpg を使っているので cron で同期させる事はできないのだけれど
- Emacs には epa があるので gpg ファイルを透過的に扱える.
- gpg-agent でも良いけれどね.
- offlineimap-el という emacs lisp がある.
というわけで, 次はその話.
_ Wiki の導入...?
お仕事で, Redmine 上の Wiki にドキュメントを書いてもらっていたりする. 記法は Markdown なのだけれど, いざドキュメントを Fix して公開する段になって, 欲が出てきてちょっと困っていたり.
どうするかな...
- LDAP 認証に対応.
- 閲覧, 追記修正も認証ユーザのみ.
- Markdown Extra 記法に対応
している Wiki ってないもんだろうか. Hiki の パーサを弄るのが一番早いかしらん...