mutt + gmail のための offlineimap & msmtp 設定まとめ

Linuxを使いはじめて慣れてくると、人は誰しも「何でもターミナルで完結したい」という病気にかかるものです。私はそんな折に mutt に出会いました。それ以来、かれこれ 5 年以上のつきあいにありますがいまだに設定沼から抜け出せずにいます。mutt + offlineimap は設定沼にはまりたい人に最適なメール環境です。

mutt の設定の棚卸ついでに、今まで残せていなかった設定メモを残しておこうと思います。

スポンサーリンク

mutt とは

MUAです。作者の言葉を借りると、「クソの中ではましなクソ」 (All mail clients suck. This one just sucks less.)です。Maildir 形式を直接扱えるので offlineimap と一緒に使うと幸せになれます。

このエントリーでは、mutt を使うための下準備を整えるまでの設定メモになります。mutt の設定メモは余力があればどこかでまとめようと思います。

offlineimap と msmtp のインストール

offlineimap はネットワーク上の IMAP サーバとローカルの Maildir を同期するためのソフトウェアです。とりあえずインストールします。
$sudo aptitude install offlineimap

mutt でリモートの SMTP サーバからメールを送る時に、SMTP クライアントが必要なので、msmtp をインストールしておきます。
$sudo aptitude install msmtp

offlineimap の設定

~/.offlineimaprc に設定を書きます。Gmail を使う場合は Gmail 側で IMAP 接続を有効にしておく必要があります。ちなみにGmail の IMAP 接続はフォルダ毎に設定できるので、見る必要がないフォルダの接続を切っておくなどといった運用も可能です。

[general]
ui = TTY.TTYUI
accounts = GMail

[Account GMail]
localrepository = Gmail-Local
remoterepository = Gmail-Remote

[Repository Gmail-Local]
type = Maildir
localfolders = ~/.Mail/GMail/

[Repository Gmail-Remote]
type = Gmail
remoteuser = *******@gmail.com
remotepass = ***********
realdelete = yes
ssl = yes
sslcacertfile = /etc/ssl/certs/ca-certificates.crt

realdelete を yes にしておくと、手元で削除したメールがリモートにも反映されるようになります。この辺は好みで設定してください。

offlineimap はドキュメントが結構しっかりしています。頑張って読み込んで設定沼にはまりましょう。

gmail はたまに ssl の fingerprint が変わるので、

cert_fingerprint=************

ではなく、

sslcacertfile = (pass-to-crt-file)

を使うようにしています。

私は面倒を避けるため、Gmailを英語版にして使用しています。例えばフォルダ名に日本語を使いたいような場合は、ちょっと面倒だったりします。詳しくはささき先生のレシピを読みましょう。

ここまでできたら、一度 offlineimap を動かしてみましょう。
$offlineimap

一発目はかなり時間がかかります。
localfolders に指定したフォルダに gmail が同期されるはずです。

パスワードを隠す

remotepass にパスワードを直接記述したわけですが、それだと筋が悪いので、みんなの嫌われもの keyring を使ってみることにしました。offlineimap は、.offlineimaprc から python スクリプトを呼び出せるクールな機能があります。

個人的には、フォルダマッピングとかも外の python スクリプトに出してしまう方が好みです。

python から keyring をいじりたいので、python-keyring をインストールします。
$sudo aptitude install python-keyring

次に、python から keyring に gmail のパスワードを足しておきます。
$python -c "import keyring; keyring.set_password('gmail','(アカウント名)','(パスワード)')"

※ 第一引数 ‘gmail’ と 第二引数 ‘(アカウント名)’ は パスワードを引き出すためのキーなので、何でも構いません。

keyring からパスワードを取得できることを確認しておきましょう。
$python -c "import keyring; keyring.get_password('gmail','(アカウント名)')"

パスワードが返ってくるはずです。
なお、これは msmtp からも使います。

次に、

import keyring

とだけ書かれた .offlineimap.py というファイルを用意します。

ここまでできたら、.offlineimaprc を変更します。

[general]
ui = TTY.TTYUI
pythonfile = ~/.offlineimap.py  #この行を追加
accounts = GMail

[Account GMail]
localrepository = Gmail-Local
remoterepository = Gmail-Remote

[Repository Gmail-Local]
type = Maildir
localfolders = ~/.Mail/GMail/

[Repository Gmail-Remote]
type = Gmail
remoteuser = *******@gmail.com
#remotepass = ********** # この行は削除
remotepasseval = keyring.get_password('gmail', '(アカウント名)') #この行を追加
realdelete = yes
ssl = yes
sslcacertfile = /etc/ssl/certs/ca-certificates.crt

キックスクリプト

かつて、offlineimap には刺さるバグがありました。そのバグが修正された後も刺さったという報告がちらほらあるようなので、数分毎にプロセスをチェックして、もし offlineimap が動いていたら刺さっているものとみなし、殺してから offlineimap をキックするスクリプトを動かしています。

#!/bin/bash
PID=$(pgrep offlineimap)

[[ -n "$PID" ]] && kill $PID
offlineimap -o -u Noninteractive.Quiet &>/dev/null &
exit 0

ファイルに適当に名前をつけて /usr/local/bin とかに置いて cron で 3 分毎に動かしています。

msmtp の設定

こちらも、生のパスワードを記述せず、keyring から取得するようにします。

account default
host smtp.gmail.com
port 587
protocol smtp
auth on
from *******@gmail.com
user *******@gmail.com
passwordeval python -c "import keyring; print keyring.get_password('gmail', '(アカウント名)')"
tls on
tls_nocertcheck

これで、mutt を使うための準備が整いました。

スポンサーリンク

フォローする