第三章:Postfix和Dovecot设置

第三章:Postfix和Dovecot设置Postfix 组件Services命令Postfix 配置选项postconf(1)查看Postfix组件命令与编辑器重新加载或重启PostfixPostfix必备设置邮箱格式设置主机名和域出站邮件域入站邮件域信任的IP地址X.509证书标准 TLS强 TLS使用DANE的TLSTLS 日志记录测试 Postfix账户和地址队列管理Dovecot必备品Dovecot TLSdoveconf(1)Dovecot变量Dovecot日志记录和调试

Postfix是一款流行的免费开源邮件服务器软件,经过数十年的持续调试,使其成为面向互联网的邮件系统的绝佳选择。您的操作系统可能提供了几个Postfix软件包。选择集成了对首选数据库支持的软件包。

Postfix 组件

为了与Unix的一般理念保持一致,Postfix包括几个小程序,每个程序都处理一个特定的邮件处理任务。每个程序都提供一个或多个命名为 services ,支持将邮件从电子邮件系统的一个部分移动到另一个部分。它还包括用于管理电子邮件系统的程序。

Services

所有Postfix配置文件都位于 /etc/Postfix//usr/local/etc/Postfix 中。为了方便起见,这本书提到了 /etc/postfix 。这些程序大多从 main.cf 读取配置。

master(8) 守护进程监督Postfix套件,根据需要启动每个较小的程序。通过在 master.cf 中配置master守护进程来控制Postfix的核心功能。

新邮件被放置在 maildrop 目录中。 pickup(8) 守护进程监视新消息并将其交给 cleanup(8)

cleanup(8) 程序会检查它并执行所需的更正,例如添加缺失的标头、删除重复的收件人、设置盲复写副本(blind carbon copies)等。它会将消息插入队列并将其添加到队列管理器的列表中。

邮件队列管理器 qmgr(8) 跟踪邮件队列中的消息,并调用其他程序尝试传递它们。它将延迟邮件与新邮件分开处理,这样尝试传递有问题的邮件不会减慢新邮件的速度。

在本地系统或IMAP客户端上生成的全新邮件被传递给 trivial-rewrite(8) 守护进程,该守护进程在允许其继续之前根据本地策略对目标电子邮件地址进行标准化。

一旦消息的目标电子邮件地址被规范化,队列管理器就可以将其交给另一个程序。发往其他服务器的邮件会被传递给 smtp(8) 。Postfix的 local(8)virtual(8) 程序分别针对Unix风格的邮箱和虚拟邮箱设计,但我们将用Dovecot交付代理替换两者,以便客户端可以配置服务器端过滤。

Postfix支持多种特殊选项。它的 transport (传输)功能可以通过特定的中继、UUCP甚至shell脚本将邮件路由到特定的域。它可以以任何你想要的方式重新排列电子邮件标题。我们不会介绍这些罕见的环境:一旦你了解了Postfix的工作原理,配置Postfix就很简单了。(配置UUCP,没那么多。)

命令

Postfix包括几个用于管理系统活动的程序。我们将在本书中讨论其中的许多内容,但这里有一个概述。

postconf(1) 程序聚合系统配置,提供Postfix内置默认值和配置文件设置的统一视图。它还可以为您更改这些设置。

postfix(1) 程序控制Postfix。它允许您停止和启动系统,或重新加载配置文件。它还有几个用于维修和升级的附加功能。许多基于 systemd 的Linux对Postfix服务的处理很差,因此您需要使用 postfix 而不是 systemctl

Postfix队列管理程序 postqueue(1) 允许您管理各种邮件队列并验证队列完整性。

postsuper(1) 程序允许您手动戳戳Postfix的各个部分。

许多Postfix子程序是由Postfix调用的,而不是由人类调用的。大多数Postfix安装会将它们存储在它希望你找不到的地方,通常是BSD上的 /usr/local/libexec/Postfix 或Debian上的 /usr/lib/Postfix/sbin 目录。

Postfix 配置选项

