LWN: Mutt 2.0版本发布!

关注了就能看到更多这么棒的文章哦~

Mutt releases version 2.0

November 25, 2020
This article was contributed by Lee Phillips
DeepL assisted translation
https://lwn.net/Articles/837960/

久负盛名的电子邮件客户端 Mutt 刚刚推出了 2.0 版本。Mutt 跟现在电子邮件领域主流的客户端都不太一样,尤其是,它没有图形界面。Mutt 有着值得详细说说的悠久历史,它的功能,以及丰富的可定制性也值得大家关注。2.0 版本对 Mutt 的界面、可配置性和便利性也带来了一些改进。在本文中,不熟悉 Mutt 的读者将了解到一种与自己每天处理收件箱的过程很不同的方式,而 Mutt 的老用户们也能看到这个老朋友的一些新特性。

What is Mutt?

Mutt 是一个开源的(参见 Gitlab)、GPL 授权的电子邮件客户端,运行在 terminal (终端)上。当它在 1999 年 10 月首次发布 Mutt 1.0 的时候,它秉承了 Unix 的理念,只做好一件事:做好一个邮件用户代理(MUA, mail user agent)。因此,它不包含编辑器、图像查看器或 HTML 渲染功能,而是将这些功能交给外部程序来做。它内部包括 POP 和 IMAP 支持,因此它可以收取邮件,但它不会自己直接通过互联网发送邮件,而是将这项工作交给本地安装的邮件发送程序(MSA,mail submission agent)。

大多数电子邮件客户端除了作为 MUA 之外,还能做许多额外的功能。例如 Thunderbird 或 macOS 和 Windows 的商业产品邮件客户端中都包含了编辑器、附件查看工具、地址簿,并能直接通过 SMTP 协议来发送邮件。它们往往还包括更多其他功能,如任务管理或日历等。人们广泛使用的 Gmail 服务是一个 web application,它会利用浏览器来完成各种多媒体显示功能,并与谷歌的其他许多服务紧密集成起来。

Mutt 多年来一直保持只做核心的功能,但在 2007 年 4 月发生了一次意义重大的妥协。在 v.1.5.15 版本中,Mutt 可以使用 SMTP 协议发送电子邮件了。用户不再需要安装 Sendmail 或 Postfix 的本地版本,因为现在 Mutt 可以直接与他们的邮件服务提供商来进行认证、通信,直接发送电子邮件。

Mutt 是由 Michael Elkins 在 1995 年编写的,界面的灵感来自 Elm,融合了 Pine 和 Mush 的功能,形成了一个混血儿,因此得名。Mutt 有一个官方口号:"所有的邮件客户端都很烂。这个只是不那么烂而已(all mail clients suck. This one just sucks less)。"

Why use Mutt?

Mutt 有两大优势:高效率,可配置性。它吸引了那些愿意花费数小时调整他们自己的.vimrc 文件的人(我好有负罪感),以及那些希望自己的程序启动和响应非常快速的人。

Mutt 在信息显示的方式以及命令界面上都具有极高的可配置性。不过要充分利用这一点的话,用户必须熟悉 Mutt pattern language,这是一组引用邮件属性的代码。所有细节都在 Mutt 的详尽手册中。在本文中,我将提供一些例子,让大家了解一下使用 Mutt 的工作情况。

Mutt 主要有两个地方提供信息:首先是索引,index,这是邮件列表,而 pager 则会展示邮件的内容。启动时,用户看到的是索引界面,当选择一条信息进行查看时,窗口会被分割开来:上面的一小部分可以看到该信息的相关 index 和一些上下文,而更大的窗口则是邮件内容。

下图显示的是 Mutt 选择了一封邮件进行查看的情况。每个邮件标题的颜色,以及对原有邮件中语言的每级引用都会有不同颜色,这些都可以在配置文件中指定。这个屏幕截图顶行有显示命令提示,下面就是是索引窗口。这里面有 "curosr",就是青色背景的黑色文字那一行,也就是说第 4 个邮件的内容就是展示在下半部的大窗格里的内容。

[Mutt interface]

