第一章:Unix和Email

第一章:Unix和Email服务器配置服务帐户和组备份DNS解析器数据包过滤TLS和X.509证书web服务器数据库PostfixDovecotNetcat 和 OpenSSLMailxEmail 客户端SyslogEmail 和 UnixVirtual Hosts标准Email地址sendmail 命令本地邮件系统别名Mailbox格式在命令行以交互方式发送邮件在命令行以非交互方式发送邮件消息IDEmail消息邮件日志

设置公共邮件服务器意味着完全参与电子邮件标准,但您既不能同时学习也不能同时配置所有内容。学习意味着一次只学习一件作品,而不让全世界知道我们是业余爱好者。最简单的方法是在不同的域中配置两个测试主机,并让它们只相互交换电子邮件。您可以控制这些主机接受什么。您可以在两侧看到错误日志。通过不向世界其他地方宣布它们的存在,你就不必担心垃圾邮件。您甚至可以使用数据包过滤器来阻止外部人员。

一旦你有了一个功能齐全的电子邮件配置,你就可以告诉全世界,看看接下来会发生什么。如果它像你希望的那样工作,那么以同样的方式在你的真实域上设置你的生产服务器。

你的测试服务器不需要很大。我的是具有1GB RAM、20GB磁盘和单个CPU内核的虚拟机,运行FreeBSD或Debian。电子邮件软件没有挑战系统资源。

一旦你有了测试服务器,你必须了解电子邮件如何与Unix一起工作的基础知识。我们将考虑发送、接收和查看电子邮件。您将了解邮件标题、邮件目录的类型、在命令行发送邮件等。

服务器配置

像往常一样安装操作系统。修补它并启用自动安全更新。这将是一个面向互联网的服务器,人们会试图闯入。

您的服务器需要一个公共主机名。不要使用裸域名,比如 solveamurder.org ——你会希望主机名解析到你的web服务器。如果你没有主机名方案,可以尝试一些枯燥的东西,比如 mailmtamx 。这将有助于外界理解,是的,这个主机参与了电子邮件。在主机上以及正向和反向DNS中配置该名称。将其设置为与您的网络管理工具配合使用。糟糕的时间会破坏很多东西,所以使用 ntpd(8) 自动进行时钟同步。

服务器不需要任何类型的GUI。不要费心安装X或Wayland。

不要使用NFS存储邮件基础结构或文件的任何部分。邮件系统严重依赖文件锁定。NFS提供了一种类似于文件锁定的东西,如果你不仔细查看它,但它只会延长你的咨询时间。SAN磁盘很好,而iSCSI只是速度慢、要求苛刻,没有恶意。

您个人需要一个无特权的用户帐户。直接以 root 身份登录不仅是一种糟糕的系统管理实践,而且在构建系统时,你会向普通用户发送电子邮件。你必须分享普通的用户体验。

大部分邮件最终将位于 /vhosts 分区上。如果你愿意,可以使用不同的名称,但无论你怎么称呼它,都要创建文件系统或数据集,并给它足够的空间。除非你想发现收到的邮件一夜之间填满了你的磁盘,否则不要将你的电子邮件放在根分区上。

之后,您将需要各种其他服务和帐户。

服务帐户和组

我们将使用的许多程序都需要自己的用户。永远不要以这些帐户中的任何一个登录,并阻止他们通过SSH甚至控制台登录。您的Unix在安装我们将使用的软件时可能会创建这些服务帐户,并且会为这些帐户使用自己的名称。本书对Postfix使用 postfix 帐户,对Dovecot使用 dovecotdovenull 用户,对rspamd使用 rspamd 用户。您的软件包可能会为您添加它们,也可能不会。

我们还将使用具有UID和GID 5000的帐户 vmail 来支持虚拟主机。使用此帐户名没有特别的原因,但在数千个教程中重复后,它已成为事实上的标准,因此我们将向大众投降。它不是任何软件包的一部分,所以你必须手工创建它。

在FreeBSD系统上,可以使用 pw(8)

Linux系统使用 groupadd(8)useradd(8)

创建完这个帐户之后,让它拥有你的虚拟邮箱:

