変態なので、ターミナルでメールをやります。
メールの同期
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
には複数の画面(ビュー)があって、それぞれにキーをあてていく。
- Index: 一覧表示
- Pager: メール表示
- 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
は複数ページにまたがる可能性あるので、なやましいけど、 H
と L
で対応。
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