Ubuntu Weekly Recipe

第247回Offlineimap+Dovecotによる快適メール環境

皆さま、はじめまして。佐々木洋平と申します。普段はDebian JP Project/関西Debian勉強会のメンバーとして主に関西方面で活動しており、Ubuntu Japanese Teamの皆さんとも親しく交流しております。そのご縁もあって、今回のUbuntu Weekly Recipeを執筆することになりました。よろしくお願いします。

さて、早速今回のお題について。

近年のモバイルネットワークの普及によって、いつでもどこでもネットワークに繋がっているような錯覚を覚えがちですが、まだまだネットワークに繋がらない状況で作業しなければならないことも多いかと思います。そんな時に「○○みたいな連絡あったと思うんだけど」とか、⁠そういえば△△さんから□□の詳細について添付してもらっていた気がするんだけど」といったように自分のメールを検索したくなることがありませんか?

今回は「手元にメールをすべて保管しておいてオフラインでも幸せになる」ためのいくつかのソフトウェアを紹介します。

OfflineImapでメールサーバと同期を取る

OfflineImapは、ネットワーク上にあるIMAPサーバと手元のMaildir/IMAPサーバの同期を取るためのソフトウェアです。IMAPはメールを読むための通信方式の一つで、サーバ上に複数のメールボックスを用意して、既読/未読/振り分けをサーバ上に管理します(これに対して、すべてのメールを単一のメールボックスに保管する方式をPOPと言います⁠⁠。Maildirはメールの保管形式で「1メールボックス1ディレクトリ⁠⁠、⁠1メール1ファイル」でメール管理します(これに対して、1メールボックス1ファイルの形式をmboxと言います⁠⁠。OfflineImapを使うことでIMAPサーバ上のメールボックスと手元のMaildir形式のディレクトリを同期することができます。単なるバックアップとしても使えますが、手元のMaildirディレクトリに変更があった場合は、その変更をIMAPサーバ側へ反映させることもできます。

OfflineImapの導入

それでは実際に試してみましょう。OfflineImapはUbuntuではuniverseに収録されているソフトウェアですのでお好きな方法でインストールしてください。

以下ではapt-getでインストールしてみます。

$ sudo apt-get install offlineimap

OfflineImapをインストールすると/usr/share/doc/offlineimap/examples/以下に設定のサンプルが配置されます。今の所OfflineImapにはGUIによる設定画面はありませんが、ドキュメント(英語ですが)充実しているので、設定に迷ったら参照してみてください。

OfflineImapの設定

続いて、IMAPサーバ上のメールボックスと同期してみます。ここでは、IMAP接続を有効にしたGmailのメールボックスを手元に持ってきて同期を取ってみます。

OfflineImapの設定ファイルは~/.offlineimaprcです。とりあえず次の内容を記述してください。

[general]
metadata = ~/.offlineimap
accounts = Gmail

[Account Gmail]
localrepository = localGmail
remoterepository = remoteGmail

[Repository localGmail]
type = Maildir
localfolders = ~/Maildir/

[Repository remoteGmail]
type = Gmail
remoteuser = 'Gmail のアドレス'
folderfilter = lambda foldername: foldername in ['INBOX']

これにより、次の事柄を設定しています。

  • [general]で、アカウント「Gmail」の同期
  • [Account Gmail]で、ローカル/リモートの情報にそれぞれlocalGmail/remoteGmailという名前をつける
  • [Repository localGmail]で、ローカルの保存先と保存形式の設定
  • [Repository remoteGmail]で、リモートサーバの形式、ユーザ名、同期するメールボックスの設定

上記設定例を~/.offlineimaprcに記述した後に、ターミナル上でofflineimapコマンドを実行します。

$ offlineimap
OfflineIMAP 6.3.4
Copyright 2002-2011 John Goerzen & contributors.
Licensed under the GNU GPL v2+ (v2 or any later version).

Account sync Gmail:
 ***** Processing account Gmail
 Copying folder structure from Gmail to Maildir
 Establishing connection to imap.gmail.com:993.
 remoteGmail: Enter password:

パスワードが聞かれますのでGmailのパスワードを入力してください。正しく認証できるとメールの同期が始まります。

毎回パスワードを入力するのが面倒な場合には、設定例の[Repository remoteGmail]を次のように変更し、パスワードを書いておきます(ファイルのパーミッションに注意してください⁠⁠。

[Repository remoteGmail]
type = Gmail
remoteuser = 'Gmailのアドレス'
remotepass = 'Gmailのパスワード'
folderfilter = lambda foldername: foldername in ['INBOX']

フォルダの指定をどうするか?

すこし面倒なのはフォルダ名の指定かもしれません。最初の設定例での

folderfilter = lambda foldername: foldername in ['INBOX']

は、Gmailの「受信トレイ」のみを同期する設定です。

他にも同期したいフォルダがある場合には、適宜追加していくことになります。もしくは、特定のフォルダのみを同期しない場合には次のように記述します。

folderfilter = lambda foldername: foldername not in ['[Gmail]/&MFkweTBmMG4w4TD8MOs-']

この暗号の様な文字列[Gmail]/&MFkweTBmMG4w4TD8MOs-が曲者かもしれません。

IMAPではフォルダ名に修正UTF-7というコーディングを使っています。上記の例にある&MFkweTBmMG4w4TD8MOs-は、⁠すべてのメール」の修正UTF-7での表現です。Gmailを英語版のみで使っている場合には、この問題(?)は発生しませんが、Gmailを日本語で使っている場合や、他のIMAPサーバでも振り分け先に日本語(正確には英語以外)を使っていると、OfflineImapでの同期フォルダ名の指定は修正UTF-7で記述しなければなりません。参考までに、Gmailでデフォルトで存在する日本語フォルダ名の修正UTF-7での表現を記載しておきます(もっとも、Gmailはラベル毎にIMAP接続を使うか選択できますので、IMAPで使用しないラベルはIMAP接続をOffにしておくのも良いかもしれません⁠⁠。

'[Gmail]/&MLkwvzD8TtgwTQ-'       # スター付き
'[Gmail]/&MLQw33ux-'             # ゴミ箱
'[Gmail]/&kAFP4W4IMH8w4TD8MOs-'  # 送信済み
'[Gmail]/&Tgtm+DBN-'             # 下書き
'[Gmail]/&MFkweTBmMG4w4TD8MOs-'  # すべてのメール

日本語フォルダ名の修正UTF-7での表現は、例えばiconvを使うことで得られます。

echo "スター付き" | iconv -t UTF-7
+MLkwvzD8TtgwTQ

先頭の"+"を"&"にして末尾に"-"をつけることで、OfflineImapでのフォルダ指定に使用できます。

Maildir形式の「ディレクトリ」を直接扱えるMuttやGnusなどを使いたい場合には、フォルダ名の修正(UTF-8への変換)したほうが便利ですが、⁠後述のDovecotのように)手元でIMAPサーバを起動し、そのIMAPサーバ経由でメールを読み書きする場合にはフォルダ名を変更しないほうが良いでしょう。

OfflineImapには他にも高速化のための設定や、同期の際の接続数の指定などといった細かい調整が可能です。また、自分でPythonのスクリプトを書いて「フィルタ」として動作させることも可能です。詳細はドキュメントを参照してください。気にいった設定ができあがるまで、何度も同期設定を試してみるのも良いでしょう。その際には、手元の同期先フォルダとOfflineImapのメタデータ(上記設定例では~/Maildir/~/.offlineimapを削除するなどして、サーバ側に試行錯誤の結果が同期されない様に注意してください。

Dovecot

さて、OfflineImapによって、手元にIMAPメールサーバ上のメールが同期できたとします。次はこれを使い慣れたメールソフトウェア(Mail User Agen; MUA)から使うための方法を考えます。

MuttやWanderlustといったMUAはMaildir形式のディレクトリを直接扱うことができます。しかしながら、ThunderbirdやEvolutionなどのMUAはMaildir形式を直接扱うことができません。そこで、手元でIMAPサーバを上げてOfflineImapで同期したメールを読めるようにします。IMAPサーバには幾つか選択肢がありますが、ここでは設定が比較的簡単で、IMAPサーバ側での「検索」をサポートしているDovecotを使ってみることにします。

そう、手元でDovecotを上げておけば、メールの「検索」ができるようになるのです!

Dovecotの導入

DovecotはIMAPサーバだけではなくPOPサーバとしても動作します。また、バックエンドにリレーショナルデータベースを使用することもできる高機能なサーバソフトウェアです。今回は手元でIMAPサーバを起動するだけですので、その機能を中心にインストールと設定を行ないます。

DovecotはUbuntuではmainに収録されているソフトウェアですので、OfflineImap同様にお好きな方法でインストールしてください。ここではIMAPの機能のみが欲しいのでdovecot-imapdのみをインストールします。

sudo apt-get install dovecot-imapd

設定が終わると手元でdovecotが起動します。

dovecot-imapdの設定

OfflineImapで同期したMaildirをdovecot-imapd経由で扱うために、幾つか設定を行ないます。設定ファイルは/etc/dovecot/以下にまとまっています。

先ずはMaildirの場所を指定します。/etc/dovecot/conf.d/10-mail.confmail_locationをOfflineImapでの同期先に書き変えます。

...
mail_location = maildir:%h/Maildir:INBOX=%h/Maildir/INBOX:LAYOUT=fs
...

次に接続先です。/etc/dovecot/conf.d/10-master.confのimap/imapsの部分を修正します。

ここではIMAP接続(143番)を有効にします。

...
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    # port = 993
    # ssl = yes
  }
...

最後に、接続先を限定します。/etc/dovecot/dovecot.confを修正し、localhostのみで接続を受けつけるようにします。

...
listen = 127.0.1.1, ::1
...

以上が終わったらdovecotを再起動します。

 sudo service dovecot restart

以上で設定は終了です。お使いのMUAで、次のように設定して接続してみてください。

  • 接続先:localhost
  • ポート番号:143
  • SSL接続:無し

ユーザ名とパスワードは手元のUbuntuにログインする際のユーザ名とパスワードです。

...いかがでしょう? OfflineImapで同期したメールが見えましたか? 見えたならメールの「検索」も試してみてください。筆者はMUAとしてEmacs上のWanderlustでメールの読み書きをしていますが、手元でdovecotが動作しているのでメールの検索が非常に簡単に行なえるようになり、とても快適になりました。

まとめ

これでOfflineImap+Dovecotによるメール環境は完成しました。あとはOfflineImapをCRONなどで定期的に実行することで、リモートのIMAPサーバと手元のMaildirの状況をその都度同期することが可能になります。MUAは常にローカルのDovecotを見に行くため、ネットワークに繋がっていない時でも(既存の)メールを確認できますし、MUAがIMAPの検索をサポートしていれば、オフラインでも(既存の)メールの閲覧/検索ができます。また、メールの振り分けや未読/既読/フラグ付けも手元のDovecotとやりとりして行ないますので、体感速度は向上するでしょう(実際にはすべてをOfflineImapに丸投げしているわけですが⁠⁠。

以上、簡単ですが「手元にメールをすべて保管しておいてオフラインでも幸せになる」ための「OfflineImap+Dovecot」の設定でした。

おすすめ記事

記事・ニュース一覧