我们还将使用组来让多个守护进程访问共享资源。组是Unix权限中被忽视的一个方面。每当你发现自己想让一些东西具有世界可读性或(ick)世界可写性时,你可能需要创建一个组。

如果您的组织或操作系统有不同的标准,请遵循它们。

备份

为什么要备份测试服务器?因为你会犯错误,并被迫恢复更改。经过几十年的观察,人们计划在部署的最后阶段配置备份,然后却没有这样做,我建议在做其他任何事情之前配置、自动化和验证常规备份。

如果你的Unix主机没有备份系统,请允许我建议你使用Tarsnap。

DNS解析器

邮件系统进行许多DNS查询以查找外国邮件交换者。SPF、DKIM和DMARC都是通过DNS分发的。阻止列表在DNS上运行,大多数根据主机进行的查询数量限制访问。不要将这些查询转发给谷歌或Cloudflare等提供商;你甚至不应该把它们转发给你的ISP。每个MTA都应该执行自己的递归DNS搜索。

为什么?假设一个阻止列表提供程序允许每个主机每小时进行100次查询,而您的两个邮件主机每小时查询大约80次,有时更多,有时更少。每台主机都能轻松地达到这个限制之下。如果邮件主机将所有查询转发到组织的递归服务器,是的,他们将受益于该服务器的缓存。然而,对阻止列表服务器的所有查询都将来自递归名称服务器的单个IP。您将超过速率限制,并根据您的配置拒绝好的电子邮件或接受垃圾邮件。有多少人使用8.8.8.8作为递归DNS服务器,你认为谷歌的域名服务器完成100次查询的速度有多快?

在每台邮件主机上运行自己的递归、非权威、非转发、DNSSEC验证DNS服务器。几乎每个类Unix系统都有一个安装时选项,可以通过单个命令启用BIND或Unbound等解析器。

数据包过滤

电子邮件主机运行许多服务。其中一些必须向世界开放。其他的不需要。一些服务附带了对全世界开放的默认配置,即使这些服务不需要公开甚至激活。如果网络服务不需要公开访问,不要让公众访问它。防止意外的最简单方法是使用基于主机的数据包过滤器。

需要什么样的访问权限?在测试期间,您可能会阻止除测试网络和桌面之外的任何地方与主机的新连接。然而,在生产中,您需要选择对外开放的端口。允许公众连接到这些TCP端口:

您还需要一个用于SSH的TCP端口,但您可能会将其限制为来自管理网络的连接。使用密钥或其他非密码身份验证进行SSH。

您可能会看到对端口587或143的引用。最初,电子邮件使用端口465进行TLS保护的客户端提交。IANA声明人们不应该使用专用的TLS端口,而是在端口587上使用STARTTLS。他们最近改变了主意,将端口465上的专用TLS作为标准。10同样,端口143用于未加密的IMAP。

允许你的邮件主机只发送电子邮件是微不足道的。电子邮件需要TCP端口25用于SMTP,TCP和UDP端口53用于DNS。确定主机管理和操作系统更新所需的连接高度依赖于操作系统,远非易事。

TLS和X.509证书

您必须加密客户端和消息存储之间的连接,这通常意味着TLS。TLS需要X.509证书。多年前,自签名证书就足够了,但现在已不再如此。任何全局有效的X.509证书都可以。

一些组织有一项政策,要求从特定的CA购买所有X.509证书。但是,如果他们没有这样的政策,我鼓励使用Let's Encrypt等组织的免费证书。ACME客户端既可以为您提供免费证书,也可以自动续订,这样X.509证书就不会有问题了。如果你不熟悉ACME,请允许我推荐 dehydrated 客户端(https://dehydrated.io)以及我的书 TLS Mastery(倾斜风车出版社,2022年)。

配置ACME的最简单方法要求您的主机运行web服务器。

web服务器

许多用户会期望你提供一个基于网络的电子邮件客户端。我们将在第12章中介绍这一点,但无论如何,它下面都需要一个web服务器。此外,获得免费X.509证书的最简单方法是使用一个。本书使用Apache,但任何支持PHP的现代web服务器都应该可以工作。

如果您不打算提供网络邮件,并且您的组织的政策要求您使用昂贵的商业证书,并且您不想使用任何基于网络的配置工具,请跳过网络服务器。

数据库