现代邮件交换器需要使用当前的SMTP协议,但如果它们是为广泛使用而设计的,它们还必须支持旧的SMTP实现。很容易宣称你只会与现代MTA通信,但你的组织却有不同的要求。你整个业务所依赖的关键客户?自从尤达上次发脾气后,他们就没有更新过邮件系统,但你必须和他们交换信息。虽然基本的Postfix配置可以让你与大多数服务器交换消息,但 main.cf 支持近千个选项,可以让你应对几乎任何情况。每个选项都记录在 postconf(5) 中。

如何应对Postfix的数千种配置选项?老套的答案是“比典型的2000行Sendmail配置更容易”,但更实际的是,典型的环境只需要少数选项。每个配置选项由选项名称、等号和值组成。类似以下模样:

某些选项可以接受多个参数或接受环境变量:

你怎么可能管理好所有这些?

你不能,所以尽量不要。

您的操作系统几乎肯定附带了默认配置。从这里开始。Debian提供了一个 main.cf ,其中包含软件包维护者认为工作邮件系统的最低要求。FreeBSD的 main.cf.sample 也是一样的,加上一个合理的网站可能需要的几十个注释掉的示例。

每个配置选项也可用作变量。定义一个选项后,您可以在另一个配置设置中使用它,方法是在它前面加一个 $ 。在这里,我将配置选项 mydestination 设置为与选项 myhostname 等效:

变更 myhostname 将自动变更 mydestination

与许多其他程序不同,拆分长行很少需要反斜杠。以空格开头的行被认为是前一行的延续。下面,我将 mynetworks 设置为四个值的列表:

Postfix足够聪明,可以将这些聚合到一行条目中。

main.cf 中的语句按顺序处理。规则顺序在大多数情况下是无关紧要的,但如果你开始使用稍后描述的一些反垃圾邮件功能,那么这个顺序是至关重要的。第一个匹配的配置语句获胜,因此,如果你在“接受来自这些主机的邮件”之前加上“拒绝来自这些主机”,两个列表中的主机都将被阻止。

许多配置选项的名称以 smtpd 开头,而其他选项的名称则以 smtp 开头。很容易将 smtp_tls_security_levelsmtpd_tls_security_level 混淆。以 smtpd_ 开头的设置会影响正在运行的接收邮件的守护进程。以 smtp_ 开头的会影响发送邮件的出站SMTP会话。这种划分允许您建立类似“我们接受邮件,但只通过TLS发送邮件”的设置。

postconf(1)

postconf(1) 程序可用于检查和更改当前配置。虽然Postfix的配置文件是人类可读的,但每个配置选项都有一个编译到Postfix中的默认值。每个都可以在配置文件中被覆盖。很容易混淆。

要获得完整的选项列表,请运行 postconf -d 。将其保存到文件中以供参考:

浏览一下这个文件,你会发现很多令人困惑的选项,但其中大多数只适用于边缘案例。本书只讨论那些对运行小型邮件系统最有用的选项。

在所有这些选项中,哪些是在 main.cf 中明确设置的?您可以运行 grep -v 并删除注释和空行,也可以使用 -n 标志询问 postconf

最有趣的配置选项是那些设置为非默认值的选项。但是,显式配置的设置与非默认设置不同。我经常明确地设置默认值来提醒我基本知识。使用 comm(1) 将当前配置与默认设置进行比较。 comm 程序需要排序的输出,但默认情况下 postconf 会对其输出进行排序。请确保将 postconf -n 的输出作为第一个参数,将默认设置作为第二个参数,以便我们打印非默认选项。

这个软件包的维护者认为,这些设置是可能给你发电子邮件的最低限度。更有可能的是,这些是此操作系统上每个Postfix安装所需的设置。这些是什么意思?

compatibity_level 选项告诉Postfix在升级后记录向后兼容性警告。这是Postfix 3.7的全新安装,为什么会有兼容性警告?我们现在不需要这个,但有一天我们可能会升级到3.8。升级后的守护进程将查看 main.cf ,看到此警告,并说“啊!我需要解析3.7个选项,但要记录正在使用这些选项的警告,并将人们指向新选项。”Postfix不会随意重命名选项,目前功能相当完整,但现有选项可能会被拆分为多个部分,以实现更精确的邮件处理。清除这些警告后,将 compatibility_level 更改为当前的Postfix版本。

