変態なので、ターミナルでメールをやります。

メールの同期

Password のコマンドライン管理

最近のメールサービスの認証の仕組みは、各アプリごとに“App password” という一回限りで表示されるパスワードをサービス側から発行してそれを使うのが普通だ。

fastmail なら、 Settings > Import & Setup > View activity and revoke access だし、 gmail なら、 Google Account > Security > App passwords で増やしたり管理できる。

mac の場合、パスワード管理するデフォルトではいってる security コマンドをつかう。

# add a password
security add-internet-password -s SERVICE -a EMAIL_ADDRESS -w PASSWORD
# get a password
security find-internet-password -s SERVICE -a EMAIL_ADDRESS -w

ちなみに、未来永劫マックを使っているとも思わないので、普段使っているパスワードマネージャは bitwarden です。あくまで、mac だったら security で、linux だったら、 pass なんだろうけど。 bitwarden でも cli コマンドあるみたいね。

mbsync

mbsync はメールの同期をするコマンドです。先にも書きましたが、2022 年現在酒井家は fastmail.com をプライベートでつかっています。

以下の設定ファイル。(~/.mbsyncrc)

# settings that are shared accross both accounts
Expunge None
CopyArrivalDate yes
Sync All
Create Both

IMAPAccount private
Host imap.fastmail.com
Port 993
UserCmd "cat ~/.config/fastmailuser"
# This will only work in macos
PassCmd "security find-internet-password -s fastmail.com -a $(cat ~/.config/fastmailuser) -w"
SSLType IMAPS
SSLVersions TLSv1.2
AuthMechs LOGIN

UserCmd はこのユーザー名が表示されようなコマンド。パスワードよりはセンシティブないけど、いやがらせうけたくないから。直打ちなら、 User

イメージとしては、上のアカウントをつかって、リモートの場所(IMAPStore)とローカルの場所(MaildirStore)を設定して、同期の挙動を指定するチャンネルを設定する感じ。

リモート:

IMAPStore private-remote
Account private

ローカル:

MaildirStore private-local
Path ~/Mail/private/
Inbox ~/Mail/private/INBOX
SubFolders Verbatim

ブリッジ:

Channel private
Far :private-remote:
Near :private-local:
Patterns * !minori* !Spam !Notes !Snoozed
SyncState *

いらないメールフォルダは Patterns で指定している。

仕事用

仕事では gmail が使われている、基本的に上とかわらないけど、ちょっとだけ違ったからまとめて紹介。

gmail は ここ にいって、App passwords ってのを発行する必要があります。

security add-internet-password -s gmail.com -a yasushis@media.mit.edu -w PASSWORD
IMAPAccount work
Host imap.gmail.com
UserCmd "cat ~/.config/medialabuser"
PassCmd "security find-internet-password -s gmail.com -a $(cat ~/.config/medialabuser) -w"
SSLType IMAPS
SSLVersion TLSv1.2
# additional info needed for gmail
AuthMechs LOGIN

IMAPStore work-remote
Account work

MaildirStore work-local
Path ~/Mail/work/
Inbox ~/Mail/work/INBOX
SubFolders Verbatim

