yagshi's website
mu4eを使おう

mu4eを使おう

背景

ぼくの MUA (Mail User Agent) 変遷は、ざっくり四半世紀かけて MH → mew → wanderlust でした。wanderlust は emacs 上で動く非常に良くできた MUA で ちょうど 20 年使い続けました。が、ここに来てなぜか MUA の 乗り換えを検討して mu4e というのを知り、これが予想外に 好感触だったので設定方法その他を解説します。 「wanderlust、なにそれ?」という人でも大丈夫ですが、 日常的にemacsを使っていることが前提の記事になってます。

mu4e の特徴

  • wanderlust ぽい & emacs 上で動く
    これがぼくにとっては一番重要かも。 操作系はwanderlust にインスパイアされたと自称している だけあって、wanderlust 使っている人ならすんなり使えそうです。 本記事では Linux と macOS での 環境構築を説明します。(Windowsはすみません、使っていないのでパス。)

  • MUAそのものじゃない
    waderlust が emacs で完結する一式フル装備の完全な MUA なのに対し、 mu4e は UI 部分だけを emacs 上に切り離した MUA 的なものと考えるのが正解です。 mu4e はローカルにダウンロード(サーバと同期)した e-mail を操作する ツールで、IMAP による取り込みやサーバ側の操作、 e-mail の送信などは行いません。これらは外部ツールを 呼び出すことで行います。(その分最初の設定が面倒、 すなわちハードル高め。)

  • 動作はサクサク & オフラインの日も安心
    データベースにインデックスを持っているので検索が 気持ち良いくらい高速です。また、基本的にローカルのみでの 作業なのでオフラインになってもダウンロード済みメイルの 閲覧と操作については何の違和感もなく行えます。 あと、多くの重い処理がブロッキングしないところもすごいです。 ぼくはemacs-lisp 全くわかりませんが、多くの emacs-lisp アプリは 重い処理でブロッキングします。mu4e はかなりバックグラウンドで 動きます。すごい。

MUA “suite”

mu4e を含めて完全な MUA として機能させるためのツール一式を 紹介します。この組み合わせ以外でも可能です(特に送信部分)。

  • mu + mu4e
    ローカルにある Maildir 形式の e-mail のインデクシング、検索、操作などを行うツールです。 mu はコマンドライツールで、 それを emacs 上で wanderlust ふうに使えるようにする UI が mu4e という関係。 mu 自体はメイルの同期(取り込み)や送信は行いません。

  • isync (mbsync)
    IMAP を話してサーバ側とローカル側の e-mail を同期させる ツールです。mbsync は isync のコマンド。 mu4e はこれを使って同期した Maildir を操作しますが、 別に isync 以外のツールを使っても構わない(はず)です。 本記事では isync を使います。 なお某IT大手企業が昔作っていた iSync とは関係ありません。

  • msmtp
    シンプルな SMTP クライアントです。mu4e からメイルを 送信するときに使います。これじゃなくてもいいですが、 ぼくが自分のやりたいことをやるにはこれが一番だったので この記事ではこれを説明します。例によってこれ自体は mu4e とは関係ありません。

  • 環境構築の順番は恐らく isync & mu (受信) & msmtp & mu (送信) がわかりやすいと思うので以下、それで行きます。

パスワードの準備&その他

送受信パスワードを設定します。(この記事で紹介するやり方は) ここが素晴らしくて、MUAに直接管理させず、gpg-agent に任せます。 すると、例えば linux だったら Seahourse と連携できてとても便利で安心です。

$ gpg -e > ~/mailpass_work.gpg       # 仕事ようアカウントのパスワード
(受取人(自分)を指定→空行)
(メイルサーバのパスワードを入力 → ^D)
$ gpg -e > ~/mailpass_private.gpg    # プライベートアカウントのパスワード
(受取人(自分)を指定→空行)
(メイルサーバのパスワードを入力 → ^D)

あと、サーバ側のフォルダ名が日本語だと文字化け(というかRFC2060に 則ったエンコーディング)が起こるので事前に英語にしておくのも良いです。 (ただ、MSのOutlookの場合は言語設定を変えてUI全体を英語にする必要がありました……。) 日本語のままの場合はサーバ側を “modified UTF-7” 、ローカルを適当な フォルダ名にマッピングする必要があります。それは mbsync の設定で行いますが、 後述します。

isync のインストールと設定

インストールは簡単です。Linuxだったら apt install isync、 macOS (homebrew) だったら brew install isyncです。 その後でローカルのMaildirフォルダと、各アカウント別のサブフォルダを 作ります。mkdir -p ~/Maildir/work; mkdir -p ~/Maildir/private あたりでいいでしょう。ここまでは簡単。でも設定ファイルはややこしいです。 ホームディレクトリに.mbsyncrcというファイルを作ります。そこで 『IMAPAccount (アカウント情報)』『IMAPStore (サーバ)』 『MaildirStore (ローカル)』 『Channel (同期)』をそれぞれ設定します。この設定は非常に多岐にわたるのですが、 以下ではぼくが使う必要な最小のものです。workとprivateという2つのアカウントを 使うという状況設定です。

# ~/.mbsyncrc
Expunge Both
Create Both

# accounts
IMAPAccount work
PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/mailpass_work.gpg"
Host awesomeserver.mycompany.com
User kobayashi
SSLType IMAPS
AuthMechs LOGIN

IMAPAccount private
PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/mailpass_private.gpg"
Host myserver.mydomain.jp
User yagshi
SSLType IMAPS
AuthMechs LOGIN

# IMAPStores
IMAPStore work-server
Account work
IMAPStore private-server
Account private

# MaildirStores
MaildirStore work-local
Path ~/Maildir/work
Inbox ~/Maildir/work/Inbox

