跳转至内容

Mutt

来自 ArchWiki
(重定向自 Neomutt)

Mutt 是一款以功能强大著称的文本界面邮件客户端。虽然已有二十多年的历史,Mutt 仍然是大量高级用户的首选邮件客户端。

Mutt 主要致力于成为一个邮件用户代理 (MUA),最初是为了查看邮件而编写的。后来增加的实现(用于检索、发送和过滤邮件)与其它邮件应用相比显得比较简陋,因此,用户可能希望使用外部应用程序来扩展 Mutt 的功能。

尽管如此,Arch Linux 的 mutt 软件包在编译时已加入了 IMAP、POP3 和 SMTP 支持,消除了对外部应用程序的必然需求。

本文涵盖了使用原生 IMAP 发送和检索,以及依赖 OfflineIMAPgetmail (POP3) 检索邮件、在 POP3 情况下使用 procmail 过滤邮件,以及使用 msmtp 发送邮件的设置。

安装

安装 mutt 软件包。一个具有更多功能的流行分支是 neomutt

(可选)为 IMAP 设置安装外部辅助程序,例如 isyncOfflineIMAP

或者(如果使用 POP3)安装 getmailAURmpopfetchmailfdm 以及 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
提示 接前例,请记住 Gmail 需要完整的电子邮件地址(这并非标准做法)
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 支持,但它不会下载邮件供离线使用。可以使用 OfflineIMAPisync 等外部应用程序将邮件下载到本地文件夹,然后再由 Mutt 处理。

考虑使用 spamassassinimapfilterAUR 等程序来对邮件进行分类。

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 代理,如 msmtpsSMTPopensmtpd

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 配置都应该进入其各自的文件夹。

警告 当一个账号设置了其他账号未指定的变量时,你必须为其他账号取消设置 (unset) 该变量,否则配置会重叠,你肯定会遇到意想不到的行为。

得益于其最强大的功能之一:钩子 (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 的指南

如果你有任何关于 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

注意 许多人认为 HTML 电子邮件无用且繁琐,并容易出现阅读问题。Mutt 可以配合 w3m 或 lynx 等文本浏览器阅读 HTML 邮件,但它明显不如纯文本邮件有优势。你应该尽可能避免撰写 HTML 邮件。

撰写时显示另一封邮件

Mutt 的一个常见槽点是,在撰写新邮件(或回复)时,你无法在不关闭当前邮件(推迟)的情况下打开另一封邮件(例如,为了与其他联系人核对)。以下是解决方案:

首先,像往常一样启动 Mutt。然后,启动另一个终端窗口。现在用以下命令启动一个新的 Mutt

mutt -R

这将以只读模式启动 Mutt,你可以随意浏览其他电子邮件。强烈建议始终以只读模式启动第二个 Mutt,否则容易产生冲突。

注意 更改文件夹(使用 cy)时,只读模式不会保留。必须改用 Esc c
提示 此方案需要输入一点字符,所以适合将以下命令绑定到键盘快捷键
$TERMINAL -e mutt -R
其中 $TERMINAL 是你的终端。

打印

你可以安装 muttprintAUR 获得更美观的打印质量。在你的 muttrc 文件中,插入

set print_command="/usr/bin/muttprint %s -p {PrinterName}"

查看内容

在浏览器中查看 URL

这可以通过 urlscanurlviewAURextract_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 是为了保持安静,即防止在不想要的地方打印无用信息。

注意 urlview 有一些缺陷(例如无法处理某些电子邮件编码)且功能相当简陋(例如不提供链接上下文)。extract_urlAUR 可以处理所有电子邮件编码并提供链接上下文。urlscan 可以提供链接上下文,但不能处理所有电子邮件编码。两者都是 urlview 的直接替代品,尽管 extract_url 具有受益于额外配置更改的功能。

查看 HTML

可以将 HTML 正文传递给外部 HTML 程序然后输出,保持邮件查看的统一且不干扰。这里介绍了三个程序:lynxw3melinks(确保已安装所选软件包)。

如果 ~/.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>"

如果 $BROWSERfirefox,则在 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_frommy_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 变量或 imap_check_subscribed 来告诉侧边栏应该显示哪些文件夹。请参阅 mailboxes 部分。

请注意,使用 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 联系人,可通过 goobookAURgoobook-gitAUR 软件包安装。

使用 goobook 之前,必须配置 ~/.goobookrc。要生成默认模板:

$ goobook config-template > ~/.goobookrc

查看 ~/.goobookrc 以获取配置选项。至少需要输入你的电子邮件 (email)密码 (password)

注意 如果你的 Google 账号启用了两步验证,你可能需要生成一个应用密码。

为了向 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,可以使用 pushdpopd 在 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.srckbs=^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 的帮助。实际上,大部分话题都已在官方文档中涵盖。我们强烈建议你阅读它。

  • 官方手册。Arch Linux 的 stock mutt 软件包还会将 HTML 和纯文本手册安装在 /usr/share/doc/mutt/
  • muttmuttrc 的 man 页面。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.