Channel work
Far :work-remote:
Near :work-local:
Patterns INBOX [Gmail]/*
SyncState *

これで、ローカルにメールのバックアップがあることになる。

~/.mbsyncrc の設定はここまで。

使い方/同期のコマンド

mbsync -a

で、全部一括同期。だから、「今認証メール送ったよ」っていう二段階認証は、このコマンドで、強制受信できる。

brew services restart isync

これは、デフォルトで 5 分置きに、 mbsync -a を実行してくれる。

送信

送信は、 sendmail っていうソフトが普通は入ってるだけど、脆弱性からシスアドは普通敬遠するらしい。(これも昔の話かも?) msmtp を使う。

brew install msmtp

そんなにむずかしくない。

仕事用アカウント

tls_trust_file は、 brew info ca-certificates 辿っていったら出てきたもの。この時点で入っていなければ brew install ca-certificates する。

ここから ~/.config/msmtp/config ファイルに書く。

defaults
auth on
tls on
# we needed this before...
# tls_trust_file /opt/homebrew/etc/ca-certificates/cert.pem
logfile ~/.config/msmtp/msmtp.log
port 587

account work
host smtp.gmail.com

続けて、以下を任意に追加する。(公開したくないので)

from your@email.address
user your@email.account
passwordeval "security find-internet-password -s gmail.com -a $(cat ~/.config/medialabuser)"

個人用アカウント

account private
host smtp.fastmail.com

from, user, passwordeval 忘れないように。

デフォルトアカウントの設定

account default : private

ここまでで、 ~/.config/msmtp/config の設定終り。

試しに送ってみる。

echo "Hello world" | msmtp 相手先アドレス

地味に便利で、なにかのコマンドの出力結果を記録用に自分におくる事も出来るし、一言健忘録にもつかえたりする。

メールクライアント

メールの送受信(同期)と送信が出来るようになりました。あとは、その両方がしやすいクライントです。これは沢山あります。 emacs だったら mu4e ってのを使っている人もいます。僕は、 emacs はメモにしか使わないときめているので、メールは neomutt を使います。

このサイトが参考になったけど、 linux だし、直接 IMAP サーバーみにいく方式なのが違い。長くなるので、一箇所に書くのではなく、分割してかく。

~/.config/neomutt/neomuttrc ファイル:

source ~/.config/neomutt/general
source ~/.config/neomutt/colors
source ~/.config/neomutt/keymappings

source ~/.config/neomutt/accounts/private
# folder-hook $folder 'source /.config/neomutt/accounts/private'

# source ~/.config/neomutt/accounts/work
# folder-hook $folder 'source /.config/neomutt/accounts/work'

察しの通り、上 3 つは、一般設定、色、キーバインディングで、下は、それぞれプライベートと仕事アカウント用の個別設定。

設定項目の一覧はこちら(超ながい)

general ファイル

set editor = "nvim"
set realname = "Yasushi Sakai"

auto_view text/html text/calendar application/ics
alternative_order text/plain text/html text/enriched text/*

set edit_headers
set fast_reply
set ask_cc
set sidebar_visible # toggle with 'B'
set forward_format = "Fwd: %s"
set reply_to
set include
set forward_quote
set text_flowed # nvim side configuration
unset help
unset beep #'M' for debug messages
set tmpdir = ~/.temp/neomutt
unset confirm_append
set delete
set quit
unset mark_old
set pipe_decode
set thorough_search
set timeout = 0

set status_format = "[ Folder: %f ] [%r%m messages%?n? (%n new)?%?d? (%d to delete)?%?t? (%t tagged)? ]%>─%?p?( %p postponed )?"
set date_format = "%Y-%m-%d %H:%M"
set use_threads = reverse
set uncollapse_jump
set reply_regexp = "^(([Rr][Ee]?(\[[0-9]+\])?: *)?(\[[^]]+\] *)?)*"
set quote_regexp = "^( {0,4}[>|:#%]| {0,4}[a-z0-9]+[>|]+)+"
set send_charset = "utf-8:iso-8859-1:us-ascii"
set charset = "utf-8"
set arrow_cursor = "no" # Change `color indicator` depending

set pager_index_lines = 10  # Shows 10 lines of index when pager is active
set pager_context = 3
set pager_stop
set menu_scroll
set tilde
unset markers # annoying when it adds a '+' for wrapped urls

set mailcap_path = "~/.config/neomutt/mailcap"
set header_cache = "~/.cache/mutt"
set message_cachedir = "~/.cache/mutt"

set mbox_type = Maildir
  • mailcap

    は、メール本体や添付ファイルをどのソフトでみるか設定するもの。 MIME によってふりわける。 (~/.config/neomut/mailcap)

    application/msword; ~/.config/neomutt/view_attachment.sh %s
    application/vnd.ms-excel; ~/.config/neomutt/view_attachment.sh %s
    application/vnd.openxmlformats-officedocument.presenation; ~/.config/neomutt/view_attachment.sh %s
    application/vnd.oasis.opendocument.text; ~/.config/neomutt/view_attachment.sh %s
    
    # text/html; ~/.config/neomutt/view_attachment.sh %s html '/Applications/Safari.app'
    
    text/html; w3m -I %{charset} -T text/html; copiousoutput;
    text/plain; /opt/homebrew/bin/bat; copiousoutput;
    
    application/pdf; ~/.config/neomutt/view_attachment.sh %s
    
    image/*; ~/.config/neomutt/view_attachment.sh %s
    

    この中で良く出てくる view_attachment.sh は、ここから落した。linux 版もあるようで、こちらは、それを mac 用にしたものみたい。

    curl https://gist.githubusercontent.com/ramn/6087107/raw/8031516b1a5b6bd9c8f8a23b80b4cd5f6b11aed3/view_attachment.sh > ~/.config/neomutt/view_attachment.sh
    
    chmod u+x ~/.config/neomutt/view_attachment.sh
    

colors

これは見やすさあるけど好みなので…

color header blue default ".*"
color header brightmagenta default "^(From)"
color header brightcyan default "^(Subject)"
color header brightwhite default "(CC|BCC)"

color normal default default
color sidebar_highlight red default
color sidebar_flagged red black
color sidebar_new green black
color normal brightyellow default
color error red default
color tilde black default
color message cyan default
color markers red white
color attachment white default
color search brightmagenta default
color status brightyellow black
color hdrdefault brightgreen default
color quoted green default
color quoted1 blue default
color quoted2 cyan default
color quoted3 yellow default
color quoted4 red default
color quoted5 brightred default
color signature brightgreen default
color bold black default
color underline black default
color normal default default

color body brightred default "[-a-z_0-9.%$]+@[-a-z_0-9.]+\\.[-a-z][-a-z]+"
color body brightblue default (https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+

# Default index colors:
color index yellow default '.*'
color index_author red default '.*'
color index_number blue default
color index_subject cyan default '.*'

color index brightyellow black "~N"
color index_author brightred black "~N"
color index_subject brightcyan black "~N"

color progress black cyan

keymappings

neomutt には複数の画面(ビュー)があって、それぞれにキーをあてていく。

  1. Index: 一覧表示
  2. Pager: メール表示
  3. Browser: ファイルブラウザ

2, 3 から 1 に戻るには、 q

それぞれのウィンドウの説明がここで、それぞれどんな操作(コマンド)があるかをまとめたのがここ

眩暈がするけど、結局メールなんて基本的な事しかしない。vim と gmail のショートカットを参考に割りあててみる。

  • 新規作成 (c ompose) -> index, pager
  • 全員に返信 (reply a ll) -> index, pager
  • 転送 (f orward: デフォルト) -> index, pager
  • メールボックスをかえる (m ove) -> index
  • アカウントをかえる (Ctrl-j, Ctrl-k) -> index
bind index,pager c mail
bind index a noop # set to alias
bind index,pager m noop
bind index,pager n noop
bind index,pager e noop
bind index,pager i noop
bind index,pager r group-reply
bind index b change-folder
# changing mail boxes
macro index,pager E '<sidebar-prev><sidebar-open>'
macro index,pager N '<sidebar-next><sidebar-open>'

bind index,pager B sidebar-toggle-visible

実際には、ヘッダー情報もいじれちゃうから、“全員に返信” を指定して、送信宛を替えでも OK.

各メールの移動

  • メールを trash フォルダに移すフラグをつける(d) -> index, pager
  • メールをアーカイブする フラグをつける(e ??) -> index, pager
  • メールを(上記以外の場所へ)移動するフラグをつける (r eplace) -> index, pager
  • フラグの実行と反映 $
  • (メールを消す: x)
bind index,pager x delete-message
bind index,pager v save-message

それいがい、ナビゲーションに関しては h,j,k,l の操作でなにが起るかと、あとは gg,G くらいは明確に指定したい。 イメージとしては、

index <-> pager <-> attachment

というふうに、並んでいて、それぞれ h, l できりかえる。 attach は複数ページにまたがる可能性あるので、なやましいけど、 HL で対応。

browser 正直謎である。

# index
# j and k is set to next-entry and previous-entry
bind index i display-message
bind index n next-entry
bind index e previous-entry
bind index g noop
bind index gg first-entry
bind index G last-entry
macro index S "<shell-escape>mbsync -a<enter>" "sync (both) accounts"

# pager
bind pager G bottom
bind pager g noop
bind pager gg top
bind pager m exit # to index
bind pager n next-line
bind pager e previous-line
bind pager i view-attachments
bind pager q exit

# browser
bind browser m goto-parent
bind browser q exit
bind browser i select-entry
bind browser gg first-entry
bind browser G last-entry

# attach
# j and k is set to next-entry and previous-entry
bind attach <return> view-mailcap
bind attach i view-mailcap
bind attach L next-page
bind attach M previous-page
bind attach n next-entry
bind attach e previous-entry

bind attach m exit
bind attach q exit
bind attach g noop
bind attach gg first-entry
bind attach G last-entry

# other maps (or views)
bind editor <Tab> complete-query
bind editor ^T complete
bind editor <space> noop
bind index \031 previous-undeleted  # Mouse wheel
bind index \005 next-undeleted      # Mouse wheel
bind pager \031 previous-line       # Mouse wheel
bind pager \005 next-line       # Mouse wheel

まとめたが効率いいんだろうけど、ここは保守性とって別々に愚直に書く事にした。

あとは、仕事とプライベートの切り替え。

macro index,pager <f2> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/private<enter><change-folder>!<enter>'
macro index,pager \Cp '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/private<enter><change-folder>!<enter>'
macro index,pager <f3> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/work<enter><change-folder>!<enter>'
macro index,pager \Cw '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/work<enter><change-folder>!<enter>'

accounts

各アカウント毎の設定ファイル

  • private
    set sendmail = "/opt/homebrew/bin/msmtp -a private"
    set use_from = yes
    set folder = ~/Mail/private
    set spoolfile = +/yasushi
    set record = +/Sent
    set trash = +/Trash
    set postponed = +/Drafts
    
    # sidebar
    unmailboxes *
    named-mailboxes "inbox" "+/INBOX"
    named-mailboxes "accounts" "+/accounts"
    named-mailboxes "invoices" "+/accounts/invoice-payment"
    named-mailboxes "yasushi" "+/yasushi"
    named-mailboxes "yasushi.accounts" "+/yasushi.accounts"
    named-mailboxes "archive" +/Archive
    named-mailboxes "drafts" $postponed
    named-mailboxes "sent" $record
    named-mailboxes "trash" $trash
    
    # move folders
    macro index,pager gy "<change-folder>=yasushi<enter>"
    macro index,pager gi "<change-folder>=INBOX<enter>"
    macro index,pager ga "<change-folder>=Archive<enter>"
    
    macro index,pager a "<save-message>=Archive<enter>"
    macro index,pager d "<save-message>=Trash<enter>"
    
    color indicator black yellow
    color sidebar_divider yellow default
    

    だれだかの指定も忘れずに。

    set from = 'your@address.com'
    
  • work

    基本的に同じだけど、 set したものは、上書きしていないとだめ。

    set sendmail = "/opt/homebrew/bin/msmtp -a work"
    set use_from = yes
    set folder = ~/Mail/work
    set spoolfile = +/INBOX
    set record = "+/[Gmail]/Sent Mail"
    set trash = "+/[Gmail]/Trash"
    set postponed = "+/[Gmail]/Drafts"
    
    # sidebar
    unmailboxes *
    named-mailboxes "inbox" +/INBOX
    named-mailboxes "archive" "+/[Gmail]/All Mail"
    named-mailboxes "drafts" $postponed
    named-mailboxes "sent" $record
    named-mailboxes "trash" $trash
    
    color indicator black cyan
    color sidebar_divider cyan default
    
    unmacro index,pager gy
    macro index,pager gi "<change-folder>=INBOX<enter>"
    macro index,pager ga "<change-folder>=[Gmail]/All Mail<enter>"
    
    macro index,pager a "<save-message>=[Gmail]/All Mail<enter>"
    macro index,pager d "<save-message>=[Gmail]/Trash<enter>"
    

メールインデクサー

この時点で普通に使えるとおもうけど、メールの検索があんまりよろしくない。いや正確にいえば、 rg(grep) やらで検索スクリプトを書きまくればいいのかもしれないけど、骨がおれるので、インデクサーを使う。

brew install notmuch

Date: 2022-08-02 Tue 13:50