Postfix和Dovecot可以使用数据库进行虚拟用户管理,您需要一个数据库来存储聚合的DMARC报告。MariaDB是这些应用程序中最受支持的数据库。

保护您的数据库,创建管理帐户,并在继续之前执行任何您想要的优化。数据库应该只允许通过网络或Unix套接字从本地主机进行连接。它不应该监听外部网络。

反垃圾邮件引擎rspamd需要Redis。Redis并不是一个数据库,但它足够接近,我将把它塞进这一节。

Postfix

Postfix是一个非常灵活的邮件系统,几乎可以支持现代互联网上的任何东西。安装支持首选数据库的软件包。

Postfix包括每个邮件系统所需的核心功能,以及仅少数环境所需的许多附加功能。我们将重点介绍使标准邮件系统运行和工作所需的工具。如果你发现你的环境需要一些特殊的东西,那么Postfix很有可能支持它。先让你的核心系统运行,然后再添加。

本书讨论了Postfix 3.8。如果你继承了一个旧的(或更新的!)Postfix系统,这本书可能会帮助你定位,但你必须对照你版本的文档仔细检查所有内容。www.postfix.org上的文档保留了有关历史版本的大量信息。

Dovecot

Dovecot套件最出名的是IMAP服务器,但它包括几个对Postfix有用的较小程序。是的,Postfix包括这些程序的自己版本,但Dovecot提供了有用的功能,如邮箱过滤和索引。通过在配置Postfix之前安装Dovecot,您可以优化配置Postfix。Dovecot还提供了重要的功能,例如用于与Unix帐户无关的电子邮件帐户的用户数据库。

Dovecot是一个非常强大的程序,几十年前由服务提供商为服务提供商创建。Dovecot开发了一些功能来支持不断增长的电子邮件用户。这本书记录了Dovecot的一小部分功能,就像Postfix一样。

如果您的操作系统为Dovecot的Pigeonhole提供了一个单独的软件包,请安装它。Pigeonhole提供Sieve邮件过滤语言。您还需要Pigeonhole的IMAPSieve和Extprograms扩展,这可能是额外的软件包或选项。

Netcat 和 OpenSSL

Netcat是一个灵活的网络工具,它允许您连接到任意TCP/IP端口。我们将使用它来测试服务。几十年来,netcat 被分叉、重新实现,并为其他自称 netcat 的程序提供了灵感。这些变体没有努力使其添加的功能与其他变体兼容。你的Unix可能会提供类似netcat的东西,比如 ncatsocat 。长命令不是很统一,因此 netcatncat和其他命令通常以 nc 安装。如果您在使用netcat时遇到问题,请查看手册中的确切变体。

有了这些问题,为什么要使用netcat而不是telnet?如果你认为netcat已经分叉,请等到你看到telnet。Telnet将标准输出与标准错误混合在一起,并默默地修改文本以与交互式shell兼容。Netcat也是可脚本化的,支持自动化。本书中的示例适用于BSD变体和Debian。

如果您的netcat支持TLS,并且有一两个选项,请随时使用它来测试TLS包装的服务。本书使用OpenSSL。大多数操作系统都附带了与OpenSSL兼容的命令行工具。OpenSSL的主要优点是它在操作系统之间是一致的,因此我们将使用它来测试TLS包装的服务。

Mailx

mailx(1) 程序是发送和读取电子邮件的Unix标准,就像 ed(1) 是标准文本编辑器一样。它通常与 mailMail 命令相关联。我们将使用 mailx 在终端中发送邮件。

每个版本的Unix都有自己的、稍微不兼容的 mailx 版本。某些版本包含发送、调试和阅读现代电子邮件所需的所有内容。其他的则没有。如果你有一个功能齐全的版本,请随意使用。否则,你需要一个更现代的邮件客户端。mailx 程序不会直接传递到Maildir。

Email 客户端