Mutt 的一个特点就是它非常擅长来正确地显示 message thread (邮件话题)。当人们抱怨他们难于查看那种有好多人回复的电子邮件时,通常是因为他们使用的客户端(如 Gmail)没有正确显示电子邮件信息的回复结构。当邮件用户点击回复键时,邮件中应该会添加一个 In-Reply-To header。Mutt 参考这些 header 以及相关的 References header,来跟踪每封邮件都是回复哪一封邮件的,并构建一个树状结构来显示对话的结构。其他一些邮件客户端只使用 Subject header 来构建这个对话树,这可能会把不相关的邮件给关联在了一起。并且当回复者改变回复的主题时,会错误地把这个讨论主题话题给打断。

下面的截图还是关于同一个收件箱的,其中有一个小小的话题,关于绩效考核的。Mutt 会在索引窗口中展示出对话树,显示每封邮件是回复哪一封邮件的,即使参与者改变了 subject 也没关系。比如第 6 个邮件是 CEO 对于 boss 发出第一封邮件的回复。在第 7 个邮件中,我在给别人写关于我的绩效评估,这是在一个新的邮件话题里面发出来的,所以它不是对话树的一部分。

 [Tree of replies]

将这组邮件导入我的 Gmail 账户后,我看到的是这样的:

 [Gmail tree]

我已经打开了设置中的 "Conversation view",它应该要将邮件按对话来分组的。但 Gmail 未能正确地做到这一点。它创建了两组相关的邮件,用数字 "2 "显示,要求用户点击这两行来查看各个邮件。但它没能发现它们跟其他邮件也是在同一个 thread 里的,而是将它们显示为不相关的邮件。我花了一些时间来构造这个对比示例,因为它能很好地回答我们为什么要用 Mutt 的问题。Mutt 的 conversation threading 是一些人坚持使用它而不是那些所谓的“modern”客户端的充分理由。而在效率和可配置性的优势之外,或许还应该加上第三个优势:"正确性(correctness)"。

Mutt 不仅仅是简单的显示对话树,还允许用户编辑它。有一些命令可以将一条消息从对话中分离出来,或者将一条消息标记为对另一条消息的回复。这是很有帮助的,因为有些消息是来自于那些没有设置 Reply-To header 的客户端,而另一些消息则会犯 "thread hijacking" 的错误,这在邮件列表中经常看到,用户在回复消息时给人其他看起来没有使用回复功能,而是创建一个新主题。

用户几乎可以根据消息的任何属性来配置索引窗口中每行的颜色,例如根据消息的来源、主题和状态(已回复、已读、未读、标记等),甚至根据消息正文的内容来配置颜色。有效使用 Mutt 的配色功能的话需要一个支持 256 色的终端。为了对颜色进行精细的控制,我发现最好使用终端颜色代码(terminal color codes)。下面是一个配置颜色的命令的例子,它使用 ~F 这个标记来表示一条已经被 "flagged" 或标记为 important 的邮件:

color index color124 color234 ~F

如果把这一行加入 Mutt 的启动文件,即用户 home 目录下的.muttrc 中,那么在索引窗口中的标记消息的行将以红色(color124)文本出现在接近黑色(color234)的背景上。

颜色也可以通过打分方式来控制,根据邮件的标题,可以对邮件加分或减分,并根据总分来分配颜色。比如下面这些配置命令:

score '~f boss' +10
score '~s meeting' -5
score '~s party' +20
color index color208 color234 "~n 10"
color index black red  "~n 20"
color index magenta black "~n 5"

效果就是,给来自 boss(~f boss)的邮件加 10 分,但任何主题行有 "meeting" 的邮件(~s meeting)会去掉 5 分。真正重要的邮件,关于 party 的,会得到 20 分的加分。最后三条命令是根据邮件的评分,在索引界面中设置颜色,这里既使用了颜色名称,也使用了颜色代码号,每条命令中文字颜色排在第一位,紧跟其后的是背景颜色。

下面就是效果了:

 [scored headers]

最后一行,默认的青色背景黑色文字,显示了当前光标的位置。

