有馬総一郎のブログ

(彼氏の事情)

2021年02月22日 00:42:32 JST - 10 minute read - Linux

端末(ターミナル)で動くメーラーNeoMuttを使ってみる

Lubuntu 20.04のインストールメモ、操作メモでも書いたが、 Trojitáは、かなり高速だ。しかしhtml形式メールは、いちいちLoadボタンを押さなきゃいけないことと、キーバインドをそこまでカスタマイズできないので、噂に聞くmuttをインストールしようと思う。

で、よくよく調べると Vim から Neovim が派生(?)したように、Mutt から派生した NeoMuttというのがあるらしい。そもそもmuttを使ったことがないので、新しいneomuttをインストールすることにした。

参考にしたのは以下のページ

実行したコマンド

$ sudo apt install neomutt w3m gnupg
$ mkdir -p ~/.config/neomutt/
$ mkdir -p ~/.mutt/cache/headers/
$ mkdir -p ~/.mutt/cache/bodies/
$ mkdir -p ~/.mutt/certificates/
$ nvim ~/.config/neomutt/passwds
$ gpg --gen-key
$ gpg -r gpg_real_name -e ~/.config/neomutt/passwds
$ shred -u ~/.config/neomutt/passwds
$ echo "text/html; w3m -I %{charset} -T text/html; copiousoutput;" > ~/.mutt/mailcap
$ nvim ~/.config/neomutt/neomuttrc

基本は上記のとおりなので passwdsneomuttrc は各自、編集して終わり。以下、細かい補足、自分へのメモ。

ディレクトリの作成

  • メールヘッダ用のキャッシュディレクトリ

    ~/.mutt/cache/headers/

  • メール本文用のキャッシュディレクトリ

    ~/.mutt/cache/bodies/

  • CA証明書を格納するディレクトリ

    ~/.mutt/certificates/

私の場合、メール件数は80,000件程度だけど、それでも初回起動時はキャッシュされてないので、neomuttでも、数十分は待たされることになる。しかも、途中でCtrl+cなどして中断しないと、ヘッダーを全件取得するまで、操作できない。でも、一度読み込めば、次回からは数秒である。

パスワードファイルの作成

今時、個人情報の固まりであるGoogleを二要素認証にしていない人はいないので、アプリパスワードを生成して、それをファイルに平文でまずは記述する。

~/.config/neomutt/passwds

set imap_pass="Googleのアプリパスワード"
set smtp_pass="Googleのアプリパスワード"

GPG鍵ペアを生成

gpg --gen-keyでGPG鍵ペアを生成する。

Real name Email address Passphrase
名前 メールアドレス パスフレーズ

を入力する。誰かとやりとりするわけでもなく、アプリパスワードで生成したパスワードを保護するためなので、Real namaとあるけど、アプリ名、偽名でもなんでも良いと思う。メールアドレスも、本当に自分のメールアドレスでも適当なものでも。パスフレーズも面倒だと思ったら、空入力して無しにすることもできる。

もしパスフレーズを設定した場合は、そのセッションでのneomutt初起動の度聞かれることになる。ただし、それもパスワードと鍵(seahorse)で保存しておくことはできる。

$ gpg --gen-key
gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: gpg_real_name
Email address: xxxxxxxxx@gmail.com
You selected this USER-ID:
    "gpg_real_name <xxxxxxxxx@gmail.com>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key 90ABCDEF12345678 marked as ultimately trusted
gpg: revocation certificate stored as '/home/arimasou16/.gnupg/openpgp-revocs.d/1234567890ABCDEF1234567890ABCDEF12345678.rev'
public and secret key created and signed.

pub   rsa3072 2021-01-20 [SC] [expires: 2023-01-20]
      1234567890ABCDEF1234567890ABCDEF12345678
uid                      gpg_real_name <xxxxxxxxx@gmail.com>
sub   rsa3072 2021-01-20 [E] [expires: 2023-01-20]

