平衡点


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 の パーサを弄るのが一番早いかしらん...


連絡先など
最近の日記
  • 2021/03/12
    • 1. Debian bullseye の初期状態での日本語入力(2)
  • 2021/02/24
    • 1. Debian bullseyeの初期状態での日本語入力
  • 2021/02/23
    • 1. rxvt-unicode 24bit color
  • 2021/02/10
    • 1. 更新: Icon font in terminal plus
  • 2021/01/16
    • 1. 年が明けてもあいかわらずの更新頻度