Mutt 将大量的表达能力交给用户来控制。它的 pattern language 可以用来使用消息的任何属性来构造搜索。例如,在按"/"键进入搜索提示符后,下面这个命令:

~fboss~d<2d~smeeting

会搜索来自 boss 的、两天内的、关于会议的邮件,将光标放在找到的第一封邮件上。按 "n "键可以跳转到下一条符合标准的邮件。在输入 "l" 后输入相同命令的话,会将索引窗口限制只显示满足标准的邮件,让用户对自己的邮箱有一个过滤过的视图,不符合搜索标准的邮件会暂时隐藏。

除了手动输入命令外,还可以在 Mutt 的启动文件中定义 hook,这些 hook 在执行某些操作前会被执行。hook 可以设置为在回复特定用户之前运、在更换邮箱或账户时运行、在编辑邮件时运行等。用户还可以定义宏,将任意的命令序列绑定到单个按键上,这些绑定在不同的上下文中可以有不同的含义,同一个按键可以在阅读邮件时做一件事、在查看邮箱索引时做另一件事,在查看邮件的附件索引时做第三件事。

除了 Mutt 的两个主要窗口界面外,Mutt 还有一个附件窗口(attachment panel),如下图所示,用于显示这条消息的附件列表。在这里,用户可以对附件进行查看、删除、保存、通过管道传递到 shell 命令等操作,可以单独操作也可以分组操作。当 "查看" 一个附件时,Mutt 会参考用户的.mailcap 文件,如果此文件不存在,则参考系统范围内的文件来找出对其进行处理的程序或者 shell 管道。

 [Attachment inbox]

Mutt 也可以被配置成自动将一些附件类型转换为文本,以便在 terminal 下半部的窗格中直接查看。在阅读 HTML 电子邮件时,最常使用这个功能来利用 w3m 或 Lynx 等程序阅读。如果文本视图还不够,只需按几下键,附件就会被传递到用户的图形浏览器上。Mutt 还被设计成可以与 OpenPGP 配合,对电子邮件进行签名和加密。当人们决定要对邮件加密时,这个功能将会非常有用。

除了 curse 界面之外,Mutt 还可以从命令行中调用来批量处理电子邮件。下面是给 boss 发送邮件的命令,邮件主题为 "Performance review",把一个 PDF 文件作为附件,使用文件 reviewComments.txt 的内容作为邮件正文。

mutt -s "Performance review" boss@bigco.xyz -a signedreview.pdf < reviewComments.txt

Mutt 的高效率可以改变一个人对电子邮件进行处理的方法。该程序可以在一秒钟内启动起来并展示出一个正确的分类和话题索引界面,其中包括成千上万的电子邮件。搜索和过滤毫不费力,几乎是瞬间完成。由于这些原因,我不屑于划分多个邮箱来对邮件进行分类。没有必要决定如何组织电子邮件,因为我可以针对我的收件箱创建任何视图,以便随时完成目前要做的事情。我的准则不是 "收件箱清零",而是 "收件箱存放 10000 封邮件",因为超过 10000 封的话,Mutt 打开我的邮箱的时间可能会超过两秒钟。这时,只需按几下键,我就可以进行存档(archive)操作,比如说,把时间最久的、未进行标记的 5000 封邮件都进行存档。这种操作几乎也是瞬间完成的。

对于一些人来说,Mutt 的优势并不够,他们还是认为有太多不便之处了。其中最主要的是它缺乏内置的 HTML 渲染功能,这在当前 HTML 电子邮件占主导地位的情况下显得更加突出。虽然 Mutt 可以处理 HTML 附件,但有些人不喜欢切换到另一个程序,他们更希望所有的东西都在其中处理掉。这类用户可能也更喜欢那些集成了日历、任务管理、GUI 方式的邮件撰写界面、垃圾邮件检测、自动回复等功能的程序。这些功能很可能永远不会成为 Mutt 的一部分,因为它们与 MUA 的专注做好一件事的基因格格不入。然而,这些用户可以考虑使用 Mutt 的各种 patch 和 add-on 来增强 Mutt。

New in 2.0