MTA有一个他们信任不会发送垃圾邮件的主机列表。这可能是支持组织桌面和服务器的IP地址范围。mynetworks_style 选项告诉Postfix默认情况下信任哪些主机。将此设置为 host 意味着Postfix只信任其安装的主机,不会中继来自网络上任何地方的邮件。它将接受要传递到本地主机的邮件。要转发来自未经身份验证的客户端的电子邮件,您必须明确配置可接受的地址范围。这也是当今互联网上一个合理的默认设置。

电子邮件可以使用TLS。smtp_tls_CApath 选项告诉Postfix在何处查找此主机的受信任X.509证书颁发机构证书。

一些软件包默认设置了更多选项,但所有选项都遵循这种通用模式。

查看Postfix组件

Postfix包括许多较小的程序和服务,这些程序和服务可能在任何环境中使用,也可能不使用。master(8) 守护进程按照默认配置启动这些程序,并被 master.cf 覆盖。 postconf(1) 程序的 -M 标志解析所有这些,并显示 master(8)

这些可能并非都在持续运行。它们甚至可能不是单独的守护进程。但是,如果 master(8) 需要服务的支持,那么它就是这样调用和配置该服务的。

运行 postconf -M 可以查看整个系统,但如果你想查看特定组件的配置,请将其名称作为参数。要查看队列管理器重试延迟邮件的频率,请检查 qmgr

也许我不知道这个特定的主机是否正在运行接受客户端电子邮件的提交服务。

此Postfix安装程序对该服务一无所知。我们将在第5章中编辑 master.cf 以启用它。

命令与编辑器

您可以使用文本编辑器编辑 main.cf 和其他Postfix配置文件,也可以使用 postconf(1) 进行更改。哪个是正确的?

两者都有,两者都没有。

更重要的问题是,你如何管理你的服务器?如果你使用像Ansible这样的自动化系统来指挥你的主机群,那么你已经在使用命令驱动的配置了。如果您运行的是单个手工服务器,则可以轻松启动一个适当的文本编辑器并直接在文件中进行更改。也许您将配置文件存储在版本控制系统中,并将其推送到生产环境。使用任何适合你的方法。这本书使用了这两种方法。

在命令行中设置配置选项,方法是将选项及其值用引号括起来作为参数:

vipw(1)visudo(1) 等程序不同, postcnf 不进行有效性测试。如果你使用 postconfUseTheForceLuck 选项设置为 yes ,它就会这样做。重新启动Postfix时,你会看到“未使用的参数”警告,但 postconf 不会提前警告你。这是无害的。如果您移动X.509 CA证书并设置选项 smtp_ssl_CApath 而不是 smtp_tls_CApath ,则并非无害。

每当您更改 main.cf 或其他配置文件时,都必须重新加载或重新启动Postfix。

重新加载或重启Postfix

Postfix的各种服务在以特定顺序或按照自己的时间表启动和停止时效果最佳。Postfix使用 postfix(1) 程序来管理这些核心功能等。

使用 start 选项启动Postfix。

使用 stop 选项干净地关闭Postfix:

配置更改稍微复杂一些。Postfix程序仅在启动时或被告知查看时才会注意到配置更改。某些Postfix守护进程会持续运行。其他人在处理一定数量的请求或特定持续时间后自动终止。例如,队列管理器每十分钟启动一次。如果更改了与队列管理器相关的设置,则该更改将在下次运行队列管理器时生效。如果你更改了与 master(8) 相关的内容,Postfix会注意到的唯一方式就是当你重新加载或重新启动Postfix时。最好让Postfix服务通过 reload 重新读取其配置文件,而不是确定是否会自动获取特定的更改。

这些看起来很像 service(8)systemctl(8) 等程序提供的功能。您应该使用 postfix ,还是依赖操作系统的管理功能?这应该没关系,但可能会。在大多数Unix中,像 service(8) 这样的程序以适合该操作系统的方式调用后缀。用你喜欢的任何一种。如果你发现一个工具在特定情况下不起作用,或者缺少另一个工具提供的功能,请寻求支持,并(如果需要)提交错误报告。

在执行任何其他操作之前,请配置Postfix如何处理传入邮件。

Postfix必备

