NeoMutt 的使用 (IMAP)

2022-02-20 14:59 +0800

Mutt 是一个 TUI 的邮件客户端。

NeoMutt 在 Mutt 的基础上,新增了一些有用的功能

Mutt/NeoMutt 相比于 KMail, ThunderBird 之类,更加的简洁明快,也有更高的可定制化空间。

本文描述在 Linux 下,如何配置 NeoMutt 成为一个可用的邮件客户端。

测试平台:

此文不包含 smtp 发送邮件的配置,也许会在之后的文章中补充

IMAP 邮件同步

Mutt/NeoMutt 可以直接连接 imap 服务器,但是在每次打开客户端时,都会需要连接同步 imap 服务器,笔者德国的电子邮局连接至少要 4-5 秒。

将邮件定期与本地目录同步可以显著提升客户端打开速度,同步软件选用 isync 。

如果不想同步到本地,可以直接参考 Mutt - ArchWiki 配置帐号。

iSync 配置文件

isync 的默认配置文件为 ~/.mbsyncrc,新建这个文件,并写入配置,单帐号的示例如下

# 配置 IMAP 帐号
IMAPAccount lin # 自定义的帐号名称
Host imap.lin.moe # imap 服务器地址
User example@lin.moe # 帐号名
PassCmd "pass show mail/lin.moe/example" # 使用 pass 命令获取密码
SSLType IMAPS

IMAPStore lin-remote
ACCOUNT lin

MaildirStore lin-local
SubFolders Verbatim
# 确保 ~/Mail/lin 目录存在,或修改为其他目录
Path ~/Mail/lin/ 
Inbox ~/Mail/lin/Inbox

Channel lin
Far :lin-remote:
Near :lin-local: 
Patterns * 
# Pattern 为你要同步的邮件文件夹名,如 Inbox Archive 等
Create Both
Expunge Both
SyncState *

笔者使用 pass 命令管理密码,故在 PassCmd 中使用 pass show

读者也可以使用 gpg 文件等方式存储密码,以下是简要说明

密码明文写入到 ~/plain_pass 文件中后,使用下面的命令生成加密文件并删除明文文件(确保已有 gpg 密钥对)

gpg2 -e ~/plain_pass -o ~/.mailpass.gpg && rm -f ~/plain_pass

然后将 PassCmd 改成

PassCmd "gpg2 -q --for-your-eyes-only --no-tty -d ~/.mailpass.gpg"

如果不想加密存储,也可以添加一行 Pass *******,不建议这样存储密码,请确保其他用户无读权限。

更加详细的配置参考官方文档

写好配置文件后,使用 mbsync -a 同步所有邮件。

多帐号的配置较为简单,新添加多个类似的Account, Store 和 Channel 模块即可。

配置示例

笔者的全量配置如下

IMAPAccount lin
Host imap.lin.moe
User i@lin.moe
PassCmd "pass show mail/lin.moe/i"
SSLType IMAPS

IMAPAccount lin-admin
Host imap.lin.moe
User admin@lin.moe
PassCmd "pass show mail/lin.moe/admin"
SSLType IMAPS

IMAPStore lin-remote
ACCOUNT lin

IMAPStore linadmin-remote
ACCOUNT lin-admin

MaildirStore lin-local
SubFolders Verbatim
Path ~/Mail/lin/
Inbox ~/Mail/lin/Inbox

MaildirStore linadmin-local
SubFolders Verbatim
Path ~/Mail/linAdmin/
Inbox ~/Mail/linAdmin/Inbox

Channel lin
Far :lin-remote:
Near :lin-local:
Patterns *
Create Both
Expunge Both
SyncState *

Channel linadmin
Far :linadmin-remote:
Near :linadmin-local:
Patterns *
Create Both
Expunge Both
SyncState *

创建定期同步任务

方法1:参考 ArchWiki ,创建相关的 systemd 服务和定时器,每五分钟同步一次。

mkdir -p ~/.config/systemd/user
cat >> ~/.config/systemd/user/mbsync.service << EOF
[Unit]
Description=Mailbox synchronization service

[Service]
Type=oneshot
ExecStart=/usr/bin/mbsync -Va

[Install]
WantedBy=default.target
EOF

cat >> ~/.config/systemd/user/mbsync.timer << EOF
[Unit]
Description=Mailbox synchronization timer

[Timer]
OnBootSec=2m
OnUnitActiveSec=5m
Unit=mbsync.service

[Install]
WantedBy=timers.target
EOF

systemctl --user --now enable mbsync.timer

方法2:创建相关的 crontab 任务

crontab -l | { cat; echo "*/5 * * * * mbsync -Va"; } | crontab -

配置 neomutt

注:笔者配置文件存放在 ~/.config/neomutt 目录下,其他位置参考 neomutt 文档,并修改配置文件中的路径

创建 ~/.config/neomutt/muttrc 文件,作为配置的入口

示例如下

# 邮件类型为本地文件夹
set mbox_type = Maildir
set folder = "~/Mail"

# 邮件类型解析器配置
set mailcap_path = "~/.config/neomutt/mailcap"

set quit=ask-yes
set wait_key = no
set timeout = 3
set mail_check = 0
set delete
set quit
set thorough_search
set mail_check_stats

unset confirmappend
unset move
unset mark_old
unset beep_new
auto_view text/html

# 快捷键配置
source "~/.config/neomutt/keybind"

# 多帐号配置

# 进入目录时,触发相关 source 命令,导入相关用户配置
folder-hook lin/* 'source ~/.config/neomutt/accounts/lin'
folder-hook linAdmin/* 'source ~/.config/neomutt/accounts/linAdmin'

# 默认用户配置
source "~/.config/neomutt/accounts/lin"

添加 html 类型邮件的在终端中的展示,可以使用 lynx 或 w3m

这里使用 w3m,需要确保 w3m 已经安装。

~/.config/neomutt/mailcap

#text/html; lynx -dump %s; copiousoutput; nametemplate=%s.html
text/html; /usr/bin/w3m -cols 90 -dump -T text/html '%s'; copiousoutput

帐号配置示例如下

~/.config/neomutt/accounts/lin

set folder = "~/Mail/lin"

set spoolfile = "+Inbox"
set postponed = "+Drafts"
set record = "+Sent"
set trash = "+Trash"

按键绑定示例如下

~/.config/neomutt/keybind

# 'S' 同步邮件
macro index S "<shell-escape>mbsync -Va <enter>" "sync email"

# 'c' 改变当前文件夹
macro index 'c' '<change-folder>?<change-dir><home>^K=<enter>'

# vim 风格换行
bind pager j next-line
bind pager k previous-line

# 移动邮件快捷键
bind index,pager g noop
macro index,pager gi "<change-folder>=Inbox<enter>" "go to inbox"
macro index,pager gs "<change-folder>=Sent<enter>" "go to sent"
macro index,pager gd "<change-folder>=Drafts<enter>" "go to drafts"
macro index,pager gt "<change-folder>=Trash<enter>" "go to trash"
macro index,pager ga "<change-folder>=Archive<enter>" "go to archive"

# 快速切换用户
macro index <F2> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/lin<enter><change-folder>!<enter>'
macro index <F3> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/linAdmin<enter><change-folder>!<enter>'