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)
isyncのバージョンが1.5未満の場合は、サーバ側のフォルダ名が日本語だと 文字化け(というか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:"迷惑メール" # isync >= 1.5 ならこれで ok
# Master :private-server:"&j,dg0TDhMPww6w-" # 1.5 未満の場合は 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]](../seahoursedialog.png)
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]](../mu4esplash.png)
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 にリネームしてください。