生成できた秘密鍵、公開鍵は、重複しなければ Real nameEmail address どちらかだけの指定で暗号化処理、削除を行なうことができる。

パスワードファイルの暗号化

先程、生成した鍵を指定して、パスワードを記載したファイルを暗号化する。

$ gpg -r gpg_real_name -e ~/.config/neomutt/passwds
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2023-01-20

暗号化ファイルは名前を指定することもできるが、指定しない場合、元ファイルにgpgが付与されて生成される。 passwords.gpg

平文でパスワードが記載された passwds は不要なので、shred -u ~/.config/neomutt/passwdsでランダム情報を書き込んで削除する。-uを指定しなければ、 passwds が残ったままで、開くとランダム情報が書き込まれてることが確認できる。その後はrmで削除してもらえば良い。

HTMLメールを読むための設定ファイルを生成

echo "text/html; w3m -I %{charset} -T text/html; copiousoutput;" > ~/.mutt/mailcap

↓のようになっていれば良し。 ~/.mutt/mailcap

text/html; w3m -I %{charset} -T text/html; copiousoutput;
  • -I

    入力文書の文字コードを指定する.

  • -T

    表示する文書のタイプを指定する

  • copiousoutput

    The Mutt E-Mail Client : Mutt の MIME サポートより

    このフラグは Mutt にそのコマンドがたくさんの量のテキストを標準出力に渡し得るということを教えます。これによって Mutt は閲覧コマンドの出力に対してページャーを起動します

設定ファイルの編集

基本、 環境構築:Terminal(CLI)向けメーラー”Neomutt”でGmailを送受信するための設定からの丸パクリ。

~/.config/neomutt/neomuttrc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
########################
# メール送信・受信設定 #
########################
source "gpg -d ~/.config/neomutt/passwds.gpg |" # 暗号化したパスワードを読み込み
set realname  = "本名"                          # 本名
set hostname  = "gmail.com"                     # ホスト名
set from      = "xxxxxxxxx@gmail.com"           # G-mailのアドレス。送信元。
# 送信設定(SMTPS=セキュアなメール転送プロトコル)
set smtp_url  = "smtps://xxxxxxxxx@gmail.com@smtp.gmail.com:465/"
set imap_user = "xxxxxxxxx@gmail.com"           # 受信設定(IMAP=メールをサーバ管理)
set folder    = "imaps://imap.gmail.com:993"    # 受信メールの読み込み先(993番ポート=SSL対応)
######################
#   セキュリティ設定 #
######################
set ssl_starttls      = yes # 受送信メールサーバまでの通信を暗号化
set ssl_force_tls     = yes # SSLを次世代規格のTLSに強制的に変更
########################
#   メーラー基本設定   #
########################
set sidebar_visible  = yes                                  # サイドバーの表示
set sidebar_format = "%B%?F? [%F]?%* %?N?%N/?%S"            # サイドバーの書式
set mail_check_stats                                        # 定期的にメールの状態をチェック
set sort_aux         = reverse-date                         # 日付の降順でメール一覧を表示
set use_from         = yes                                  # メールのFromヘッダを自動生成ON
set editor           = "nvim"                               # メールを書く時のエディタ
                                                            # 環境変数EDITORに従う場合、`echo \$EDITOR`と記載
set charset          = "utf-8"                              # Terminal(およびメール送信時)で使用する文字コード
set assumed_charset  = "utf-8:iso-2022-jp:euc-jp:shift_jis" # 文字コード指定がない場合のため、優先順位を設定
set mbox_type        = "maildir"                            # mbox=複数のメッセージが連結した形式で保存
                                                            # maildir=mail1通がファイル1個