MaildirStore private-local
Path ~/Maildir/private
Inbox ~/Maildir/private/Inbox

# Channels
# 例として、work は全部ひっくるめて work としています。
# private は日本語フォルダがあるという前提で "inbox""迷惑メール" のみを同期することにします。
Channel work
Master :work-server:                       # 最新版では Master ではなく Far 推奨
Slave  :work-local:                        # 最新版では Slave  ではなく Near 推奨
Patterns: % !Archive !Deleted              # Archive と Deleted フォルダは同期しない

Channel private-inbox
Master :private-server:inbox               # サーバ側の "inbox" を……
Slave  :private-local:inbox                # ローカルの "inbox" にマップ。

Channel private-junk
Master :private-server:"&j,dg0TDhMPww6w-"  # サーバ側の "迷惑メール" (modified UTF-7) を……
Slave  :private-local:junk                 # ローカルの "junk" にマップ。

# Group (private の 2つのチャンネルをまとめて private グループを定義)
Group private
Channel private-inbox
Channel private-junk

ここまでできたらテストしてみましょう。$ mbsync -aとします。 必要に応じてgpg-agent がパスフレーズを聞いてくるので答えます。 これで同期が行われます。エラーがでなければokです。Maildirの中を覗いて納得してください。

[passphrase dialog]

mu4e のインストールと設定

インストールは簡単です。Linuxなら apt install mu4e、 macOS (homebrew) なら brew install mu で必要なものは一式 入ると思います。mu4eはemacsパッケージなのでemacsの設定をします。 ~/.emacs.d/init.elなり ~/.emacs なりを編集して 起動時に以下のようなものを実行するようにしてください。 mu4e-get-mail-command で mbsync を指定します。mu4e-headers-fieldsはメイルの 一覧表示の際の列幅です。特に human-dateはデフォルトが少し 狭くて日本語環境だとはみ出るので16以上が良いと思います。

(add-to-list 'load-path "/opt/homebrew/share/emacs/site-lisp/mu/mu4e");  この1行はmacOS のみ
(add-to-list 'load-path "/usr/local/share/emacs/site-lisp/mu/mu4e");     上でうまくいかない場合ここちら
(require 'mu4e)
(setq mu4e-get-mail-command "mbsync -a")
(setq mu4e-headers-fields '((:human-date . 16) (:flags . 6) (:mailing-list . 6) (:from . 22) (:subject)))
;; この下に後述のコンテキスト設定を書きます。コンテキストは特に送信時に重要なものなのですが、今はなしでいいです。

つぎにmuを初期化します。mu init --my-address=kobayashi@awesomecompany.com --my-address=yagshi@myserver.jp などとしてください(初回のみ)。 ~/Maildirフォルダおよびその下のサブフォルダがないとエラーが 出ると思います。エラーメッセージに従って掘ってください。 続いて emacs を起動して M-x mu4eします。Uとして、mbsync を 呼び出して Maildir を同期し、mu のデータベースに反映させましょう。うまく行けば [bu] (未読)や[bt] (本日)の数字が何か出ると思います。 これでe-mailの閲覧はできる状態です。この記事ではキー操作等の詳細は説明しませんので 公式マニュアルなどを 参考にしてください。操作は wanderlust と似ています。

[screenshot]

msmtpのインストールと設定

メイルを送信するための設定です。ホームディレクトリに.msmtprc というファイルを作ります。送信パスワードは パスワードの準備&その他の ところで作ったファイルを使うように設定します。(passwordeval を設定する ことで平文パスワードを保存しない点が素晴らしい!) 以下に ~/.msmtprc の例を示します。

defaults
auth on
tls on
#tls_trust_file /etc/ssl/certs/ca-certificates.crt  # 必要な場合

# work
account work
host awesomesmtp.mycompany.com
port 587
from kobayashi@mycompany.com
user kobayashi@mycompany.com
passwordeval "gpg --quiet --for-your-eyes-only --no-tty --decrypt ~/mailpass_work.gpg"

# private
account private
host mysmtp.mydomain.jp
port 587
from yagshi@mydomain.jp
user yagshi
passwordeval "gpg --quiet --for-your-eyes-only --no-tty --decrypt ~/mailpass_private.gpg"

必要であればターミナルから直接 msmtp コマンドでテストします。以下は 設定したプライベートのアカウントから仕事のアカウントにテストメイルを 送信する例です。

$ msmtp --account=private kobayashi@mycompany.com          # ←送信先を指定
subject: test email
hello world
^D                                                         # ←Ctrl+D の意味

続・mu4eの設定 (準備中)

msmtpを使ってメイルを送信するためにコンテキストを作ります。準備中です。

トラブルシュート (困ったときは)

  • Maildir error: UID 1701 is beyond highest assgned UID 42.`` 大量のメイルを一度に同期しようとするとときどきこれが出ます (バグなんじゃないかな)。これの原因と 簡単な修復方法は……すみません、よくわかりません。 ですので、一度ローカルを消して(ローカルでの処理をなかったことにして)、 サーバから同期し直しするのが良いと思います。 まず、~/.mbsync/以下のエラーとなったサーバのファイルをすべて消します。 そして、~/Maildir/`以下のエラーとなったサーバのフォルダの中身をすべて消します。 その後、mbsync -a などとしましょう。全syncなので多少時間かかりますが。 その再、mu init もしておかないと再びおかしくなるようです。

  • Maildir error: duplicate UID 42.`` 上述の beyond highest... と同じ方法で解決できますが、 こちらの場合はスポットで 対応もできます。UID 42 が問題の場合、Maildir 内の 1629773120.886102_6030.host,U=42:2,RS`みたいなファイルを見つけて、 ,U=以下を削除したファイル名 1629773120.886102_6030.host にリネームしてください。