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
folder
不要使用包含所有邮件(和目录)的本地目录,而是使用您的服务器(以及层级结构中最高的文件夹,如果需要)。
set folder=imap[s]://imap.server.domain[:port]/[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 支持
虽然 IMAP 支持已内置于 Mutt 中,但它不会下载邮件以供离线使用。可以使用外部应用程序(例如 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
您应该将 EDITOR 值存储到您的 shell 资源配置文件中(例如 bashrc)。您也可以从 Mutt 的配置文件中设置编辑器
.muttrc
set editor=your-favorite-editor
为了测试目的,将信件地址写给自己。写完信后,保存并退出编辑器。您将返回到 Mutt,它现在将显示有关您的电子邮件的信息。按 y
发送它。
q
,Mutt 会询问您 Postpone this message? ([yes]/no)
。这实际上是在询问您是否要保存您刚刚编写的消息。如果您按 "n"(可能是因为您想再次编辑消息),则该消息将被永久删除。使用 Mutt 时,请始终记住 "Postpone this message?" 实际上意味着 "Save this message?"。多账户
现在您应该至少有一个帐户的工作配置。您可能想知道如何使用多个帐户,因为我们将所有内容都放在一个文件中。
好吧,您只需要将特定于帐户的参数写入其各自的文件并加载它们即可。每个帐户的所有 IMAP/POP3/SMTP 配置都应转到其各自的文件夹。
感谢 Mutt 最强大的功能之一:hooks,Mutt 可以处理这种情况。基本上,hook 是在特定操作之前执行的命令。有几个可用的 hooks。对于多个帐户,您必须使用 account-hooks 和 folder-hooks。
- Folder-hooks 将在切换文件夹之前运行命令。这主要用于在您位于特定文件夹中时设置适当的 SMTP 参数。例如,当您在您的工作邮箱中并且您发送电子邮件时,它将自动使用您的工作帐户作为发件人。
- Account-hooks 将在每次 Mutt 调用与帐户相关的函数(例如 IMAP 同步)时运行命令。它不需要您切换到任何文件夹。
Hooks 接受两个参数
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 中设置通用设置,并在其各自的文件中设置特定于帐户的设置。现在您可以从特定于帐户的配置文件中加载 .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 的指南
- 我的第一个 Mutt(由 Bruno Postle 维护)
- Mutt 电子邮件客户端的 Woodnotes 指南(由 Randall Wood 维护)
- 朴实的 Mutt(作者:Steve Losh)
- 开始将 GnuPG 与 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 指定的字符串不是文件,而是命令。
从命令行撰写和发送
手册页将显示所有可用命令以及如何使用它们,但这里有一些示例。您可以使用 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 的一个常见抱怨是,当撰写新邮件(或回复)时,您无法打开另一封邮件(即,用于与另一位通信者核对),而无需关闭当前邮件(推迟)。以下描述了一种解决方案
首先,像往常一样启动 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 环境变量来选择默认的 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 上按 Enter 键。您的浏览器将启动并转到选定的站点。
某些浏览器将需要额外的参数才能正常工作。例如,Luakit 将在 Mutt 退出时关闭。您需要使用 -n
参数将其 fork 到后台。
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,您可以直接看到格式化的内容,并且可以使用 Ctrl+b
显示电子邮件中的任何 URL 链接,假设您已安装并配置了 urlscan,如上所述。
如果您收到许多具有多种或备用编码的电子邮件,Mutt 可能会默认将每封电子邮件都视为 HTML。为了避免这种情况,请将以下变量添加到您的 ~/.muttrc,以便 Mutt 在文本版本可用时默认使用文本版本,并且仅在电子邮件中没有文本版本时才使用 w3m/lynx
alternative_order text/plain text/html
某些 HTML 邮件可能无法在基于文本的 Web 浏览器中正确显示。作为备用解决方案,您可以绑定一个按键,以便在这种情况下在图形浏览器中打开 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 文件中的 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 守护程序,您可能希望 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 参考、strftime(3) 和 printf(3)。
在“已发送”文件夹视图中显示收件人而不是发件人
默认情况下,Mutt 在 index_format
变量中使用 %L
格式字符串,这将显示
- “To <list-name>”,如果“To:”或“Cc:”标头字段中的地址与用户
subscribe
命令定义的地址匹配。 - 否则,如果消息来自您,则显示作者姓名,否则显示收件人姓名。
如果您在同一邮箱中使用多个电子邮件地址,请确保配置 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"
我们必须从 hooks 中设置变量 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
请注意,使用 mailboxes
选项,如果您不使用 sidebar_sort_method
选项,文件夹将按照它们设置为 mailboxes
的顺序显示。
mailboxes "+-- My mailbox -----------"
在分页器视图上方显示索引
在您的 muttrc
中设置以下变量
set pager_index_lines=10
联系人管理
地址别名
别名是 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 将在索引菜单中显示别名中的“personal”名称(如果它找到与消息发件人匹配的别名)。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
。至少,您需要输入您的电子邮件和密码。
为了使用 Google 进行身份验证,您必须生成 客户端 ID 和客户端密钥。有关详细信息,请参阅 [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 将它们与 CardDAV 服务器同步。
在 mutt 中的集成类似于 abook,请参阅 khard 文档。
管理多个发件人帐户
如果您使用多个发件人帐户,您可以自动将特定的发件人帐户与收件人关联。mutt-vidAUR 扫描已发送的电子邮件,以查找与特定收件人关联的最新“发件人”详细信息,并将这些信息保存在文件中供 mutt source 使用。下次您向此收件人发送电子邮件时,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。
故障排除
退格键在 Mutt 中不起作用
这是某些类似 xterm 的终端的常见问题。两种解决方案
- 或者在
.muttrc
中重新绑定按键
bind index,pager ^? previous-line
请注意,^?
是一个字符,表示 插入符号表示法中的退格键。要在 Emacs 中键入,请使用 Ctrl+q Backspace
,在 Vim 中使用 Ctrl+v Backspace
。
- 或者修复您的终端
$ infocmp > termbs.src
编辑 termbs.src
并将 kbs=^H
更改为 kbs=\177
,然后
$ tic -x termbs.src
change-folder 函数始终提示相同的邮箱
这不是错误,这实际上是预期的行为。有关解决方法,请参阅多帐户部分。
使用 Mutt 只读模式 (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 (执行错误)。
这是一个 SMTP 错误。这意味着 mutt 不知道如何发送消息。您可以尝试安装 sendmail 并查看是否可以解决您的问题,或者您可以设置 smtp_url 变量。如果您使用 gmail,您可以将以下内容添加到您的 muttrc 中,以告诉 mutt 使用 gmail 的 smtp 服务器。
set smtp_url=smtps://$imap_user:$imap_pass@smtp.gmail.com
请注意 smtps 协议,这很重要。这应该可以解决问题。
字符编码问题
如果您遇到字符编码问题,请首先阅读 Mutt wiki 中的此部分。
如果中文文本仍然乱码,即使在标头中指定了 GB2312,也可能有助于使用 GBK 解码。您可以使用 iconv
通过将以下内容添加到您的 mailcap
文件中来执行此操作
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 的帮助。实际上,大多数主题都在官方文档中涵盖。我们敦促您阅读它。