set spoolfile        = "+INBOX"                             # フィルタされていないメールの受信先
mailboxes            = "+INBOX" "+Sent" "+ああ" "+いいい "+うううう"
set certificate_file = "~/.mutt/certificates"               # CAの証明書の格納先(接続先の認証ファイル)
set mailcap_path     = "~/.mutt/mailcap"                    # mailcapには、w3mを使ってHTMLメールを読む設定を記載
auto_view text/html
set new_mail_command="notify-send --icon='/usr/share/icons/hicolor/48x48/apps/neomutt.png' 'New Email' '%n new messages, %u unread.' &"
# インデックスフォーマット デフォルト"%4C %Z %{%b %d} %-15.15L (%?l?%4l&%4c?) %s"
set index_format="%4C %Z %<[y?%<[d?%[%H:%M           ]&%[%m/%d (%a) %H:%M]>&%[%Y/%m/%d %H:%M]> %-15.15L (%?l?%4l&%4c?) %s"
##############################################################
# キャッシュ設定(キャッシュ先ディレクトリを事前に作成する事) #
##############################################################
set header_cache     = "~/.mutt/cache/headers" # headerキャッシュのPATHを指定
set message_cachedir = "~/.mutt/cache/bodies"  # IMAP経由で受信したメッセージのキャッシュPATHを指定

上記設定すると、こんな感じ

NeoMutt
Qterminalで開いた場合
NeoMutt
Neovim-qtで開いた場合

名前、メールアドレスの設定部分はハイライトされた5、7、9,10行目。

暗号化したパスワードファイルを復号化しているのは4行目のsource "gpg -d ~/.config/neomutt/passwds.gpg |"の行となる。

サイドバーに複数のフォルダを表示する場合は、32行目のmailboxes+を付けて、そのフォルダ名を半角スペース区切りで列挙していく。また、これをしておくと、c?で開くメールボックス(フォルダ)候補として表示される。また、トップフォルダだけ読み込めば開かれるので、複数指定したからといって起動が遅くなることはない。

キャッシュフォルダにはフォルダ名で保存されているので、フォルダ名を変更した場合は、~/.mutt/cache/headers/imaps\:xxxxxxxxx@gmail.com@imap.gmail.com\:993/変更前フォルダ名.hcacheを変更するか、再度キャッシュしなおす必要がある。

html形式メールを自動でhtml形式で表示させる場合は34、35行目のように設定する。

neomuttを使う上で一番懸念だった新着メールの通知はset new_mail_command="notify-send --icon='/usr/share/icons/hicolor/48x48/apps/neomutt.png' 'New Email' '%n new messages, %u unread.' &"とすることで通知されるようになる。アイコンはhttps://neomutt.org/images/mutt-48x48.pngをダウンロードして使わせてもらった。

NeoMutt

日付フォーマットの編集

そして、デフォルトのままだと一覧での日付が月日しか表示されない。それだと不便なのでインデックスフォーマットを編集する。

# インデックスフォーマット デフォルト"%4C %Z %{%b %d} %-15.15L (%?l?%4l&%4c?) %s"
set index_format="%4C %Z %<[y?%<[d?%[%H:%M           ]&%[%m/%d (%a) %H:%M]>&%[%Y/%m/%d %H:%M]> %-15.15L (%?l?%4l&%4c?) %s"

フォーマットは strftime(3) manページに準拠しているらしい。

で今日より前のメールの日付はとか、今年より前のメールの日付は、という風に変更したいと思うのが、普通だと思うので、そのやり方は Conditional Dates - NeoMuttに書いてあった。

自分の設定だと今日のは時:分、今年のは月/日 (曜日) 時:分、去年以前は年/月/日 時:分という形で表示される。

  37     00:02            Amazon.co.jp    ( 43K) Amazon.co.jp ご注文の確認 D01-1234567-8901234
  39   + 02/21 (日) 21:13 nttxstore_4@sho ( 14K) 【NTT-X Store 楽天市場店】商品発送のお知らせ
1594   + 01/01 (金) 01:58 BRIDGE INC. ONL (8.2K) ご注文確認メール(自動配信)
1595   + 2020/12/31 22:50 Instagram       ( 15K) InstagramにLinuxのChromeから新しいログインがありました

