Mutt
Mutt 是一款以功能强大著称的文本界面邮件客户端。虽然已有二十多年的历史,Mutt 仍然是大量高级用户的首选邮件客户端。
Mutt 主要致力于成为一个邮件用户代理 (MUA),最初是为了查看邮件而编写的。后来增加的实现(用于检索、发送和过滤邮件)与其它邮件应用相比显得比较简陋,因此,用户可能希望使用外部应用程序来扩展 Mutt 的功能。
尽管如此,Arch Linux 的 mutt 软件包在编译时已加入了 IMAP、POP3 和 SMTP 支持,消除了对外部应用程序的必然需求。
本文涵盖了使用原生 IMAP 发送和检索,以及依赖 OfflineIMAP 或 getmail (POP3) 检索邮件、在 POP3 情况下使用 procmail 过滤邮件,以及使用 msmtp 发送邮件的设置。
安装
安装 mutt 软件包。一个具有更多功能的流行分支是 neomutt。
(可选)为 IMAP 设置安装外部辅助程序,例如 isync 或 OfflineIMAP。
或者(如果使用 POP3)安装 getmailAUR、mpop、fetchmail 或 fdm 以及 procmailAUR。
- 如果你只需要 LOGIN 和 PLAIN 方法,依赖项 libsasl 即可满足需求。
- 如果你想要(或必须)使用 CRAM-MD5、GSSAPI 或 DIGEST-MD5,请安装软件包 cyrus-sasl-gssapi
- 如果你使用 Gmail 作为 SMTP 服务器,你可能需要安装软件包 cyrus-sasl
配置
本节涵盖了 #IMAP、#POP3、#Maildir 和 #SMTP 的配置。
默认情况下,Mutt 会在六个位置搜索其配置文件:~/.muttrc、~/.mutt/muttrc 和 $XDG_CONFIG_HOME/mutt/muttrc,首先尝试带 -MUTT_VERSION 后缀的文件,然后是不带后缀的。其中任何一个位置都可以使用。如果你决定将初始化文件放在别处,请使用 $ mutt -F /path/to/.muttrc。你还应该了解一些 Mutt 配置的前提。其语法非常接近 Bourne Shell。例如,你可以获取另一个配置文件的内容
source /path/to/other/config/file
你可以使用变量并将 shell 命令的结果分配给它们。
set editor=`echo \$EDITOR`
在这里 $ 符号被转义,以便在传递给 shell 之前不会被 Mutt 替换。另外请注意反引号的使用,因为 bash 语法的 $(...) 不起作用。Mutt 有许多预定义变量,但你也可以设置自己的变量。用户变量必须以 "my" 开头!
set my_name = "John Doe"
IMAP
原生 IMAP 支持
mutt 软件包在编译时已包含 IMAP 支持。至少,你需要在 muttrc 文件中加入四行代码才能访问邮件。
imap_user
set imap_user=USERNAME
set imap_user=your.username@gmail.com
imap_pass
如果不设置,系统会提示输入密码。
set imap_pass=SECRET
- 如果你在 Gmail 中启用了双重身份验证,并为 Mutt 添加了应用专用密码,你会希望在这里使用该密码,而不是你的常规 Gmail 密码。
- 如果你的密码包含井号
#,请将其放在单引号内(例如:'some#password')以便能够登录。否则,井号之后的部分将被视为注释。
folder
不要使用包含所有邮件(和目录)的本地目录,而是使用你的服务器(以及层级中最高的文件夹,如果需要)。
set folder=imap[s]://imap.server.domain[:port]/[folder/]
你不一定要使用 folder 变量,但如果你所有的其他文件夹都在 INBOX 内部,使用它会很方便。你在这里设置为 folder 的任何内容,稍后在 Mutt 中只需使用等号 (=) 或加号 (+) 即可访问。示例
set folder=imaps://imap.gmail.com/
应当注意,对于多个账号,最佳实践是使用不同的文件夹——例如配合 account-hook。如果你有多个 Gmail 账号,请使用
set folder=imaps://username@imap.gmail.com/
作为替代,其中你的账号是 username@gmail.com。这样就能区分不同的文件夹。否则会导致身份验证错误。
spoolfile
spoolfile 是(未过滤)邮件到达的文件夹。大多数邮件服务通常将其命名为 INBOX。现在你可以使用 '=' 或 '+' 作为上面配置的完整 folder 路径的替换。例如
set spoolfile=+INBOX
mailboxes
任何需要定期检查新邮件的 IMAP 文件夹都应在此列出
mailboxes =INBOX =family mailboxes imaps://imap.gmail.com/INBOX imaps://imap.gmail.com/family
或者,检查所有已订阅的 IMAP 文件夹(就像全部都用 mailboxes 行添加了一样)
set imap_check_subscribed
如果你想订阅所有文件夹,这两个版本是等价的。所以第二种方法方便得多,但第一种方法给你更多灵活性。此外,较新版本的 Mutt 默认配置了一个绑定到 'y' 键的宏,允许你切换到 mailboxes 下列出的任何文件夹。
如果你不设置此变量,默认将使用 spoolfile。此变量对 #侧边栏 也很重要。
总结
使用这些选项,你就能启动 Mutt,输入 IMAP 密码,并开始阅读邮件。这是一个 muttrc 片段(针对 Gmail),其中包含了一些你可能考虑添加的增强 IMAP 支持的其他配置。
set folder = imaps://imap.gmail.com/ set imap_user = your.username@gmail.com set imap_pass = your-imap-password set spoolfile = +INBOX mailboxes = +INBOX # Store message headers locally to speed things up. # If hcache is a folder, Mutt will create sub cache folders for each account which may speeds things up even more. set header_cache = ~/.cache/mutt # Store messages locally to speed things up, like searching message bodies. # Can be the same folder as header_cache. # This will cost important disk usage according to your e-mail amount. set message_cachedir = "~/.cache/mutt" # Specify where to save and/or look for postponed messages. set postponed = +[Gmail]/Drafts # Allow Mutt to open a new IMAP connection automatically. unset imap_passive # Keep the IMAP connection alive by polling intermittently (time in seconds). set imap_keepalive = 300 # How often to check for new mail (time in seconds). set mail_check = 120
外部 IMAP 支持
虽然 Mutt 内置了 IMAP 支持,但它不会下载邮件供离线使用。可以使用 OfflineIMAP 或 isync 等外部应用程序将邮件下载到本地文件夹,然后再由 Mutt 处理。
考虑使用 spamassassin 或 imapfilterAUR 等程序来对邮件进行分类。
POP3
mutt 软件包在编译时已包含 POP3 支持,可通过 muttrc(5) 中描述的 pop_* 变量进行配置。
或者,可以使用外部程序通过 POP3 获取邮件。一种流行的选择是使用 getmail 检索,并使用 procmail 过滤邮件。
Maildir
Maildir 是一种通用的标准化格式。几乎每个 MUA 都能处理 Maildirs,且 Mutt 对其支持非常出色。只需在 muttrc 中添加以下几行即可让 Mutt 使用它们
set mbox_type=Maildir set folder=~/mail set spoolfile=+/ set header_cache=~/.cache/mutt
这是一个最小化配置,可启用对 Maildir 的访问并检查 INBOX 中的新本地邮件。此配置还缓存邮件头以加速目录列表。此功能可能在某些构建中未启用(但在 Arch 软件包中肯定启用了)。请注意,这不会以任何方式影响 OfflineIMAP。它始终同步服务器上的所有目录。spoolfile 告诉 Mutt 轮询哪些本地目录以获取新邮件。你可能想要添加更多 spoolfiles(例如邮件列表的目录)等。但这属于 Mutt 手册范畴,超出了本文的范围。
SMTP
无论你使用 POP 还是 IMAP 接收邮件,你可能仍会使用 SMTP 发送邮件。
文件夹
这里基本上只有一个重要的文件夹:保存所有已发送电子邮件的文件夹。
set record = +Sent
Gmail 会自动将发送的邮件保存到 +[Gmail]/Sent,因此我们不希望产生副本。
unset record
原生 SMTP 支持
mutt 软件包在编译时已包含 SMTP 支持。
以下是常见的 SMTP 设置
set realname = 'Your Real Name' set from = your-email-address set smtp_pass = $imap_pass set ssl_force_tls = yes
如果你的 SMTP 服务器基于 STARTTLS,请添加以下内容
set smtp_url=smtp://$imap_user@smtp.domain.tld:587 set ssl_starttls = yes
如果你的 SMTP 服务器基于 SMTPS,请改加以下内容
set smtp_url=smtps://$my_user@smtp.domain.tld
如果你的 SMTP 凭据与 IMAP 凭据不同,那么你必须使用正确的凭据代替 $imap_user 和 $imap_pass。
如果你收到类似 SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 的错误,说明你的服务器可能使用的是 STARTTLS 而非 SMTPS。
如果你的服务器使用 LOGIN 身份验证方法,你可能需要明确指定它,尽管手册声称默认会尝试所有方法
set smtp_authenticators = "login"
更多信息请参见 muttrc(5)。
外部 SMTP 支持
也可以使用外部 SMTP 代理,如 msmtp、sSMTP 或 opensmtpd。
muttrc 中的 sendmail 变量决定了 mutt 用于投递邮件的程序和参数。任何额外的参数都必须被该程序解释为收件人地址。
例如,如果使用 msmtp
muttrc
set realname='Disgruntled Kangaroo' set sendmail="/usr/bin/msmtp" set edit_headers=yes set folder=~/mail set mbox=+mbox set spoolfile=+inbox set record=+sent set postponed=+drafts set mbox_type=Maildir mailboxes +inbox +lovey-dovey +happy-kangaroos
从 Mutt 发送邮件
现在,启动 mutt
你应该能在 ~/mail/inbox 中看到所有邮件。按 m 撰写邮件;它将使用由 EDITOR 环境变量定义的编辑器。如果未设置此变量,你可以在启动 Mutt 之前修复它
$ export EDITOR=your-favorite-editor $ mutt
你也可以在 Mutt 配置文件中设置编辑器
.muttrc
set editor=your-favorite-editor
出于测试目的,请将信写给自己。写完信后,保存并退出编辑器。你将返回 Mutt,它现在会显示关于你邮件的信息。按 y 发送。
q,Mutt 会询问你 Postpone this message? ([yes]/no)。这实际上是在问你是否要保存刚刚写的消息。如果你按 "n"(可能是因为你想再次编辑消息),消息将被永久删除。使用 Mutt 时,请始终记住 "Postpone this message?" 的真实含义是 "保存此消息?"。多账号
现在你应该至少为一个账号配置好了。你可能会好奇如何使用多个账号,因为我们将所有内容都放在了一个文件中。
你只需要将特定于账号的参数写入各自的文件中并加载 (source) 它们即可。每个账号的所有 IMAP/POP3/SMTP 配置都应该进入其各自的文件夹。
得益于其最强大的功能之一:钩子 (hooks),Mutt 可以处理这种情况。钩子本质上是在特定动作之前执行的命令。有多种钩子可用。对于多账号,你必须使用 account-hooks 和 folder-hooks。
- Folder-hooks 将在切换文件夹之前运行命令。这在切换到特定文件夹时设置合适的 SMTP 参数非常有用。例如,当你在工作邮箱中并发送电子邮件时,它会自动使用你的工作账号作为发件人。
- Account-hooks 会在 Mutt 每次调用与账号相关的函数(如 IMAP 同步)时运行命令。它不要求你切换到任何文件夹。
钩子有两个参数
account-hook [!]regex command folder-hook [!]regex command
正则表达式是要匹配的文件夹(如果前面有 ! 则为不匹配)。命令告诉该执行什么。
让我们来看一个完整的例子
.muttrc
## General options set header_cache = "~/.cache/mutt" set imap_check_subscribed set imap_keepalive = 300 unset imap_passive set mail_check = 60 set mbox_type=Maildir ## ACCOUNT1 source "~/.mutt/work" # Here we use the $folder variable that has just been set in the sourced file. # We must set it right now otherwise the 'folder' variable will change in the next sourced file. folder-hook $folder 'source ~/.mutt/work' ## ACCOUNT2 source "~/.mutt/personal" folder-hook *user@gmail.com/ 'source ~/.mutt/personal' folder-hook *user@gmail.com/Family 'set realname="Bob"'
.mutt/work
## Receive options. set imap_user=user@gmail.com set imap_pass=**** set folder = imaps://user@imap.gmail.com/ set spoolfile = +INBOX set postponed = +Drafts set record = +Sent ## Send options. set smtp_url=smtps://user:****@smtp.gmail.com set realname='User X' set from=user@gmail.com set hostname="gmail.com" set signature="John Doe" # Connection options set ssl_force_tls = yes unset ssl_starttls ## Hook -- IMPORTANT! account-hook $folder "set imap_user=user@gmail.com imap_pass=****"
最后 .mutt/personal 应该与 .mutt/work 类似。
现在所有的账号都设置好了,启动 Mutt。要从一个账号切换到另一个,只需更改文件夹(c 键)。或者你可以使用 侧边栏。
要更改不同邮箱的文件夹,你必须输入完整地址——对于 IMAP/POP3 文件夹,这可能相当不便——让我们为此绑定一些按键。
## Shortcuts macro index,pager <f2> '<sync-mailbox><enter-command>source ~/.mutt/personal<enter><change-folder>!<enter>' macro index,pager <f3> '<sync-mailbox><enter-command>source ~/.mutt/work<enter><change-folder>!<enter>'
使用上述快捷键(或使用侧边栏),你会发现更改文件夹(默认是 c)不是上下文相关的,也就是说 它不会列出当前邮箱的文件夹,而是显示上次更改文件夹时使用的邮箱文件夹。为了使行为更符合上下文,窍门是为当前邮箱按 = 或 +。你可以使用以下宏将其自动化
macro index 'c' '<change-folder>?<change-dir><home>^K=<enter>'
备选方案
另一种配合多账号使用 mutt 的方法是运行多个 mutt 实例。你可以在 .muttrc 中保留通用设置,并在各自的文件中保留特定于账号的设置。现在你可以从特定账号的配置文件中加载 (source) .muttrc。这种方法的优点是访问不同账号不需要切换文件夹,从而改进了工作流并节省了时间。例如,
.muttrc
## General options set header_cache = "~/.cache/mutt" set imap_check_subscribed set imap_keepalive = 300 unset imap_passive set mail_check = 60 set mbox_type=Maildir
.mutt/work
source .muttrc ## Receive options. set imap_user=user@gmail.com set imap_pass=**** set folder = imaps://user@imap.gmail.com/ set spoolfile = +INBOX set postponed = +Drafts set record = +Sent ## Send options. set smtp_url=smtps://user:****@smtp.gmail.com set realname='User X' set from=user@gmail.com set hostname="gmail.com" set signature="John Doe" # Connection options set ssl_force_tls = yes unset ssl_starttls
最后 .mutt/personal 应该与 .mutt/work 类似。现在你可以运行 mutt:
mutt -F .mutt/work mutt -F .mutt/personal
或者在你的 .bashrc 中创建别名 mutt_work
alias mutt_work="mutt -F .mutt/work" alias mutt_personal="mutt -F .mutt/personal"
或者写一个脚本一举启动所有 mutt 实例,
#!/bin/sh lxterminal -e mutt -F .mutt/work lxterminal -e mutt -F .mutt/personal
密码管理
请记住,在 .muttrc 中写入密码存在安全风险。一种解决方案是始终手动输入密码,但这变得非常繁琐。
GPG
另一种解决方案是使用 GnuPG 将你的密码加密在一个文件中。如果你还没有设置自己的密钥对,请先设置。在 tmpfs 中创建一个内容如下的文件
set my_pass = "password"
my_ 开头。然后将此文件加密,设置你自己为收件人并移动到可访问的位置。在此示例中,加密文件位于 $HOME/.my-pwds.gpg。
在你的 mutt 配置文件中,在任何账号之前添加以下内容
source "gpg -dq $HOME/.my-pwds.gpg |"
这会静默解密文件并在本例中设置变量 my_pass。这可以在加载后用于任何变量。例如
set imap_pass=$my_pass
如果你使用外部工具(如 OfflineIMAP 和 msmtp),你需要设置一个代理(例如 gpg-agent,请参见 GnuPG#gpg-agent)来将密码保留在缓存中,从而避免这些工具总是提示输入密码。
Pass
你也可以使用 pass 轻松地加密密码。只需如下所示将密码添加到给定的密码中
pass add user@domain.tld
之后,只需在 muttrc 中添加命令 pass show user@domain.tld 即可,例如
set imap_pass="`pass show user@domain.tld`"
注意同时使用了反引号和普通引号,以防止反引号的输出被进一步解析[1]。
安全性担忧
如果 UI 中可以使用 enter-command,则可以看到未加密的密码,如果除了你之外还有人可以在 Mutt 运行时访问你的会话,这可能不是你想要的。出于此原因,你可能希望禁用它。结果是,用户打算使用的每个命令都必须预先绑定到一个键,否则将永远无法访问。
.muttrc
bind generic,alias,attach,browser,editor,index,compose,pager,pgp,postpone ':' noop
技巧与提示
开始使用和自定义 Mutt 的指南
- My first Mutt (由 Bruno Postle 维护)
- The Woodnotes Guide to the Mutt Email Client (由 Randall Wood 维护)
- The Homely Mutt (由 Steve Losh 编写)
- Everything You Need To Know To Start Using GnuPG with Mutt (由 Justin R. Miller 编写)
- 经常与 Neomutt 结合使用的有用程序列表
如果你有任何关于 Mutt 的具体问题,欢迎在 Arch IRC 频道提问。
按键绑定
默认按键绑定与常见的 Emacs 类或 Vi 类绑定相去甚远。你可以根据自己的偏好进行自定义。Mutt 对分页器、索引、附件视图等有不同的绑定集。因此,在绑定键时,你需要指定要修改哪个 map。你可以从 Mutt 的帮助页面查看命令和按键绑定列表(默认键:?)。Vi 类绑定示例
muttrc
## h to exit in every menu, l to go deeper, j and k for up and down, g and G for top and bottom bind pager,browser h exit bind attach,alias h exit bind pager l view-attachments bind pager k previous-line bind pager j next-line bind pager g top bind pager G bottom bind index j next-entry bind index k previous-entry bind attach,index g first-entry bind attach,index G last-entry bind index l display-message bind attach l view-attach bind browser,alias l select-entry bind index / search ## default binding for limit is l bind index ? limit ## default binding for help is ? bind index,pager,attach <F1> help ## default binding for header view (toggle-weed) is h bind pager H display-toggle-weed bind attach,index,pager \CD next-page bind attach,index,pager \CU previous-page
撰写
加密和签名邮件 (GnuPG)
要在 mutt 中使用 GnuPG 开始加密邮件,请将 /usr/share/doc/mutt/samples/gpg.rc 复制到你的 mutt 配置文件夹(例如 ~/.mutt/gpg.rc)。然后将以下内容追加到你的 mutt 配置文件(例如 ~/.mutt/muttrc)中
source ~/.mutt/gpg.rc
大多数加密选项在撰写视图中按 p 即可使用。
参见 muttrc(5) 中的 pgp_* 和 crypt_* 选项。
电子邮件字符编码
使用 Mutt 时,有两个级别必须指定字符集
- 撰写电子邮件所使用的文本编辑器必须以所需的编码保存它。
- 然后,Mutt 会检查电子邮件,并根据你在
send_charset变量中指定的优先级决定哪种编码更合适。默认值为:"us-ascii:iso-8859-1:utf-8"。
所以如果你写的电子邮件包含了 ISO-8859-1 允许的字符(如 'résumé'),但没有 Unicode 特有的字符,那么 Mutt 会将编码设置为 ISO-8859-1。
要避免此行为,请在 muttrc 中设置变量
set send_charset="us-ascii:utf-8"
甚至
set send_charset="utf-8"
将使用从左侧开始的第一个兼容字符集。由于 UTF-8 是 US-ASCII 的超集,将其放在 UTF-8 前面并无大碍,它可以确保旧的 MUA 在看到电子邮件头中的字符集时不会感到困惑。
自定义邮件头
Mutt 最棒的地方之一就是你可以完全控制邮件头。
首先,让邮件头在你写邮件时可编辑
set edit_headers=yes
Mutt 还有一个特殊函数 my_hdr 用于自定义邮件头。是的,它的名字听起来像变量,但实际上它是一个函数。
你可以完全清除它,在切换具有不同邮件头的账号时你应该这样做,否则它们会重叠
unmy_hdr *
其他变量也会对邮件头产生影响,所以在用 my_hdr 之前最好先清除它们
unset use_from unset use_domain unset user_agent
现在,你可以使用以下语法向邮件头添加任何你想要的字段——甚至是由于非标准字段
my_hdr <FIELD>: <VALUE>
注意 <VALUE> 可以是命令的结果。
示例
## Extra info. my_hdr X-Info: Keep It Simple, Stupid. ## OS Info. my_hdr X-Operating-System: `uname -s`, kernel `uname -r` ## This header only appears to MS Outlook users my_hdr X-Message-Flag: WARNING!! Outlook sucks ## Custom Mail-User-Agent ID. my_hdr User-Agent: Every email client sucks, this one just sucks less. ## Receive copy of sent mail in your inbox my_hdr Cc: $imap_user
签名档
在你的家目录创建一个 .signature。你的签名将附加在电子邮件的末尾。或者你也可以在 Mutt 配置中指定一个文件
set signature="path/to/sig/file"
随机签名
你可以使用 fortune (软件包 fortune-mod) 在 Mutt 中添加随机签名。
创建一个 fortune 文件,然后将以下行添加到你的 .muttrc
set signature="fortune pathtofortunefile|"
注意末尾的管道符。它告诉 Mutt 指定的字符串不是文件,而是命令。
从命令行撰写和发送
Man 页面会显示所有可用命令及用法,这里有几个例子。你可以利用 .bash_profile 在登录时触发 Mutt 来发送警报、日志或其他系统信息,或者作为定期的 cron 任务。
发送一条消息
mutt -s "Subject" somejoeorjane@someserver.com < /var/log/somelog
发送一条带附件的消息
mutt -s "Subject" somejoeorjane@someserver.com -a somefile < /tmp/sometext.txt
撰写 HTML 电子邮件
既然 Mutt 没有所见即所得 (WYSIWIG) 客户端,HTML 就变得非常直截了当,而且因为你直接编辑源代码,所以能做的比周围所有 WYSIWIG 邮件客户端多得多。只需使用 HTML 语法撰写邮件。例如
This is normal text<br> <b>This is bold text</b>
现在在发送邮件之前,使用 edit-type 命令(默认快捷键 Ctrl+t),并将 text/plain 替换为 text/html。
撰写时显示另一封邮件
Mutt 的一个常见槽点是,在撰写新邮件(或回复)时,你无法在不关闭当前邮件(推迟)的情况下打开另一封邮件(例如,为了与其他联系人核对)。以下是解决方案:
首先,像往常一样启动 Mutt。然后,启动另一个终端窗口。现在用以下命令启动一个新的 Mutt
mutt -R
这将以只读模式启动 Mutt,你可以随意浏览其他电子邮件。强烈建议始终以只读模式启动第二个 Mutt,否则容易产生冲突。
c 或 y)时,只读模式不会保留。必须改用 Esc c。打印
你可以安装 muttprintAUR 获得更美观的打印质量。在你的 muttrc 文件中,插入
set print_command="/usr/bin/muttprint %s -p {PrinterName}"
查看内容
在浏览器中查看 URL
这可以通过 urlscan、urlviewAUR 或 extract_urlAUR 完成。要使用 urlscan,请安装 urlscan 并将下方内容插入 mutt 配置文件。
macro index,pager \cb "<pipe-message> urlscan<Enter>" "call urlscan to extract URLs out of a message" macro attach,compose \cb "<pipe-entry> urlscan<Enter>" "call urlscan to extract URLs out of a message"
按 Ctrl+b 将列出邮件中所有的 URL。BROWSER 环境变量可用于选择默认浏览器。
默认键绑定可以通过 F1 键列出。除非需要额外的键绑定或配色方案,否则无需为 urlscan 创建配置文件。如果需要,可以使用以下命令在 ˜/.config/urlscan/config.json 创建默认配置文件。
urlscan -g
要使用 urlview 代替 urlscan,请安装 urlviewAUR 软件包并在 mutt 配置文件中添加以下几行。
macro index,pager \cb "<pipe-message> urlview<Enter>" "call urlview to extract URLs out of a message" macro attach,compose \cb "<pipe-entry> urlview<Enter>" "call urlview to extract URLs out of a message"
在 $HOME 创建一个 .urlview 并插入以下内容
REGEXP (((http|https|ftp|gopher)|mailto)[.:][^ >"\t]*|www\.[-a-z0-9.]+)[^ .,;\t>">\):] COMMAND <your-browser> %s
在使用 mutt 时按 Ctrl+b 将列出邮件中所有的 URL。用方向键上下导航,并在所需的 URL 上按回车。你的浏览器将启动并跳转到选定的站点。
某些浏览器需要额外的参数才能正常工作。例如,Luakit 会在 Mutt 退出时关闭。你需要使用 -n 参数将其切换到后台运行
COMMAND luakit -n %s 2>/dev/null
2>/dev/null 是为了保持安静,即防止在不想要的地方打印无用信息。
查看 HTML
可以将 HTML 正文传递给外部 HTML 程序然后输出,保持邮件查看的统一且不干扰。这里介绍了三个程序:lynx、w3m 和 elinks(确保已安装所选软件包)。
如果 ~/.mutt/mailcap 不存在,你需要创建它并保存以下内容。
text/html; lynx -assume_charset=%{charset} -display_charset=utf-8 -collapse_br_tags -dump %s; nametemplate=%s.html; copiousoutput
或者,若是 w3m:
text/html; w3m -I %{charset} -T text/html; copiousoutput;
或者,若是 elinks:
text/html; elinks -dump; copiousoutput;
或者,若是 elinks(带色彩支持):
text/html; elinks -dump -dump-color-mode 1; copiousoutput;
编辑 ~/.muttrc 并添加以下内容:
set mailcap_path = ~/.mutt/mailcap
要在 lynx、w3m 或 elinks 中自动打开 HTML 消息,请在 muttrc 中添加额外这一行:
auto_view text/html
这种做法的美妙之处在于,你看到的不是作为源码的 HTML 正文或由单独程序打开的正文,而是在当前窗口直接看到格式化的内容(如 lynx 呈现的),且邮件内的任何 URL 链接都可以通过 Ctrl+b 显示(假设你已安装并按上文配置了 urlscan)。
如果你收到的许多邮件具有多重或备选编码,Mutt 可能会默认将每封邮件都视为 HTML。为避免这种情况,请在 ~/.muttrc 中添加以下变量,使 Mutt 在可用时默认使用文本,并在邮件中没有文本版本时才使用 w3m/lynx:
alternative_order text/plain text/html
某些 HTML 邮件可能无法在基于文本的浏览器中正确显示。作为后备方案,你可以绑定一个键,在这种情况下打开图形浏览器。以下宏将在环境中定义的 Web 浏览器中打开从附件视图中选定的 HTML 邮件。(可以根据需要调整 ~/.cache/mutt/ 文件夹)。
macro attach 'V' "<pipe-entry>iconv -c --to-code=UTF8 > ~/.cache/mutt/mail.html<enter><shell-escape>$BROWSER ~/.cache/mutt/mail.html<enter>"
如果 $BROWSER 是 firefox,则在 about:config 中将 intl.charset.fallback.utf8_for_file 设置为 true,如 [2] 所述,以确保 HTML 页面中的非 ASCII 字符能正确显示。
要将 HTML 邮件转换为简洁的 markdown 并使用 mutt 的内置分页器查看结果输出,请安装 python-html2text 并使用以下 mailcap 条目
text/html; html2text --images-to-alt --ignore-tables --decode-errors=ignore %s; copiousoutput
查看 PDF 文件
你也可以使用类似于 mailcap HTML 查看的配置来查看 PDF 附件。
例如,要使用 zathura 打开,请在 mailcap 文件中添加以下行:
application/pdf; zathura %s;
然后在附件部分对 PDF 文件按 ENTER,系统将打开一个 zathura 实例显示该文件。
这也可以搭配其他 PDF 阅读器完成。
过滤消息视图
你可以使用 limit 命令(默认快捷键:l)限制视图,仅显示符合特定模式和属性的电子邮件。
要查看邮件头中包含 "foo" 的所有电子邮件,只需输入 "foo" 即可。要移除过滤器,使用 "all" 关键字。
要查看所有标记的消息,请使用:
~F
要查看大小 ≥1MB 且来自 johndoe 的所有未读邮件,请使用:
~U (~z 1M- | ~f johndoe)
所有可能的模式都列在 官方手册中。
会话分组
默认排序顺序是按日期。使用 sort-mailbox 命令(默认键:o)更改排序选项。你可以将会话/线程分组,在这种情况下,你可以定义如何对线程进行排序,以及如何在一个线程内进行排序。
在以下示例中,线程根据其最后一封电子邮件的日期进行排序。
muttrc
set sort=threads set sort_aux=last-date-received
配置配合 mutt 使用的编辑器
vim
- 要将文本宽度限制为 72 个字符,请编辑你的 .vimrc 文件并添加:
au BufRead /tmp/mutt-* set tw=72
- 另一种选择是使用 Vim 的 mail 文件类型插件,以启用 72 字符宽度之外的其他以邮件为中心的选项。编辑
~/.vim/filetype.vim,如果不存在则创建它,并添加:
augroup filetypedetect " Mail autocmd BufRead,BufNewFile *mutt-* setfiletype mail augroup END
- 要设置不同的 tmp 目录(例如 ~/.tmp),请在 muttrc 中添加如下行:
set tmpdir="~/.tmp"
- 要重新格式化修改后的文本,请参见 Vim 上下文帮助:
:h 10.7
GNU nano
nano 是另一个适合与 Mutt 搭配使用的控制台编辑器。
要将文本宽度限制为 72 个字符,请编辑你的 .nanorc 文件并添加:
set fill 72 set breaklonglines
如果你不想全局限制文本宽度,可以在 muttrc 文件中将列号作为硬换行选项的参数传递,例如:
set editor="nano -r 72 -b"
此外,在 muttrc 文件中,你可以指定开始编辑的行,以便跳过邮件头:
set editor="nano +7"
Emacs
Emacs 有一个 mail 模式和一个 message 主模式。要在从 Mutt 调用 Emacs 时自动切换到邮件模式,你可以将以下内容添加到 .emacs:
.emacs
;; Mutt support.
(add-to-list 'auto-mode-alist '("/tmp/mutt.*" . mail-mode))
;; Neomutt support.
(add-to-list 'auto-mode-alist '("/tmp/neomutt-" . mail-mode))
如果你通常运行 Emacs 守护进程,你可能希望 Mutt 连接到它。将此添加到你的 .muttrc:
.muttrc
set editor="emacsclient -a \"\" -t"
显示设置
颜色
将 /usr/share/doc/mutt/samples/colors.linux 的内容追加到你的 .muttrc 文件,或者复制并加载 (source) 它。然后根据你的喜好进行调整。
每个设置产生的实际颜色取决于你 ~/.Xresources 文件中设置的颜色。
或者,你可以加载任何包含颜色的文件(从而作为主题文件使用)。有关主题示例,请参见 [3]。
索引格式
以下是一个可以放入 .muttrc 以自定义索引格式(即文件夹视图中显示的列)的简短示例。
set date_format="%y-%m-%d %T" set index_format="%2C | %Z [%d] %-30.30F (%-4.4c) %s"
详见 Mutt 参考、strftime(3) 和 printf(3)。
在“已发送”文件夹视图中显示收件人而非发件人
默认情况下,Mutt 在 index_format 变量中使用 %L 格式字符串,它将显示:
- 如果 "To:" 或 "Cc:" 邮件头字段中的地址与用户
subscribe命令定义的地址匹配,则显示 "To <list-name>"。 - 否则显示作者姓名,或者如果消息来自你,则显示收件人姓名。
如果你在同一个邮箱中使用多个电子邮件地址,请确保配置 alternates 变量,以便 Mutt 知道哪些邮件是你发送的。
muttrc
alternates ^me@example.COM$ ^me@example.NET$ ^example@archlinux.ORG$
变量列宽
如果你调整窗口大小,主题可能会被截断,而发件人等某些字段仍有剩余空间。你可以使用 shell 调用 tput cols 来获取终端支持的最大列数(即宽度)。有了这个值,你可以为发件人和主题等字段设置宽度的百分比。
使用上述 folder-hook 和 24 像素侧边栏宽度的示例:
muttrc
## From field gets 30% of remaining space, Subject gets 70%.
## Remaining space is the total width minus the other fields (35), minus the sidebar (24)
set my_index_format_pre='set my_col_from = `echo $((30 * ($(tput cols)-35-24) / 100))`; set my_col_subject = `echo $((70 * ($(tput cols)-35-24) / 100))`; set index_format="%2C | %Z [%d] %-$my_col_from.${my_col_from}'
set my_index_format_post=' (%-4.4c) %?M?<%M> ?%-$my_col_subject.${my_col_subject}s"'
folder-hook .*[sS]ent.* "$my_index_format_pre"t"$my_index_format_post"
folder-hook ! .*[sS]ent.* "$my_index_format_pre"F"$my_index_format_post"
我们必须在钩子内部设置变量 my_col_from 和 my_col_subj。否则,列值将不会重新计算。
我们可以添加一个绑定,在不更换文件夹的情况下强制重新计算索引格式:
muttrc
macro index,pager \CL "<enter-command>$my_index_format_pre"F"$my_index_format_post<enter><redraw-screen>"
侧边栏
侧边栏的示例设置位于 /usr/share/doc/mutt/samples/sample.muttrc-sidebar,包括按键绑定。复制、编辑并加载该文件。确保将 set sidebar_visible = yes 修改为开启。
追加以下内容以切换侧边栏的显示/隐藏:
bind index,pager B sidebar-toggle-visible
请注意,使用 mailboxes 选项时,如果你不使用 sidebar_sort_method 选项,文件夹将按它们被设置到 mailboxes 的顺序显示。
mailboxes "+-- My mailbox -----------"
在分页视图上方显示索引
在你的 muttrc 中设置以下变量:
set pager_index_lines=10
联系人管理
地址别名
Aliases (别名) 是 Mutt 管理联系人的方式。别名的格式是 nickname [longname] <address>。
- nickname (昵称) 是你在 Mutt 中输入以获取联系人地址的内容。仅限一个单词,且应易于记忆。
- longname (全名) 是可选的。可以是多个单词。
- <address> (地址) 必须是有效形式(即带有
@)。
这其实很简单。将其添加到 .muttrc 中:
set alias_file = "~/.mutt/aliases" set sort_alias = alias set reverse_alias = yes source $alias_file
说明
alias_file是从 Mutt 内部添加别名时信息存储的文件。sort_alias指定在 Mutt 中显示别名列表时按哪个字段排序。可能的值:alias, address。reverse_alias如果设为 yes,Mutt 在索引菜单中发现匹配发件人的别名时,将显示来自你别名的“个性化”姓名。source $alias_file告诉 Mutt 在启动时读取别名。自动补全需要此项。
现在,当提示 To: 时,你只需输入别名而不是完整地址。它的美妙之处在于你可以使用 Tab 自动补全别名。对错误或空字符串进行自动补全将显示完整列表。你可以像往常一样选择别名,或通过输入其索引号来选择。
有两种创建别名的方法
- 在 Mutt 中,当选中目标人物的电子邮件时,按
a。 - 手动编辑 alias_file。语法非常简单:
alias nickname Long Name <my-friend@domain.tld>
Abook
abookAUR 是一款专门用于联系人管理的独立程序。它使用简单的文本界面,联系人存储在纯文本、人类可读的数据库中。此外,联系人属性是可扩展的(生日、地址、传真等)。
Abook 专门设计为与 Mutt 接口,因此它可以作为 Mutt 内部别名的功能齐全的替代品。如果你想使用 Abook 代替别名,请移除 .muttrc 中的别名配置并添加:
muttrc
## Abook set query_command= "abook --mutt-query '%s'" macro index,pager a "<pipe-message>abook --add-email-quiet<return>" "Add this sender to Abook" bind editor <Tab> complete-query
有关详情和完整配置示例,请参见 abook(1) 和 abookrc(5)。
Goobook
Goobook 允许你从命令行或在 Mutt 中搜索 Google 联系人,可通过 goobookAUR 或 goobook-gitAUR 软件包安装。
使用 goobook 之前,必须配置 ~/.goobookrc。要生成默认模板:
$ goobook config-template > ~/.goobookrc
查看 ~/.goobookrc 以获取配置选项。至少需要输入你的电子邮件 (email)和密码 (password)。
为了向 Google 进行身份验证,你必须生成一个 Client ID 和 Client secret。详见 [4]。
如果你想使用 Goobook 而非别名,请移除 .muttrc 中的任何别名配置并添加:
muttrc
## GooBook set query_command="goobook query '%s'" macro index,pager a "<pipe-message>goobook add<return>" "add sender to google contacts" bind editor <Tab> complete-query
在 mutt 中撰写邮件时,Tab 现在将搜索你的 Google 联系人。查看消息时,按 a 将把发件人添加到 Google 联系人。
Khard
khard 是一款使用本地存储的 carddav 通讯录条目的命令行通讯录。你可以使用 vdirsyncer 或其后继者 pimsync 将这些与 CardDAV 服务器同步。
其在 mutt 中的集成类似于 abook,请参见 khard 文档。
管理多个发件人账号
如果你使用多个发件人账号,可以自动将特定的发件人账号与收件人关联。mutt-vidAUR 扫描已发送邮件,寻找与特定收件人关联的最新 "From" 详情,并将这些信息保存到一个文件中供 mutt 加载。下次你给该收件人写邮件时,mutt 将自动调用 send-hook,使用你之前用过的相同邮箱和真实姓名。详情请见 mutt-vid 的 主页。
手动请求 IMAP 邮件检索
如果你不想等待下一次自动 IMAP 获取(或者你没有启用它),你可能希望手动获取邮件。有一个 mutt 命令 imap-fetch-mail 可以做到这一点。或者,你可以将其绑定到一个键:
bind index "^" imap-fetch-mail
避免在大(IMAP)文件夹上因着色导致的索引缓慢
基于正则表达式的索引高亮很棒,但如果你的正则表达式检查邮件正文,可能会导致文件夹查看变慢。
使用 folder-hook 仅在例如收件箱中进行高亮(如果你能有效地清空收件箱):
folder-hook . 'uncolor index "~b \"Hi Joe\" ~R !~T !~F !~p !~P"' folder-hook ""!"" 'color index brightyellow black "~b \"Hi Joe\" ~N !~T !~F !~p !~P"'
加速文件夹切换
将此添加到你的 .muttrc:
set sleep_time = 0
归档已处理的邮件
当你阅读一封邮件时,你有四个选择:回复它、标记它、归档它或删除它。如果你记住了这一点,就可以通过这个宏保持收件箱精简(针对 Gmail 设置):
macro index \' "<tag-pattern>~R !~D !~F<enter>\ <tag-prefix><save-message>+[Gmail]/All <enter>" \ "Archive"
在不同电脑之间迁移邮件
如果你正在将邮件转移到一台新机器(复制和粘贴),你可能需要删除邮件头缓存(如果你按照上述配置,是一个像 ~/.cache/mutt 的文件或文件夹),以使 Mutt 能够读取迁移后的电子邮件。否则 Mutt 可能会卡死。
注意,如果你为邮件头缓存创建了文件夹,每个邮箱都会有自己的缓存文件,所以你可以单独删除缓存,而无需移除所有内容。
保存附件的默认文件夹
默认情况下,Mutt 会将附件保存到启动时所在的文件夹。如果你想始终将默认目标设置为 ~/attachments,可以创建以下别名,它会在该文件夹中启动 Mutt:
alias mutt='cd ~/attachments && mutt'
如果你使用的是 bash,可以使用 pushd 和 popd 在 mutt 退出后恢复目录状态。
alias mutt='pushd ~/attachments; mutt; popd'
分页器行为
转到下一页时显示上下文行
set pager_context=3
到底部停止而不是显示下一封邮件
set pager_stop=yes
快速回复
默认情况下,当你回复邮件时,Mutt 会要求确认收件人和主题。它还会问你是否要在回答中包含原邮件。如果你觉得你会一直坚持使用默认值,可以设置 Mutt 跳过这些问题:
muttrc
set fast_reply=yes set include=yes
发送前你仍然可以编辑收件人和主题。
在群体回复中忽略自己的电子邮件地址
当你向你被抄送的邮件进行群体回复时,Mutt 会将你的电子邮件地址包含在收件人列表中。你可以通过以下方式要求 Mutt 忽略某些地址:
alternates mail1@server1|mail2@server2|...
IMAP 消息缓存
使用内置 IMAP 支持时,电子邮件默认获取到内存中。多次检索大邮件会从 IMAP 服务器多次下载。
或者,你可以要求 Mutt 将所有获取的消息存储在磁盘上:
muttrc
set message_cachedir=~/.cache/mutt/messages
(该文件夹必须存在。)这将使未来的检索瞬间完成,即使带有大附件。
如果你想从超出限制(例如 50MB)的缓存中清除最旧的邮件,可以使用如下脚本:
~/.mutt/purgecache.sh
#!/bin/sh
## In KB.
CACHE_LIMIT=51200
cd "$1" 2>/dev/null
[ $? -ne 0 ] && exit
[ $(du -s . | cut -f1 -d' ') -lt $CACHE_LIMIT ] && exit
while IFS= read -r i; do
rm "$i"
[ $(du -s . | cut -f1 -d' ') -lt $CACHE_LIMIT ] && exit
done <<EOF
$(find . -type f -exec ls -rt1 {} +)
EOF
并在启动时调用它:
muttrc
set message_cachedir=~/.cache/mutt/messages source "~/.mutt/purgecache.sh '$message_cachedir'|"
在后台打开附件或查看 HTML 邮件
默认情况下,在 mutt 中打开附件会阻塞 mutt。你可以编辑 ~/.mutt/mailcap 在末尾添加 &,这样 mutt 就会在后台启动其中一个 默认应用程序。以 xdg-open 为例:
text/html; xdg-open %s &> /dev/null &; nametemplate=%s.html application/*; xdg-open %s &> /dev/null &; image/*; xdg-open %s &> /dev/null &;
&> /dev/null 用于防止任何错误或消息干扰 mutt 终端窗口。使用 nametemplate=%s.html 是因为 chromium 拒绝在没有 .html 扩展名的情况下将本地文件渲染为 HTML。
故障排除
Backspace 键在 Mutt 中不起作用
这是某些类 xterm 终端的常见问题。两种解决方案:
- 要么在
.muttrc中重新绑定该键:
bind index,pager ^? previous-line
请注意 ^? 是 脱字符表示法 (caret notation) 中代表退格键的单个字符。在 Emacs 中输入请使用 Ctrl+q Backspace,在 Vim 中使用 Ctrl+v Backspace。
- 要么修复你的终端
$ infocmp > termbs.src
编辑 termbs.src 将 kbs=^H 更改为 kbs=\177,然后执行:
$ tic -x termbs.src
change-folder 函数总是提示同一个邮箱
这不是 bug,实际上是预期的行为。解决方法见 多账号部分。
使用只读模式 (Mutt -R) 时无法更改文件夹
这肯定是因为你正在使用如下所示的宏:
macro index,pager <f2> '<sync-mailbox><enter-command>source ~/.mutt/personal<enter><change-folder>!<enter>'
该宏告诉 Mutt 在切换前进行同步 (sync),这是一次写操作。
要么使用 侧边栏,要么设置另一个宏:
macro index,pager <f3> '<enter-command>source ~/.mutt/personal<enter><change-folder>!<enter>'
发送消息错误,子进程退出码 127 (Exec error.)。
这是一个 SMTP 错误。它意味着 mutt 不知道如何发送消息。你可以尝试安装 sendmail 看看能否解决问题,或者可以设置 smtp_url 变量。如果你使用 Gmail,可以将以下内容添加到 muttrc 中,告诉 mutt 使用 Gmail 的 SMTP 服务器。
set smtp_url=smtps://$imap_user:$imap_pass@smtp.gmail.com
请注意 smtps 协议,这很重要。这应该能解决问题。
字符编码问题
如果你在字符编码方面遇到问题,请先阅读 Mutt 维基中的 本节内容。
如果中文文本仍然乱码,即便头信息指定了 GB2312,尝试用 GBK 解码可能有所帮助。你可以通过在 mailcap 文件中添加以下内容,使用 iconv 做到这一点:
text/plain; iconv -f gbk -t utf-8 %s; test=echo "%{charset}" | grep -ic "gb2312"; copiousoutput;
并在 .muttrc 中添加一行来启用它:
auto_view text/plain
对于 HTML 邮件,你可以编辑 mailcap 的相关行,将 %{charset} 替换为 $(echo %{charset} | sed s/gb2312/gbk/I),例如:
text/html; w3m -dump -I $(echo %{charset} | sed s/gb2312/gbk/I) %s; nametemplate=%s.html; copiousoutput
无法登录 GMail
Gmail 会禁止其认为安全性较低的应用访问,包括 mutt。你可以按照 此处的说明启用访问
urlview 无法打开过长的 URL
过长的 URL 无法被正确解析,因为 urlview 不解码文本(见 [5])。你可以让 mutt 代为解码邮件。将打开 urlview 的行替换为以下代码:
macro index \cb "\ :set my_tmp_pipe_decode=\$pipe_decode\n\ :set pipe_decode\n\ |urlview\n\ :set pipe_decode=\$my_tmp_pipe_decode\n\ :unset my_tmp_pipe_decode\n" \ 'call urlview to extract URLs out of a message'
另一个选择是使用 urlscan 代替,它提供了一个文本用户界面来选择 URL,并能处理更奇特的文本格式。
文档
新手可能会觉得很难找到关于 Mutt 的帮助。实际上,大部分话题都已在官方文档中涵盖。我们强烈建议你阅读它。