Postfix 快速 ETRN 服务的目的
SMTP ETRN 命令专为互联网连接不稳定的站点设计。通过 ETRN,站点可指示其邮件服务提供商的 SMTP 服务器"立即投递所有邮件"。SMTP 服务器会在队列中搜索发往该客户的邮件,并通过连接至客户的 SMTP 服务器进行投递。邮件不会通过发送 ETRN 时使用的连接进行投递。
从版本 1.0 开始,Postfix 实现了快速 ETRN 功能,无需 Postfix 检查每个队列文件。相反,Postfix 会记录哪些队列文件包含发往已配置 ETRN 服务的收件人的邮件。未配置 ETRN 服务的域不再支持该服务。
本文档涵盖以下主题:
- 使用 Postfix 快速 ETRN 服务
- Postfix 快速 ETRN 工作原理
- Postfix 快速 ETRN 服务限制
- 配置 Postfix 快速 ETRN 服务
- 仅为域配置 ETRN 服务
- 测试 Postfix 快速 ETRN 服务
与本主题相关的其他文档:
- flush(8), flush 服务实现
使用 Postfix 快速 ETRN 服务
以下是一个示例 SMTP 会话,展示了 SMTP 客户端如何请求 ETRN 服务。客户端命令以粗体显示。
220 my.server.tld ESMTP Postfix HELO my.client.tld 250 Ok ETRN some.customer.domain 250 开始排队 QUIT 221 Bye
如前所述,邮件是通过连接到客户的 SMTP 服务器进行投递的,并非通过发送 ETRN 命令时使用的连接发送。
Postfix 操作员可通过命令 "sendmail -qRdestination" 请求为特定客户发送邮件,而在 Postfix 1.1 及后续版本中,可使用 "postqueue -sdestination"。此功能的访问权限由配置参数authorized_flush_users控制(Postfix 2.2 及更高版本)。
Postfix 快速 ETRN 的工作原理
当 Postfix 投递代理决定邮件需稍后投递时,它会将目标域名和队列文件名发送给 flush(8) 守护进程。该守护进程维护按目标域名的日志文件,其中包含队列中邮件的文件名。这些日志文件保存在 $queue_directory/flush 目录下。仅为满足以下条件的收件地址维护按收件地址分类的日志文件:该收件地址在 $fast_flush_domains 参数中列出,且域名语法正确。
Postfix
delivery
agent- (domain, queue ID) -> Postfix
flush
daemon- (队列 ID) -> 一个日志文件
每个符合条件的
域
当 Postfix 收到"立即为某个域发送邮件"的请求时,flush(8) 守护进程会将该域中所有列出的 延迟队列 文件到 入站队列,并请求队列管理器进行投递。为了强制投递,队列管理器会暂时忽略不可投递的目的地列表:内存中易失性的已死亡域列表,以及通过defer_transports配置参数指定的消息投递传输方式列表。
Postfix 快速 ETRN 服务限制
flush(8) 服务器和 flush 队列的设计引入了几个限制,除非您希望为所有可能的目的地启用快速 ETRN 服务,否则这些限制不应成为问题。
- flush(8) 守护进程为每个目的地维护包含队列文件名的日志文件。当收到"立即投递邮件"请求时,Postfix 将尝试投递队列文件中所有有邮件的收件人。这在队列文件包含来自多个不同域的收件人时表现不佳,例如包含外发邮件列表流量的队列文件。
- flush(8) 守护进程仅为 $fast_flush_domains 中列出的目的地维护按目的地划分的日志文件。对于其他目的地,您无法使用 "sendmail -qRdestination" 请求投递,或在 Postfix 1.1 及更高版本中使用 "postqueue -sdestination"。
- 在 Postfix 2.1 及更早版本中,如果在 延迟队列 扫描正在进行时收到"立即投递邮件"请求,"fast flush" 服务可能无法投递部分消息。原因是队列管理器不会忽略内存中易失性的已死域列表,以及通过defer_transports配置参数指定的消息投递传输列表。
- 在 Postfix 2.3 及更早版本中,如果在 入站队列 扫描已进行中时收到"立即投递邮件"请求,"fast flush" 服务可能无法投递部分消息。
配置 Postfix 快速 ETRN 服务
flush(8) 守护进程的行为由 main.cf 配置文件中的参数控制。
默认情况下,Postfix 的"快速 ETRN"服务仅对 Postfix 愿意中继邮件的目的地可用:
/etc/postfix/main.cf: fast_flush_domains = $relay_domains smtpd_etrn_restrictions = permit_mynetworks, reject
注释:
- relay_domains 参数指定 Postfix 将转发邮件的目的地。对于不符合 "fast ETRN" 服务条件的目的地,Postfix 将返回错误消息。
- smtpd_etrn_restrictions 参数限制了哪些客户端可以执行 ETRN 命令。默认情况下,所有客户端均有权限。
要为其他目的地启用"快速 ETRN",请指定:
/etc/postfix/main.cf: fast_flush_domains = $relay_domains, some.other.domain
要禁用"快速 ETRN",使 Postfix 拒绝所有 ETRN 请求并保持不为每个目的地维护日志文件,请指定:
/etc/postfix/main.cf: fast_flush_domains =
仅为ETRN服务配置域
当"ETRN"客户离线时,Postfix会自动尝试向其投递邮件。这些尝试在时间上以递增的时间间隔分开,范围从 $minimal_backoff_time 到 $maximal_backoff_time,除非有大量邮件积压,否则通常不会造成问题。
为了防止 Postfix 进行自发投递尝试,您可以配置 Postfix 始终推迟 "ETRN" 客户的邮件。邮件仅在收到 ETRN 命令、使用 "sendmail -q"、使用 "sendmail -qRdomain",或使用 "postqueue -sdomain"(仅限 Postfix 1.1 及更高版本)时投递。
在下面的示例中,我们配置了一个"etrn-only"投递传输,它只是"smtp"和"relay"邮件投递传输的副本。唯一区别是,发往此投递传输的邮件在到达时会被立即延迟。
1 /etc/postfix/master.cf: 2 # ============================================================= 3 # 服务类型 权限 是否启用 运行环境 唤醒间隔 最大进程数 命令 4 # (yes) (yes) (yes) (never) (100) 5 # ============================================================= 6 smtp unix - - n - - smtp 7 relay unix - - n - - smtp 8 etrn-only unix - - n - - smtp 9 10 /etc/postfix/main.cf: 11 relay_domains = customer.tld ...其他域名... 12 defer_transports = etrn-only 13 transport_maps = hash:/etc/postfix/transport 14 15 /etc/postfix/transport: 16 customer.tld etrn-only:[mailhost.customer.tld]
翻译:
- 第8行: "etrn-only" 邮件投递服务是 "smtp" 和 "relay" 服务的副本。
- 第 11 行:别忘了为该客户授权中继,可通过 relay_domains 或使用 permit_mx_backup 功能。
- 第 12 行:配置了"etrn-only"邮件投递服务,以禁用自动邮件投递。
- 第 13-16 行:客户的邮件被传递给"etrn-only"邮件投递服务。
- 第 16 行: "[mailhost.customer.tld]" 关闭 MX 记录查找;如果 Postfix 服务器是客户域的主要 MX 主机,必须指定此项。
测试 Postfix 快速 ETRN 服务
默认情况下,"fast ETRN" 服务对所有匹配 $relay_domains 的域启用。如果您首次运行 Postfix 并启用 "fast ETRN" 服务,需要先执行一次 "sendmail -q" 命令以填充每个站点的延迟邮件日志文件。如果省略此步骤,不会造成任何问题。日志文件最终会在 Postfix 定期尝试投递延迟邮件时自动填充,但此过程可能需要数小时。在 "sendmail -q" 命令完成所有投递尝试后(这可能需要一段时间),您即可测试 "fast ETRN" 服务。
要测试 "fast ETRN" 服务,请从允许执行 ETRN 命令的客户端(默认情况下为所有客户端)通过 Telnet 连接到 Postfix SMTP 服务器,并输入以下加粗命令:
220 my.server.tld ESMTP Postfix HELO my.client.tld 250 Ok ETRN some.customer.domain 250 Queuing started
其中"some.customer.domain"是某个域名的名称,该域名在 $queue_directory/flush 目录下有一个非空日志文件。
在 maillog 文件中,您应立即看到几个日志文件记录,作为队列管理器已打开队列文件的证据:
Oct 2 10:51:19 myhostname postfix/qmgr[51999]: 682E8440A4: from=, size=12345, nrcpt=1 (队列活动) Oct 2 10:51:19 myhostname postfix/qmgr[51999]: 02249440B7: from=<whatever>, size=4711, nrcpt=1 (队列活动)
接下来发生的事情取决于目标是否可达。如果不可达,邮件队列 ID 将被添加回 $queue_directory/flush 文件中的 some.customer.domain 日志文件。
对服务器愿意中继的其他目的地($relay_domains中列出的任何域)重复上述操作,但该目的地当前无邮件队列。粗体文本代表您需要输入的命令:
220 my.server.tld ESMTP Postfix HELO my.client.tld 250 Ok ETRN some.other.customer.domain 250 Queuing started
这次,"ETRN" 命令不应触发任何邮件投递。如果触发了所有邮件的投递,则您使用了错误的域名,或者"快速 ETRN"服务已关闭。
最后,使用您的邮件服务器不愿意中继的目的地重复此操作。即使服务器为该目的地排队了邮件,也不影响测试。
220 my.server.tld ESMTP Postfix HELO my.client.tld 250 Ok ETRN not.a.customer.domain 459 <not.a.customer.domain>: 服务不可用
在此情况下,Postfix 应如上所示拒绝请求。