MTA必须知道它以哪个域的身份发送邮件,它接受哪些域的邮件,以及它将为哪些客户端中继邮件。这三件事不一定是一样的!需要(或已经售出)复杂邮件系统的组织通常有单独的发送和接收系统,如果销售人员真的很幸运,可能还有一层额外的面向客户端的服务器。然而,对于我们的测试系统,我们将首先使每个系统成为其域的唯一MTA。

为什么Postfix不能直接从操作系统中提取这个?通过SMTP发送邮件的MTA必须通过完全限定域名(fully qualified domain name —— FQDN)标识自己。SMTP不能使用像mail这样的短主机名:它需要像 mail.solveamuder.org 这样的全名。没有两个Unix就系统应如何存储或检索FQDN达成一致。一些Unix使用完全限定的域名作为主机名,以便 hostname(1) 检索它。其他Unix则从主机名中删除域信息。更糟糕的是,经验丰富的系统管理员在这个问题上意见不一,并推翻了他们系统的默认设置。一些Postfix包维护者认为系统对自己的FQDN一无所知,并为您编写了一个硬代码,而另一些人则认为系统提供了完整准确的信息并依赖于它。在复杂的邮件系统中,主机的FQDN不是Postfix应用于发送邮件的FQDN。每种默认方法都会失败。最聪明的软件包维护者意识到他们无法控制这一切,并将整个问题推到它所属的地方:你。

我们可以阅读配置文件,考虑所有可能性,并对Postfix的配置做出假设性的理解。或者,我们可以在最重要的选项上配置合理的默认值,而不用担心这些。我们会这么做的。

设置邮箱格式

第一章讨论了两种常见的邮箱格式,mboxMaildir 。虽然mbox对于不处理太多邮件的主机来说很好,但邮件存储应该 始终使用Maildir 。在构建和测试过程中,我们将发送和接收邮件,因此请在执行其他操作之前设置邮箱格式。

选项 home_mailbox 控制Postfix如何存储传入邮件。默认情况下,它是空的,让系统将收到的邮件隐藏在任何它喜欢的地方——通常在 /var/mail 中。通过给 home_mailbox 一个值,您可以告诉Postfix将新消息添加到用户主目录中具有该名称的文件中。以斜线结尾的文件名指示Postfix使用 Maildir 格式,而文件名表示 mbox 。在这里,我们将home_mbox 设置为使用标准的Maildir目录 $HOME/Maildir

重启Postfix并发送一个测试邮件:

如果你转到这台机器上的主目录,你会看到一个新的 Maildir 目录。它包含默认的 curnewtmp 文件夹。看看 new 的内部,你会发现一个名字很长的文件。这是您的新电子邮件。检查标题。

正如我们在上一章中看到的那样,Return-Path头告诉邮件交换器将弹出的消息发送到何处。此邮件应被退回 root@mail.localdomain. 这在公共互联网上是无效的。这是来自一个不知道其域名的未配置邮件系统。像 ReceivedMessage-Id 这样的标头强化了这一点。您必须配置此Postfix安装。

以上测试,在debian下正常,但在FreeBSD14.2下未能生成 $HOME/Maildir目录。原因未知

 

设置主机名和域

选项 myhostname 告诉Postfix应该使用什么作为本地主机的名称。Postfix将 myhostname 用作许多其他选项的默认值,并将其用作其他选项的一部分。即使 hostname(1) 返回主机的FQDN,也始终在 main.cf 中设置 myhostname

同样,选项 mydomain 设置本地域名。Postfix默认使用 myhostname 减去第一个术语。Postfix使用本地域(local domain)作为许多其他选项的默认值。

从技术上讲,你不需要两者都设置。视乎 hostname(1) 是否返回FQDN,Postfix会给出一个合理的猜测。考虑到操作系统更新、组织策略更改或具有不同偏见的系统管理员更改了 hostname 的输出,也要为邮件系统提供其工作所需的所有信息,所以最好两者都设置。

我们将使用这些来进一步配置Postfix。

出站邮件域

您必须定义Postfix将从哪个或哪些域发送。Postfix将使用这些信息来润色它从客户端收到的任何电子邮件,以便它可以将来自 mwl 的电子邮件转换为具有有效地址的内容。

我们将在第4章中介绍虚拟域。目前,我们正在根据主机名配置邮件,如第1章所述。使用 myorigin 选项告诉Postfix它发送邮件的实体。这台机器应该默认以自己的主机名发送邮件。我们已经将其设置为选项,因此我们可以重用它。

