mbsync/imapnotify で(ある程度)快適なメール受信環境を手に入れる

この記事は dotfiles Advent Calendar 2019 2日目の記事です qiita.com

みなさん、電子メールと呼ばれるものをご存知でしょうか
現代を生きておられる皆様におかれましては想像もつかないでしょうが、太古の昔平成という時代では、人間同士のコミュニケーションに電子メールと呼ばれるものが使われていたそうです
この電子メールというロストテクノロジーを現代に蘇えらせるため、筆を取らせていただきました

はい、というわけで CLI のメール環境の話をします
なお以下の内容とも被ってますが、その詳細版ということで...

tennashi.hatenablog.com

メールシステムの責務は多く、手元部分のみに着目しても以下のような処理が必要です

  • メールを受信する
    • メールの受信をトリガとして他の処理をする
  • メールを読む
    • メールの検索を早くするためにインデックスを張る
  • メールを作成する
  • メールを送信する

これらの要素を満たすように色々なツール群を組み合わせてメール環境を構築する必要があります
ここではメールの受信部分に注目して、どのようなツールで処理を実現するのかを見ていきます
// 本当は全部書くつもりでしたが、予想以上に長くなってしまって疲れたので...

参考までに私がどのツールを使用しているかを書いておきます

  • メール受信: isync(mbsync)/imapnotify/systemd
    • systemd は imapnotify の起動と timer で 5m 毎に mbsync を実行するため
  • メールを読む: neomutt*1
  • メールを作成する: vim*2
  • メールを送信する: msmtp*3

メールの受信

IMAP/POP クライアントが必要です
私は POP は使用していませんので IMAP に限定します

私は isync(mbsync)*4 を使ってメールを IMAP サーバから手元にダウンロードしています

IMAP はネットワーク越しにメールを読むためのプロトコルですが、サーバへの到達性が無いとメールが読めないことや一つのメールを読むにも通信が必要なため(ネットワーク環境にもよりますが)それなりに遅いという問題点があります
isync(mbsync) はこれを解消するために、IMAP サーバからメールをダウンロードして、ローカルに保存しておけばよい、という発想のツールです
類似のツールとしては offlineimap*5 もありますが、2016年に試した限りでは速度面で mbsync が圧倒していたため、そちらに移行しました
現在でも開発は続いているようなので、2019年12月現在でも同様かは不明です

ローカルにメールを保存すると簡単に書きましたが、メールの保存形式にもいくつか標準があり、大きく以下の二つに分かれます

  • mbox 形式*6
  • Maildir 形式*7

ここでは詳細に触れませんが、特徴の一つとして mbox 形式は全てのメールを一つのファイルに保存し、Maildir 形式では 1 メール 1ファイルとして保存することが挙げられます
mbsync は Maildir 形式で保存するためのツールです

設定

では設定を見ていきます

  • ~/.mbsync.rc
IMAPAccount gmail
Host imap.gmail.com
User hogehoge@example.com
Pass awesomepassword
SSLType IMAPS
AuthMechs LOGIN

IMAPStore gmail-remote
Account gmail

MaildirStore gmail-local
Path ~/.mail/gmail
Inbox ~/.mail/gmail/Inbox

Channel gmail
master :gmail-remote:
Slave :gmail-local:
Patterns * ![Gmail]* "[Gmail/Sent Mail]" "[Gmail]/Starred" "[Gmail]/All mail"
Create Both
SyncState *

設定の詳細には触れませんが、大まかには以下のようなことが設定されています

  • Gmail(IMAP サーバ) のログイン情報を宣言
  • リモート側(IMAP サーバ) として Gmail アカウントを指定
  • ローカル側(Maildir) として ~/.mail/gmail を指定(ここにメールが保存される)
  • 同期の挙動を設定する

詳細は https://wiki.archlinux.jp/index.php/Isynchttps://uwabami.github.io/cc-env/DebianMail.html を参考にされるとよいかと思います

メールの受信をトリガとして他の処理をする

先の mbsync は非常に便利ですが、コマンド自体は常駐するわけではなく、タイマー機能などは持っていないため、cron や systemd timer などを用いて定期的に mbsync を実行する必要があります
私はそれに加え、IMAP の NOTIFY 拡張を利用して、IMAP サーバにメールが届いたことをトリガにして mbsync を叩けるようにしています
これを実現するために imapnotify*8 を使用します

設定

  • ~/.config/imapnotify/config.json
{
  "host": "imap.gmail.com",
  "port": 993,
  "tls": true,
  "tlsOptions": { "rejectUnauthorized": false },
  "username": "hogehoge",
  "password": "awesomepassword",
  "onNotify": "/usr/bin/mbsync -a",
  "boxes":
    [
      "Inbox",
    ]
}
  • IMAP サーバの接続情報
  • Inbox のみを監視
  • Inbox にメールが配送されると onNotify に設定したコマンドを実行する
    • ここでは mbsync -a で mbsync に設定した全てのアカウントのメールを受信する

ほかにも

メールの受信時にやりたいことはいくつもありますが、例えば以下のようなことは今回は触れていません

今後ちょっとずつ整備していくのでまた知見が溜ったら公開します
neomutt 周り、気力があったら空いているところに入って書くかなぁ...