Mutt 的 2.0 版本于 2020 年 11 月 7 日发布。它与之前版本有一些小的不兼容,这意味着现有的启动文件可能无法工作,或者可能行为会发生改变。这些不兼容性,就是把主版本号提升到 2 的原因。不过,实践下来,我现有的设置可以正常工作,没有改变。新版本引入了一些新的功能,使 Mutt 更加容易使用。

现在想要使用新版本的用户可能需要下载源码并编译,除非是使用 Arch 等已经添加了新版本 Mutt 的发行版。编译的速度很快,而且没有很奇葩的依赖关系。

上面的截图说明了 "Indicator" 的默认背景和前景颜色,显示了光标在索引中的位置。当然可以对它也改颜色。但在 2.0 之前的版本中,这些颜色取代了用户精心选择的颜色来显示消息的状态和属性。我一直觉得这很烦人。显然,我并不是一个人,因为在新版本中,可以让 cursor 不那么碍眼。下图同样是对第一张图中的邮箱进行显示,但这回是使用 Mutt 2.0,Cursor 设置为下划线,并在启动文件中添加了新的选项 cursor_overlay。在图中,光标在第一条信息上,但仍然可以看到颜色

 [Underscore cursor]

这看起来似乎是一件小事,但电子邮件程序是一整天大部分时间都在使用的东西,所以任何改进,只要能帮助用户更容易地提取最新信息,那都是受欢迎的改进。

另一个有趣的新增功能是开发者称之为 "MuttLisp "的东西。这并不是像 Emacs Lisp 那样的完整语言,而是对配置语法的增强,允许使用 S-expression 来根据条件进行设置,并通过操作字符串来构造命令。需要提醒用户的是,这个功能是实验性的,细节实现很可能会在未来的版本中改变。

在 2.0 版本中,用户在输入 search 或 limit 命令时,只要按下 TAB 键,就可以得到 pattern language 中 46 种可能类型的提醒。Mutt 用户现在还可以直接将邮件发送到 IPv6 地址,比如:

To: toaster@[IPv6:ffbc:b47:ba4f:94ed:4425:492:d948:8aee]

这在与物联网设备的通信场景中可能会很有用。

最新版本中的另一项改进会受到那些拥有不太可靠的 IMAP 连接的用户的欢迎。现在,如果连接中断或服务器停止响应,Mutt 将自动尝试重新连接。2.0 版本中的其他新增功能几乎都是额外的配置参数,这些参数的描述就牵涉到了 Mutt 的内部有趣的技术细节了。

Getting started

开始使用 Mutt 的时候可能有点令人生畏。当你已经熟悉这个程序之后,手册会对你很有用,它是很完整的,但充满了各种术语和想法,不加解释。幸运的是,在 Mutt 漫长的历史中,已经积累很多关于它的很有用文章,包括这本入门指南(https://www.ucolick.org/~lharden/learnmutt.html)。另外还有两篇文章,"A Quick Guide to Mutt"(https://srobb.net/mutt.html)和这篇 Linux Journal (https://www.linuxjournal.com/article/10115)的文章虽然有点老,但仍然很有用。一开始的时候,参考其他用户的配置文件例子可能会很有帮助,参见这里(https://gitlab.com/muttmua/mutt/-/wikis/ConfigList)。还有一些邮件列表,包括欢迎寻求帮助的 mutt-users 邮件列表,以及其他一些公告和开发者讨论的邮件列表。

几十年前,当我学习 Mutt 时,我发现它允许我自由编辑消息头,于是我立即给朋友们发送了几封来自 "God@heaven.com" 和圣诞老人的邮件,以此来取乐。今天,虽然我已经不再喜欢做这些事情了,但我仍然经常在 Mutt 中做一些在其他电子邮件客户端(如 Gmail)中无法完成的事情(因为没有命令支持)。Mutt 是一个很强大的工具,需要用户投入大量的精力来学习它的使用方式,并对它进行设置和配置。对于我们中的一些 "生活在电子邮件中" 的人来说,这种投资会得到丰厚的回报。但它肯定不适合所有人。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值