若使用 postconf 命令设置此选项,$ 符号需要转义:

记住,发送到您的主机名免费域的邮件最好作为虚拟域使用。

入站邮件域

MTA不应该接收来自其发送邮件的相同域的邮件吗?大多数情况下是的,但并非总是如此。使用 mydestination 选项定义Postfix接受邮件的主机或域。默认情况下,接受 $myhostnamelocalhost 的邮件,但要明确表示这一点:

为什么同时指定 localhost.$mydomainlocalhost ?主机上的不同程序可能会尝试使用不同的地址格式发送邮件。接受常见的合法格式比识别和更改软件更容易。

信任的IP地址

如果Postfix信任一个IP地址,它将转发来自该地址的任何消息到互联网上的任何地方。盲目信任IP地址意味着任何受感染的系统桌面或服务器都可能成为垃圾邮件的死星,并在几分钟内将您的MTA列入数十个黑名单。发送未经身份验证的状态和警报消息的服务器应将所有内容传输到您的主邮件系统。桌面客户端在被允许向网络外发送邮件之前应进行身份验证。

Postfix默认只信任本地计算机,但包维护者可能会更改该默认值。使用 mynetworks_style 选项显式声明两种受信任的IP地址之一。将其设置为host 表示仅信任本地主机;或设置为 subnet 表示盲目信任本地网络上的每个主机,无论它们喷出了多少垃圾或所述垃圾声称来自哪里。

如果入侵者闯入此系统,您的主机仍可能喷出上述垃圾洪流,但这是一个比整个网络小得多的攻击面。

如果您确实需要信任特定的IP地址,而不仅仅是“此主机本地的所有内容”,请查看下一章中的 mynetworks 选项。

X.509证书

在今天部署邮件系统时,没有理由不使用有效的X.509证书。有效的证书现在是免费的,您应该了解如何管理它们。如果你需要指导,我的书 TLS Mastery (倾斜风车出版社,2021)详细讨论了X.509证书和TLS。

Postfix要求所有证书都采用PEM格式。主要问题是使用X.509时,如何存储密钥文件?传统上,一个文件包含私钥,另一个文件则包含证书以及任何中间证书。(不包括中间证书可能是配置TLS时最常见的错误。)包含证书和中间证书的文件称为 chain (链)文件。除Postfix之外的一些服务器软件甚至希望您将密钥文件与链文件组合在一起,以避免罕见的竞争情况。无论哪种方式,都可以使用 smtpd_tls_chain_files 指定服务器的证书文件。

使用单独的密钥和链文件,先指定密钥,然后指定链:

如果您有一个组合密钥/链文件,请将其用作唯一的参数:

如果您有多个具有不同算法的证书,请逐一列出:

手册将显示发送邮件有相应的 smtp_ 选项,但除非接收者需要客户端身份验证,否则不需要配置发送消息的证书。

标准 TLS

一旦你的服务器能够证明它是谁,就允许使用选项 smtpd_tls_security_levelsmtp_tls_security_level 进行TLS加密会话。值 none 禁用TLS,而 encrypt 需要TLS。首选值 may 提供TLS,并在可用时使用它。

接收和发送邮件的设置不需要相同。根据您组织的安全策略,您可以声明您发送的任何邮件都必须使用TLS,但仍将接受非TLS消息。这取决于你。

Postfix在兼容性方面出错,并启用了较旧的TLS版本和较弱的算法。和许多人一样,他们认为糟糕的加密比回到明文要好。

强 TLS

有些人希望不仅在所有连接上使用TLS,而且使用现代TLS。他们更喜欢丢失消息的可能性,而不是不安全的传输风险——不仅禁用1.2之前的所有版本的TLS,而且拒绝所有弱密码。他们认为,由于服务器太旧,无法使用TLS 1.2,因此可能有cooties。你可以放纵你的偏见,至少直到它们干扰了工作的完成。

使用两个 _tls_security_level 选项要求加密,然后设置 smtpd_tls_protocolssmtp_tls_protocols 以定义可接受的TLS版本,用于发送和接收消息:

