mu4e を使おう

背景

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

mu4e の特徴

MUA "suite"

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

環境構築の順番は恐らく 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 と似ています。

mu4e 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を使ってメイルを送信するためにコンテキストを作ります。準備中です。

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