Ubuntu Weekly Recipe

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

この記事を読むのに必要な時間:およそ 4 分

皆さま,はじめまして。佐々木洋平と申します。普段は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を削除するなどして,サーバ側に試行錯誤の結果が同期されない様に注意してください。

著者プロフィール

佐々木洋平(ささきようへい)

Debian JP Project所属。毎月1回のペースで関西Debian勉強会を開催中(ネタも募集しております)。本業は大学の研究員。学内の計算機をすべてDebianとUbuntuにできたらどんなに楽だろう,と考えつつ日々過ごしている。

コメント

コメントの記入