选项 smtpd_tls_mandatory_protocolssmtp_tls_mandatory_protocols 适用于强制(mandatory)使用TLS的连接。我通常将这些设置为非强制性(non-mandatory)的等效值:

如果你想将TLS 1.2限制为强密码(ciphers),请使用 smtpd_tls_cryptorssmtpd_tcs_mandatory_ciphers 接受邮件;使用 smtp_tls_cipherssmtp_tls-mandatory_cryptors 发送邮件。将这些设置为 high 会使用OpenSSL的high密码列表。 _mandatory_ 版本规定了当连接主机需要TLS时可以使用哪些协议和密码。您可以通过将这些选项设置为使用非强制性选项来证明这些选项的未来性:

你可以进一步锁定TLS,但它很少有效。MTA不一定验证X.509证书,因此禁用匿名密码没有任何好处。

使用 testssl.sh (https://testssl.sh/ ,FreeBSD可使用 pkg install testssl.sh 命令安装)验证您的服务器对传入消息的TLS是否按您喜欢的方式设置。它应该报告所有版本的SSL都已禁用,只有您选择的TLS版本和密码处于活动状态。关于“匿名NULL密码”和“服务器密码顺序”的警告与SMTP无关。

不过,为了获得最大的TLS,请在出站邮件上启用DANE验证。

使用DANE的TLS

除非远程站点明确指示您这样做,否则您无法在公共Internet上验证证书真实性。我们将在第15章中查看MTA-STS,但为出站消息配置DANE验证要简单得多。

DANE需要DNSSEC。主机的解析器应配置为验证DNSSEC查询。告诉Postfix使用 smtp_dns_support_level 选项使用DNSSEC进行查询:

启用该支持后,您可以告诉Postfix检查并验证DANE的TLSA记录:

如果远程服务器没有可用的TLSA记录,TLS将回退到 may 。如果TLSA记录存在但不可用,连接将回退到 encrypt

为入站邮件启用DANE与Postfix无关。这需要发布服务器证书的TLSA记录,并将TLSA记录更新与证书续订同步。发件人完成DANE验证的所有工作。

TLS 日志记录

默认情况下,Postfix不会记录任何TLS活动,但故障排除需要它。 smtp_tls_loglevel 选项控制出站TLS活动的日志记录,而 smtpd_tls_loglevel 管理入站TLS的日志记录。

我通常使用级别 1

测试 Postfix

理论上,您的Postfix安装现在可以向本地主机名发送邮件和从本地主机名接收邮件。这是一个正确的理论,因为它是可证伪的(falsifiable)。在两个测试主机上测试配置。首先在单独的终端窗口中打开邮件日志:

现在,在两个本地系统上给自己发送一封邮件,而不使用完整地址:

此邮件应转到您在此主机上的帐户,例如 mwlucas@mail.ratoperatedvehicle.com ,并且几乎瞬间出现。如果日志声明Postfix正试图将其发送到裸域地址,例如 mwlucas@ratoperatedvehicle.com 中间没有 mail ,你把 $myorigin 搞砸了。如果消息已送达,请在 ~Maildir/new 中查看文件。Return-PathDelivered-ToTo 头部都应包含完整的电子邮件地址。

行吗?太棒了,您可以从邮件目录中删除该测试消息。使用完整的电子邮件地址作为收件人,重复测试。

这也应该在当地交付。

现在是苛刻(acid)测试。你有两台机器。让每个人向远程主机发送一封邮件。下面示例中,在 mail.ratooperatedvehicle.com 上,我向我在另一个测试主机上的帐户发送邮件:

您应该在两台主机的日志中看到活动。几秒钟内,来自一个主机的邮件应该到达另一个主机并被接受。看看这条信息。 Return-PathFrom 头部应给出源电子邮件地址。X-Original-ToDelivered ToTo 标头应包含目标地址。

账户和地址

你的测试系统的设置方式与20世纪大多数邮件系统相同。每个电子邮件地址都与一个Unix帐户相关联。添加Unix帐户会自动创建一个匹配的电子邮件地址。没有Unix帐户的电子邮件地址由别名文件处理,如第1章所述。如果地址既没有帐户也没有别名,则该地址无效。

这对大多数现代系统来说都是不可取的,即使你真的只为自己运行电子邮件。如果你想为朋友、家人或一个小组织添加更多帐户,那将是一场灾难。也许我的 half-Wookie-but-balding 叔叔需要一个家庭域名的电子邮件帐户,但我知道一个事实,他回答了每一个头发修复垃圾邮件,他不明白Netflix和他的手机之间的区别。他的电子邮件不应与Unix帐户绑定,也不应与任何系统访问绑定。

我们将在第4章中解除Unix帐户与电子邮件地址的关联。

队列管理

测试的好处是:如果它们失败了,让你有机会在同事看到问题之前解决问题。但是,当您测试邮件时,您将创建无法投递的邮件。无法传递的消息将在队列中溃烂数天,使日志变得混乱,并产生定期警告消息,直到Postfix放弃尝试传递消息并向发件人发出失败通知。

对于我们正在进行的这种测试,这些重试是毫无意义的——或者更糟糕的是,你会改变一些东西来使这些消息可交付,突然之间收件人会收到一堆旧的测试消息。省去麻烦,从队列中删除您知道无法送达的消息。

postqueue(1) 命令允许您查看队列。它还可以告诉 postfix(1) 尝试传递延迟的消息,但现在使用 -p 标志来查看延迟的消息。

此队列包含一条消息。消息ID为4EB6A10094。发件人是 root@ratoperatedvehicle.com 。当前传递错误消息在括号中。我们看到目标主机 ratoperatedvehicle.com 及其IP地址。实际错误是“Operation timed out”(操作超时)。收件人, mwlucas@ratoperatedvehicle.com ,最后出现。

此消息是一个错误。我在 mail.ratoperatedvehicle.com 上尝试向本地帐户 mwlucas 发送邮件。然而,Postfix的 myorigin 设置为 ratoperatedvehicle.com。地址的缺失部分被设置为 ratoperatedvehicle.com ,我的测试服务器试图向该主机发送邮件。虽然宿主 ratoperatedvehicle.com 确实有一个网站,上面有老鼠驾驶小型汽车的视频,但它缺乏MTA。此连接永远不会完成。几天后,Postfix将报告此邮件无法送达。

我不需要Postfix的努力来重试这条注定要失败的消息,这会弄乱我的邮件日志。使用 postsuper(1) 将其从队列中删除,使用 -d 给出消息ID:

失败的消息已消失。

您可以使用 ALL参数消除队列:

您是否应该定期进入队列并删除无法送达的邮件?可能不会。用户需要看到跳出消息。它们具有教育意义。

也许您已经在其他地方修复了导致邮件备份的错误,并希望Postfix尝试传递所有未完成的邮件。使用 -f 标志强制立即重新交付尝试:

您现在有两个功能模糊的邮件系统。不要在公共场合使用它们!在尝试与世界对话之前,您需要配置周围的服务并安装保护措施。

Dovecot必备品

Postfix面向世界,但Dovecot面向用户。与Postfix非常相似,Dovecot是一套程序,它们协同工作,提供面向客户端的多个邮件服务,如IMAP、身份验证和过滤。支持过滤要求您将Dovecot编织到SMTP服务器中比预期更深的位置,但这是由系统管理员控制的。

Dovecot通过大量注释的包含( include )文件提供了一个非常模块化的示例配置。它旨在快速设置最常见的服务,并且只是巧合地减少了初学者的支持问题。此配置包括我们不需要的服务和不太安全的选项,因此我们不会按原样使用它们。以 .conf 结尾的示例文件旨在加载到默认配置中,而以 .ext 结尾的文件则不太需要。当您决定将Dovecot连接到数据库、LDAP服务器或OAuth2系统时,这些示例非常有用。每当您对Dovecot的工作原理有疑问时,请检查示例配置。更改配置后必需重新启动 dovecot

每当您运行Dovecot程序时,它都会尝试读取配置文件 doveco.conf 。如果它无法读取文件或处理内容,它将拒绝运行。对于基本命令,空配置有效。

您现在不需要设置任何选项,但让我们看看配置样式。每个设置都包含一个选项名称、一个等号和一个或多个设置。在这里,我列出了我们将使用Dovecot的协议,使用 protocols 选项:

某些选项需要逗号作为分隔符。 listen 选项设置Dovecot在上创建套接字的地址。IP地址很复杂,因此必须用逗号分隔:

服务有自己的节,允许通过用括号分隔节来进行每个服务的配置。下面是我们将在本书后面设置的一些示例片段:

Dovecot支持许多协议,配置可能会变得非常复杂。Dovecot允许您将配置拆分为多个文件,并使用 !include 声明:

我们将通过设置TLS开始配置Dovecot。

Dovecot TLS

与Postfix一样,Dovecot使用无处不在的OpenSSL工具包处理TLS。与包括OpenSSL在内的许多程序一样,它仍然将TLS称为“SSL”。使用它。将 ssl 选项设置为 required ,以坚持所有连接使用纯TLS或STARTTLS,如服务允许的那样。

如果服务使用STARTTLS,客户端可以决定是否使用TLS。服务器无法控制他们的决定。然而,Dovecot可以做的是声明它不会接受以纯文本形式传输的凭据。

Dovecot认为来自本地主机的连接是安全的。如果你在运行Dovecot的主机上测试STARTTLS要求,你会发现它接受纯文本凭据。然而,它拒绝来自其他主机的未加密凭据。

Dovecot的TLS的问题是,只有特权用户才能读取X.509私钥文件。有时,无特权甚至受限的用户需要运行Dovecot程序,原因与TLS无关。他们将读取 doveco.conf ,遇到TLS证书信息,无法读取这些文件,并在做任何有用的事情之前退出。

Dovecot为这些情况提供了 !include_try选项。include_try 语句表示“尝试包含此配置,但忽略任何错误并继续。”我们将把X.509证书信息拆分为一个单独的文件并 include_try它。您的 doveco.conf 需要这些语句:

为您的证书详细信息创建一个单独的文件 tls-doveco.conf 。使用 ssl_certssl_key 给出完整证书链和私钥的路径:

=< 语法指示Dovecot使用文件内容作为值。您不希望Dovecot尝试使用密钥文件的路径作为密钥!

有了这个,特权用户可以运行Dovecot命令并读取密钥文件。当一个没有特权的用户运行Dovecot命令时,该命令将无法读取关键文件,但耸耸肩继续。

进行此更改后重新启动Dovecot,我们将检查更改是否已生效。

doveconf(1)

Dovecot有自己的配置管理程序 doveconf(1) 。与 postconf(1) 不同,它不会更改配置文件——为此必须使用 doveadm(1) 。它甚至可以显示每个服务和每个网络配置。

运行 doveconf -a 显示所有选项的当前值。超过一千行。 -n 标志显示了已从默认值更改的选项,这可能更有用。

我们的变更已经到位!

您还可以查询特定选项的值:

使用 service 关键字转储所有dovecot服务的配置。您必须搜索您感兴趣的特定服务,但这比扫描所有可能设置的列表更容易。

在本书的后面,我们将使用这些功能来设置面向客户端的服务。

Dovecot变量

Dovecot包括各种 variables(变量)、可用于配置文件的宏。变量允许您集中管理SQL查询字符串、按IP地址过滤等。我们将用用户管理宏来说明。

变量 %u 表示完整的用户名。在Dovecot术语中,用户名是一个电子邮件地址,如 mwl@solveamurder.org .

%n 给出用户名的名称部分,即 @ 符号之前的位。

同样,%d 给出了用户名的域部分,即 @ 符号后的部分。 最后,%s 标识正在使用的协议。您可以对IMAP和SMTP进行单独的配置。

Dovecot还有许多其他宏,但这给出了这个想法。我们将在第4章中使用这些配置帐户。

Dovecot日志记录和调试

Dovecot所做的大部分工作对用户来说都是看不见的。您必须能够查看其日志。您可以跟踪您的syslog配置,也可以让dovecot为您查找日志。dovedmlog子命令为您查找日志。

阅读日志只是问题的一部分。你需要让Dovecot在这些日志上写下细节。使用 doveco.conf 选项 mail_debug 制作dovecot日志详细信息:

调试日志增长巨大。监控它们的大小。

像Postfix一样,Dovecot可以填满一本书。和Postfix一样,你不需要知道所有这些功能。dovedam(1) 手册页描述了许多功能,并提供了很好的示例。让我们继续看看这些程序是如何支持电子邮件的。