跳转至内容

Mutt

来自 ArchWiki

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

Mutt 的核心在于作为邮件用户代理 (MUA),其最初编写目的是为了查看邮件。与其它的邮件应用相比,后来添加的实现(用于检索、发送和过滤邮件)较为简单;因此,用户可能希望使用外部应用程序来扩展 Mutt 的功能。

尽管如此,Arch Linux 的 mutt 软件包在编译时已包含 IMAP、POP3 和 SMTP 支持,从而消除了对外部应用程序的必要性。

本文介绍了如何使用原生的 IMAP 发送和检索功能,以及一种依赖于 OfflineIMAPgetmail (POP3) 检索邮件、使用 procmail(针对 POP3 情况)过滤邮件、以及使用 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/]

您不一定要使用文件夹,但如果您所有的其他文件夹都在 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 支持,但它不会下载邮件以供离线使用。可以使用外部应用程序(如 OfflineIMAPisync)将您的电子邮件下载到本地文件夹,然后再由 Mutt 处理。

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

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 代理,如 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?" 的真实含义是 "Save 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

正则 (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 的指南

如果您有任何 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

注意 HTML 邮件被许多人认为是无用的、繁琐的,并且容易出现阅读问题。Mutt 可以使用像 w3m 或 lynx 这样的文本浏览器阅读 HTML 邮件,但它相对于纯文本邮件显然没有优势。您应尽量避免撰写 HTML 邮件。

撰写时显示另一封邮件

关于 Mutt 的一个常见抱怨是,当撰写新邮件(或回复)时,如果不关闭当前邮件(推迟/Postponing),就无法打开另一封邮件(即为了与另一位通信者核对)。以下是解决方案

首先,像往常一样启动 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}"

查看内容

在 Web 浏览器中查看 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 环境变量可用于选择默认 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 的作用是使其保持静默,即防止在不需要的地方打印无用的消息。

注意 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 正文,而是直接看到格式化的内容;且假设您已按上述方式安装并配置了 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>"

如果 $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 文件的 hard-wrap 选项中将列数作为参数传递,例如

 set editor="nano -r 72 -b"

此外,在 muttrc 文件中,您可以指定开始编辑的行,以便跳过邮件头

 set editor="nano +7"

Emacs

Emacs 有 mailmessage 主模式。要在从 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 Referencestrftime(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_frommy_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 变量或 imap_check_subscribed,以告诉侧边栏应显示哪个文件夹。请参阅 mailboxes 部分。

请注意,如果您不使用 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 联系人,可以使用 goobookAURgoobook-gitAUR 软件包安装。

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

$ goobook config-template > ~/.goobookrc

查看 ~/.goobookrc 以了解配置选项。至少,您需要输入您的 emailpassword

注意 如果您的 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 获取(或者如果您未启用它),您可能希望手动获取邮件。有一个 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

请注意 ^? 是在 插入符号记法中表示 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 的帮助。实际上,大多数话题都在官方文档中有涵盖。我们强烈建议您阅读它。

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

参见

© . 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.