您需要一个在终端中工作的电子邮件客户端,以便在排除故障时绕过IMAP。它必须支持在撰写电子邮件时修改标题。如果您有适合的首选控制台客户端,请使用它。如果没有,我建议使用 mutt (https://mutt.org)。

在阅读文档时,您可能会看到对 .mailrc.aliases 文件的引用。这些文件用于配置 mailx(1) 。虽然一些现代客户端仍然解析 .alexes 或提供设置别名文件的选项,但 .mailrc 不适用于现代邮件客户端。当你看到这些参考文献时,立即仔细检查你正在阅读的文档是否与你的客户相关。

Syslog

电子邮件生成日志。每次Postfix、Dovecot、反垃圾邮件和客户端交互都会在日志中添加行。默认情况下,所有这些程序都会记录到系统邮件日志中。这很快变得不可持续。您必须熟悉操作系统的日志系统,并知道如何将来自不同程序的日志消息引导到它们自己的专用日志文件中。您不必立即实现精细分离的日志,但如果调试变成问题,请准备更改日志。

Email 和 Unix

电子邮件是随着Unix发展起来的,大多数Unix都将电子邮件集成到其软件中。这种集成不断发展,但旧的文档仍然存在。设置您的测试电子邮件系统,以反映当前的最佳实践。

Virtual Hosts

计算机支持虚拟IP地址,web服务器支持虚拟站点,主机支持虚拟服务器,电子邮件系统支持虚拟主机(virtual hosts)或虚拟域(virtual domains)。与“虚拟”一词的其他计算用途一样,邮件系统的虚拟主机允许主机管理主机和主机本身以外的域的SMTP。

我的一个测试主机是 mail.solveamuder.org 。该主机上的MTA被配置为处理该主机上用户的邮件,例如 mwl@mail.solveamurder.org 。这是服务器的真实或主要(primary)域。我希望它也能处理整个域的邮件,例如 mwl@solveamurder.org 。这是一个虚拟主机。如果我想为更多域添加对邮件的支持,这些域也是虚拟域。就像一个web服务器可能有一个像 www9.bighostingcompany.com 这样的主机名,但却承载着数百或数千个网站一样,邮件系统可以支持与它的磁盘、内存和CPU一样多的域。

虚拟主机上的电子邮件地址比邮件系统的主域有一个明显的优势。发往服务器主域用户的邮件必须具有Unix帐户才能接收该邮件。如果系统管理员有这个帐户,这不是问题,但给组织中的每个用户一个Unix帐户只是为了接收电子邮件,会打开许多可能的攻击渠道,并使系统管理复杂化。您可以与操作系统分开创建和管理虚拟域帐户。

MTA有一个“primary”域,可以添加其他“虚拟”域。我强烈建议将主机名(例如 mail.solveamurder.org )作为系统的主要电子邮件域,并将其他所有内容(包括您实际感兴趣的域(例如 solveamurder.com ))设置为虚拟。如果你运行的是一个人电子邮件系统,那么这样做可能是有意义的,但它限制了你未来的灵活性。

标准Email地址

按照标准和传统,人们希望在每个使用电子邮件的域中都存在特定的电子邮件地址。postmaster@ 地址应接受有关电子邮件问题的消息。hostmaster@ 地址是DNS事务的联系人。如果有人与您网络中的用户发生问题,他们可能会联系 abuse@ 。最后,与网络相关的事项会发送到 webmaster@

你一定要这些吗?不是的。

试图联系你的知识渊博的人会使用这些地址吗?对。

如果地址不存在,那些知识渊博的人会认为你不称职吗?也是的。

创建这些地址。将它们转发给真实的人。不发送或接受电子邮件的域名不受此做法的约束。

sendmail 命令

当SMTP协议首次逃逸时,标准MTA是Sendmail(https://www.sendmail.org)。Sendmail在20世纪80年代是革命性的。它的配置文件允许系统管理员在不重新编译程序的情况下进行细微更改。该配置文件使用了一种专门为处理和传递电子邮件的挑战而开发的独特语法,但电子邮件管理员需要对SMTP有深入的了解,这样就可以了。

Sendmail专为没有垃圾邮件或恶意用户的网络而设计,并针对交付进行了优化。与大多数其他Unix程序不同,它是一个执行多种不同任务的单片二进制程序。它接收来自用户、程序和网络的电子邮件,并通过网络发送消息。它重试排队的邮件。这是所有人的电子邮件。

在接下来的十年里,人们了解到 sendmail(8) 程序是电子邮件的接口。您可以使用邮件客户端以交互方式阅读和发送电子邮件,但如果shell脚本需要撰写和发送电子邮件时,它可能会调用 sendmail 。几乎每个Unix系统都有Sendmail,即使配置文件变得更加常见。

Exim于1995年推出,Postfix于1998年推出。这些新的邮件服务器面临着压倒性的安装基础,这些安装基础已经习惯了Sendmail的特性,并通过多年使用临时工具打击垃圾邮件而变得更加坚固。人们还编写了十多年的附加程序来使用Sendmail。为了简化迁移,Exim和Postfix都与Sendmail命令行兼容。他们可以读取特定于Sendmail的文件,如别名数据库。它们甚至包括一个 sendmail 命令,链接到实际的二进制文件。

“人类可读的配置文件”和“将邮件处理分解为几个小的单一用途程序”等创新最终获胜。今天,Sendmail是一个开源版本的商业产品,主要由我们这些习惯于使用配置文件生成配置文件的人使用。

在Unix上找到 sendmail 命令并不意味着您正在运行Sendmail。您可能有Sendmail、Exim、Postfix、OpenSMTPd、R2D2的Mail Thing或其他邮件处理程序。这个世界充满了期望找到 sendmail 命令的遗留内容,提供该命令比修复所有这些命令更容易。始终区分Sendmail程序和 sendmail 命令,并记住 sendmail 不一定是Sendmail。

本地邮件系统

一般来说,想要发送电子邮件的主机应该有一个邮件程序。这不需要是一个完整的邮件系统。我的大多数主机都运行简单的邮件代理,这些代理只将邮件转发到我的实际MTA,由我决定如何处理。

本地邮件程序,如 mailx(1)mutt(1) ,使用系统的 sendmail(8) 命令将传出邮件放入队列目录。队列目录的位置取决于您使用的服务器软件。Postfix使用 /var/spool/Postfix/ 下的子目录。MTA定期扫描队列目录并尝试传递邮件。

已安装但未配置的邮件软件可能能够将邮件传递到本地系统上的帐户。它可能能够将电子邮件转发到您的实际MTA。您的MTA可能会也可能不会接受这些邮件。您将无法可靠地将这些消息发送到组织中的系统之外。

别名

传统上,每个Unix帐户都可以接收和发送电子邮件。当账户很少,人类用户数量超过服务账户时,这是有道理的。然而,服务账户激增,而shell用户却减少了。虽然服务帐户向root发送电子邮件警告问题是明智的,但您不能向 httpdnobody 发送电子邮件并期望得到答复。即便如此,如果你管理着数百台服务器,你多久会登录一次特定服务器上的个人帐户来检查那里的邮件?

这就是 /etc/aliases 文件的作用所在。它最初来自Sendmail,但所有其他邮件软件都使用它。根据您的Unix打包Postfix的方式,您可能在Postfix的配置目录中有第二个别名文件。你可能会发现用另一个链接替换一个不那么令人困惑。

别名文件重定向在系统上发送的电子邮件。发往一个帐户的邮件可以指向另一个帐户。每一行都是别名文件,是单个重定向。

所有服务帐户都应该在 /etc/alias 中重定向。用户 daemon 的存在是为了拥有各种系统二进制文件,并且被禁止登录。没有人会检查此用户的电子邮件。以下设置,我将发送给用户守护进程的电子邮件转发到 root 帐户:

如果有东西向用户守护进程发送电子邮件,主机会将该邮件发送到 root 帐户。

不过,您多久检查一次此主机上 root 用户的电子邮件?将 root 的电子邮件转发给人。下面,我将 root 的电子邮件重定向到此主机上的我的帐户:

如果我没有在这个主机上阅读电子邮件,请将其发送给我阅读电子邮件的主机:

用逗号分隔,可以将邮件重定向到多个帐户,:

程序不直接解析 /etc/alias 。他们查阅 /etc/aliases.db ,这是一个由 /etc/aliases 创建的哈希文件。无论何时更改别名文件,都必须更新哈希文件。您将看到对 newalias(8) 的引用,但那是一个Sendmail程序。Postfix为此提供了 postalias(1)

我们将在第3章中查看Postfix对别名文件的处理。它的格式与系统别名文件完全相同。如果你有这两个文件,很容易混淆。我建议用另一个链接替换一个。

Mailbox格式

Unix系统以 mboxMaildir 两种格式之一存储电子邮件。虽然我的书通常会提供指导,这样人们就可以犯自己的错误,但这次我明确声明:永远使用 Maildir,讨论结束。

但我们还是会讨论的。

mbox 格式是Unix的第一个邮箱格式。每个邮件文件夹都是一个单独的文件,其中一个接一个地包含文件夹中的所有邮件。当索引节点很少、电子邮件消息很小、ASCII占主导地位时,它就充分发挥了作用——也就是说,在当今计算领域大多数人的工作寿命之前。mbox用 From 关键字分隔消息,这很简单,直到有人在行首使用 From 一词包含消息。删除文件夹中间的邮件意味着要删除该文件。一条损坏的邮件打乱了整个文件夹。邮件到达 /var/Mail/username ,并在保存到文件夹时被移动到用户的主目录中,因此其他人的巨大邮件可能会阻止您接收电子邮件。大多数涉及电子邮件的软件都支持mbox格式,这是许多Unix安装的默认格式。然而,大多数Unix安装不会在本地处理电子邮件,而是将消息转发到邮件系统上的选定帐户。

Maildir 格式将每条消息放置在自己的文件中。文件夹是文件系统目录。将每条消息放在自己的文件中可以简化管理。从文件夹中删除邮件并不意味着重写文件。一封损坏的邮件不会破坏文件夹。如果故障排除迫使您查看用户的消息,则每条消息都有自己的文件,从而简化了故障排除。

Maildir 格式在用户的主目录中创建一个目录,通常但不一定称为 Maildir 。全新的Maildir包含三个子目录:cur(用于用户收件箱中的邮件)、new(用于用户上次检查邮件后到达的邮件)和 tmp(临时空间)。用户创建的每个新文件夹都是另一个目录。文件夹中的每个邮件文件都有一个唯一的名称,该名称可能包括也可能不包括编写文件的主机、邮件的大小、收到邮件的日期等。

许多默认的Unix安装使用mbox格式,因为大多数单独的主机不需要在本地处理邮件,而且mbox是通用的。Maildir 被认为是现代标准,但一些遗留软件不喜欢它。

在命令行以交互方式发送邮件

脚本和程序使用 mailx(1) (又名 mail(1) )发送邮件,您也可以这样做。虽然mailx的功能因操作系统而异,但它们都包含POSIX强制的核心功能。 mailx 程序有一个必需的参数,即目标地址。在这里,我尝试在本地系统上邮寄我的帐户:

我立刻被提示回答一个问题。我在那里放了一些东西。(如果你的邮件不是关于什么的,为什么要发送呢?)

随后,屏幕变为空白。输入邮件正文:

在消息本身的一行上用单个句点结束消息:

Mailx使用 EOT (End Of Text)来确认我的消息已完成。根据您的mailx实现,您可能会收到更多要填写的字段,但您可以按 ENTER 键忽略它们以进行此测试。

当您完成邮件时,mailx会将其传递给本地邮件系统。Postfix使用 /var/spool/Postfix/maildrop 对尚未被MTA接受的传入邮件进行排队。如果您的MTA未运行,您的邮件将停留在该文件夹中。如果您有正在运行的MTA,它将立即接收邮件并将其传递到本地帐户。

命令行电子邮件最常见的用途是非交互式的。

在命令行以非交互方式发送邮件

继续使用 mailx(1) 在命令行中非交互式地发送邮件。使用 -s 指定主题。通过管道将邮件发送到 mailx

如果你有一个包含你的消息的文件,你可以将它重定向到 mailx

在这里,我向root发送了一行文本,只是为了看看它是如何工作的:

系统记录消息并将其发送给收件人。

消息ID

当邮件系统收到一封全新的邮件时,它会为其分配一个唯一的邮件ID。您可以使用邮件ID通过网络跟踪单个电子邮件。不同的运营商和软件使用不同的格式。Postfix使用了这个:

时间戳采用ISO8601:2004格式。每条消息还被分配了一个随机的十个字符的短标识符,以将其与同一秒内发送的其他消息区分开来。主机名是MTA对其完全限定域名的最佳理解。上面的测试消息获取此消息ID:

根据主机的时钟,此消息于2023年5月1日18:32:08 UTC发送。短标识符为 9E73A20116 ,主机为 mail.solveamuder.org

我们从哪里得到这个邮件ID?在消息中。

Email消息

你几乎肯定看到过电子邮件,但大多数人从未超越他们的电子邮件客户端所呈现的内容。我在主机 mail.solveamurder.org 的最后一节中发送了电子邮件。让我们在 /var/mail/root 中查看原始邮件文件。

这封三个单词的邮件是怎么变成十一行的?标题(Headers)。 email header 是处理由电子邮件系统的组件添加到消息中的信息。以下是最小邮件消息中的一些常见标题。并非所有邮件中都会显示所有标题。

我以root身份将电子邮件发送给root。 Return-Path 头,当存在时,会告诉收件人将弹出的消息发送到何处。这通常是 MAIL FROM 地址。 bounced 邮件是指目标服务器或某个中间MTA无法传递邮件。(“bounced(反弹)”一词也描述了一种转发方法,我们稍后会讨论。)

X-Original-To 标头给出了原始收件人地址。此邮件发往root,X-Original-to 保留该信息。任何以 X- 开头的标头都称为 X-header 。X-headers最初用于“协议中未包含的其他信息”,并在早期的基于文本的协议中被广泛采用。RFC6648在2012年弃用了新协议的X-header。虽然一些X-headers被广泛使用,甚至被标准化,但任何邮件软件开发人员都可以添加自己的X-headers。 X-Original-To 是最常见的一种。

Delivered-To 标头表示在任何跳转、转发或别名扩展后,谁将收到此电子邮件。此邮件由 root 在主机 mail.solveamurder.org 上收到。

在这里,发送MTA会记录它收到了消息。它是由UID为 zero 的用户通过Postfix发送的。id 空间给出了短消息ID。在下一节中,我们将看到如何使用消息ID通过日志跟踪电子邮件。我们还可以获得发送MTA收到此电子邮件的时间戳。

这两个标题对于任何使用过电子邮件的人来说都应该很熟悉。 To 是邮件的收件人。 Subject 应该足够吸引人,让我不会删除您未读的电子邮件。

这里我们有发送MTA分配的完整 Message-id

Date 字段记录客户端发送消息的时间。From 确定了扰乱我平静的人。

然后我们有一个空白行。电子邮件使用一个空行来分隔邮件的标题和正文。最后是我们的内容:

我们将在本书中详细介绍标题和相关主题。调试几乎任何邮件问题都意味着要仔细阅读邮件标题。

邮件日志

电子邮件是Unix不可或缺的一部分,它有一个专门的日志记录工具,mail 。大多数Unix将邮件消息记录到 /var/log 中的一个或多个文件中,例如 /var/log/maillog/var/log/mail-info/var/log/mail.log 或类似文件。如果找不到邮件日志,请在 /etc/syslog.conf/etc/rsyslog.conf 或类似文件中检查系统的日志配置。我的示例使用 /var/log/maillog

解决电子邮件问题的最佳方法之一是查看系统日志。运行 tail -f /var/log/maillog 可以实时显示Postfix的操作。检查日志,我看到五个条目。

主机名是 mail 。Postfix的 pickup 程序接受您的邮件。

在这里,postfix的 cleanup 程序接受消息并为其分配一个 message-id。postfix知道本地主机名,因此它将其用作message-id的一部分。它还将收件人地址从裸root规范化为 root@mail.solveamurder.org

队列管理器 qmgr 接受来自 cleanup 的消息。记录消息ID的随机部分,然后记录消息发送者。

队列管理器将我们的消息发送到 local 程序,该程序将其发送到root的收件箱。当您对邮件问题进行故障排除时,请查找 relaystatus 。relay(中继)是消息发送到的主机。status(状态)声明了将消息发送到该主机的结果。

一旦另一个程序接受了消息的责任,队列管理器就会将其从队列中删除。

是的,这是很多活动,但请注意时间戳。在这条完全在本地主机上处理的消息中,所有事情都发生在一秒钟内。发送到外部网络的消息可能需要更长的时间。

有了这些基础知识,让我们来看看如何配置Postfix和Dovecot。