例に書いてある%<[y?%<[m?%<[d?%[%H:%M ]&%[%a %d]>&%[%b %d]>&%[%m/%y ]>とおりだと、今日のは時:分、今月のは曜日 日、今年のは各国の表現で省略した月名 日、去年以前は月/年という形で表示される。

   33     00:02  Amazon.co.jp    ( 43K) Amazon.co.jp ご注文の確認 D01-1234567-8901234
   35   + 日 21  nttxstore_4@sho ( 14K) 【NTT-X Store 楽天市場店】商品発送のお知らせ
  786   + 日 31  BOOTH事務局     (7.8K) team zpnからメッセージが届いています [BOOTH]
 1589   + 1月 01 BRIDGE INC. ONL (8.2K) ご注文確認メール(自動配信)
 1590   + 12/20  Instagram       ( 15K) InstagramにLinuxのChromeから新しいログインがありました

どうも今月より前という判定が2月だとおかしいみたい。1/31のメールまで今月扱いになってる。また%<[y%[1yというふうに数字を入れれば、今日から1年前という点ではなく線の差で、条件設定できる。

デスクトップアプリとしての登録

起動させたければ、Win+rなり起動ランチャーからneomuttと打つだけだけど、デスクトップアプリとして登録させる場合は、以下のファイルを作成する。

~/.local/share/applications/neomutt.desktop

[Desktop Entry]
Name=NeoMutt
GenericName=Command line mail reader
Comment=Command line mail reader
TryExec=neomutt
Exec=neomutt
Terminal=true
Type=Application
Keywords=mail;e-mail;IMAP;SMTP;eml;MUA;
Icon=neomutt
Categories=Network;Email;
StartupNotify=false
MimeType=x-scheme-handler/mailto;

書式のチェックdesktop-file-validate ~/.local/share/applications/neomutt.desktopして問題ないことを確認。

チートシート

動作 キー
一覧での上 j
一覧での下 k
一覧戻る i
フォルダ変更一覧 c?
フォルダ一覧取得 c[tab]
フォルダ一覧から一覧に戻る y
メッセージでの上 PgUp または -
メッセージでの下 PgDn または [Space]
一覧、メッセージでの最上 [Home]
一覧、メッセージでの最下 [End]
メール削除(dフラグon) d
メール削除取消(dフラグoff) u
添付ファイルをみる v
検索 (下に) /
検索(上に) [Esc]/
次の検索 n
メール作成 m
全員に返信 g
先頭まで移動 Ctrl+a
文末まで移動 Ctrl+e
先頭まで削除 Ctrl+u
文末まで削除 Ctrl+k
メニュー中断 Ctrl+g
保存して終了 q
保存せず終了 x

キーバインドはこちらに Getting Started - NeoMutt

環境によってはズレる箇所がある

最後に、解決してない部分をメモ。サイドバーに表示させるフォルダ名が全角だったり、スレッドの返信マーク└─>があると、ズレる。ああ日本語は想定されてないのかなぁ、と思ったけど、nvim-qtからterminalneomuttで表示するとズレない。

フォントなのか、いや、両方Illusion Nを使っているし、set ambiwidth=singleになっている。試しにフォントを通常のもの、set ambiwidth=doubleにしてみたけど、直らない。

GitHub - z80oolong/homebrew-eaw: z80oolong/eaw – 各種 CLI アプリケーション等において East Asian Ambiguous Character を全角文字の幅で表示するための Formula 群

というページがあって、全角文字の幅で表示するためのFormula群をインストールすれば直るのかなぁ、と思いつつ、あれこれインストールして複雑化させたくない気持ちもある。

見た目の問題なので、とりあえず放置して、このまま使うことにする。


追記 2021-05-01
alacrittyだとズレない。なのでneomutt.desktopはTerminal=false Exec=alacritty -t "neomutt" -e neomuttとした。
追記ここまで