Mutt

出自 ArchWiki

Mutt 是一个基于文本的邮件客户端,以其强大的功能而闻名。尽管已经有二十多年的历史,Mutt 仍然是众多高级用户的首选邮件客户端。

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

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

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

安装

安装 mutt 软件包。一个功能更丰富的流行分支是 neomutt

可选安装用于 IMAP 设置的外部辅助应用程序,例如 isyncOfflineIMAP

或者(如果使用 POP3) getmailAURmpopfetchmailfdmprocmailAUR

注意: 关于身份验证设置
  • 如果您只需要 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 密码。
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 中,但它不会下载邮件以供离线使用。可以使用外部应用程序(例如 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

您应该将 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 特定问题,请随时在 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

注意: 许多人认为 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 环境变量来选择默认的 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 是为了使其静默,即防止打印您不希望看到的无用消息。

注意: 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,您可以直接看到格式化的内容,并且可以使用 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>"

如果 $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 守护程序,您可能希望 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_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 部分。

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

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

$ goobook config-template > ~/.goobookrc

有关配置选项,请参阅 ~/.goobookrc。至少,您需要输入您的电子邮件密码

注意: 如果您为 Google 帐户启用了两步验证,您可能需要生成应用程序密码。

为了使用 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,则可以使用 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。

故障排除

退格键在 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 的帮助。实际上,大多数主题都在官方文档中涵盖。我们敦促您阅读它。

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

另请参阅