Mutt
Mutt 是一款以功能强大著称的基于文本的邮件客户端。尽管已有二十多年的历史,Mutt 仍然是大量高级用户的首选邮件客户端。
Mutt 的核心在于作为邮件用户代理 (MUA),其最初编写目的是为了查看邮件。与其它的邮件应用相比,后来添加的实现(用于检索、发送和过滤邮件)较为简单;因此,用户可能希望使用外部应用程序来扩展 Mutt 的功能。
尽管如此,Arch Linux 的 mutt 软件包在编译时已包含 IMAP、POP3 和 SMTP 支持,从而消除了对外部应用程序的必要性。
本文介绍了如何使用原生的 IMAP 发送和检索功能,以及一种依赖于 OfflineIMAP 或 getmail (POP3) 检索邮件、使用 procmail(针对 POP3 情况)过滤邮件、以及使用 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/]
您不一定要使用文件夹,但如果您所有的其他文件夹都在 INBOX 内,这可能会很方便。您在此处设置的文件夹,以后在 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 都能处理 Maildir,而且 Mutt 的支持非常出色。您只需要做几件简单的事情就能让 Mutt 使用它们。打开您的 muttrc 并添加以下几行
set mbox_type=Maildir set folder=~/mail set spoolfile=+/ set header_cache=~/.cache/mutt
这是一个最小化配置,使您能够访问 Maildir 并检查 INBOX 中的新本地邮件。此配置还会缓存电子邮件的标题,以加快目录列表的速度。在您的构建中它可能未启用(但在 Arch 软件包中肯定启用了)。请注意,这不会以任何方式影响 OfflineIMAP。它始终会同步服务器上的所有目录。spoolfile 告诉 Mutt 轮询哪些本地目录以获取新邮件。您可能想要添加更多的 Spoolfile(例如邮件列表的目录)以及其他内容。但这属于 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?" 的真实含义是 "Save 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
正则 (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。这可以在 source 后在任何变量中使用。例如
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 手册页将显示所有可用命令及其用法,但这里有几个例子。您可以使用 Mutt 发送警报、日志或其他一些系统信息,这些信息由 .bash_profile 登录触发,或者作为常规 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 的一个常见抱怨是,当撰写新邮件(或回复)时,如果不关闭当前邮件(推迟/Postponing),就无法打开另一封邮件(即为了与另一位通信者核对)。以下是解决方案
首先,像往常一样启动 Mutt。然后,启动另一个终端窗口。现在用以下命令启动一个新的 Mutt
mutt -R
这会以只读模式启动 Mutt,您可以根据需要浏览其他邮件。强烈建议始终以只读模式启动第二个 Mutt,否则很容易产生冲突。
c 或 y)时,只读模式不会保留。必须改用 Esc c。打印
您可以安装 muttprintAUR 以获得更精美的打印质量。在您的 muttrc 文件中,插入
set print_command="/usr/bin/muttprint %s -p {PrinterName}"
查看内容
在 Web 浏览器中查看 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 环境变量可用于选择默认 Web 浏览器。
可以使用 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 正文,而是直接看到格式化的内容;且假设您已按上述方式安装并配置了 urlscan,邮件中的任何 URL 链接都可以通过 Ctrl+b 显示出来。
如果您收到许多具有多重或备用编码的电子邮件,Mutt 可能会默认将每封电子邮件都视为 HTML。为了避免这种情况,请将以下变量添加到您的 ~/.muttrc 中,让 Mutt 在可用时默认为文本格式,并且仅在邮件中没有文本版本时才使用 w3m/lynx
alternative_order text/plain text/html
一些 HTML 邮件在基于文本的 Web 浏览器中可能无法正确显示。作为备选方案,您可以绑定一个按键以便在此类情况下打开图形浏览器。以下宏将会在环境中定义的 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 文件的 hard-wrap 选项中将列数作为参数传递,例如
set editor="nano -r 72 -b"
此外,在 muttrc 文件中,您可以指定开始编辑的行,以便跳过邮件头
set editor="nano +7"
Emacs
Emacs 有 mail 和 message 主模式。要在从 Mutt 调用 Emacs 时自动切换到 mail-mode,您可以将以下内容添加到 .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 守护进程 (daemon),您可能希望 Mutt 连接到它。将此添加到您的 .muttrc
.muttrc
set editor="emacsclient -a \"\" -t"
显示设置
颜色
将 /usr/share/doc/mutt/samples/colors.linux 的内容追加到您的 .muttrc 文件中,或者复制并 source 它。然后根据您的喜好进行调整。
这些设置中的每一种产生的实际颜色取决于您 ~/.Xresources 文件中设置的颜色。
或者,您可以 source 您想要的任何包含颜色的文件(从而作为主题文件)。有关主题示例,请参阅 [3]。
索引格式
下面是一个可以放在 .muttrc 中用于自定义索引格式(即文件夹视图中显示的列)的快速示例。
set date_format="%y-%m-%d %T" set index_format="%2C | %Z [%d] %-30.30F (%-4.4c) %s"
有关更多详细信息,请参阅 Mutt Reference、strftime(3) 和 printf(3)。
在“已发送”文件夹视图中显示收件人而非发件人
默认情况下,Mutt 在 index_format 变量中使用 %L 格式字符串,这将显示
- “To <列表名称>”:如果 "To:" 或 "Cc:" 头字段中的地址与用户
subscribe命令定义的地址匹配。 - 否则,如果消息是您发出的,它将显示作者姓名或收件人姓名。
如果您在同一个邮箱中使用多个电子邮件地址,请务必配置 alternates 变量,以便 Mutt 知道哪些消息是您发出的。
muttrc
alternates ^me@example.COM$ ^me@example.NET$ ^example@archlinux.ORG$
可变列宽
如果您调整窗口大小,主题可能会被截断,而某些字段(如发件人)仍留有未使用的空间。您可以使用 tput cols 的 shell 调用来获取终端支持的最大列数(即宽度)。有了这个值,您可以为发件人和主题等字段设置宽度的百分比。
使用上述 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_from。否则,列值将不会重新计算。
我们可以添加一个绑定,在不更换文件夹的情况下强制重新计算索引格式
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 中。复制、编辑该文件,并在您的 mutt 配置文件中 source 该文件。务必将 set sidebar_visible = yes 修改好。
追加以下内容以便切换侧边栏的可见性
bind index,pager B sidebar-toggle-visible
请注意,如果您不使用 sidebar_sort_method 选项,使用 mailboxes 选项时文件夹将按照它们被设置为 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 获取(或者如果您未启用它),您可能希望手动获取邮件。有一个 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
请注意 ^? 是在 插入符号记法中表示 backspace 的单个字符。要在 Emacs 中输入,请使用 Ctrl+q Backspace;在 Vim 中,使用 Ctrl+v Backspace。
- 要么修正您的终端
$ infocmp > termbs.src
编辑 termbs.src 并将 kbs=^H 改为 kbs=\177,然后执行
$ tic -x termbs.src
change-folder 函数总是提示相同的邮箱
这不是错误,这实际上是预期的行为。有关解决方法,请参阅 多账户章节。
使用只读模式 (Mutt -R) 时无法更改文件夹
这肯定是因为您正在使用类似以下的宏
macro index,pager <f2> '<sync-mailbox><enter-command>source ~/.mutt/personal<enter><change-folder>!<enter>'
此宏告诉 Mutt 在切换之前先同步(这是一个写入操作)。
要么使用 侧边栏,要么设置另一个宏
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 邮件,您可以通过将 %{charset} 替换为 $(echo %{charset} | sed s/gb2312/gbk/I) 来编辑 mailcap 的相关行,例如
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 的帮助。实际上,大多数话题都在官方文档中有涵盖。我们强烈建议您阅读它。