我们有一个 Postfix SMTP 服务器,用于为客户 Web 脚本中继邮件。Postfix 正在使用收件人地址验证在reject_unverified_recipient
范围内smtpd_recipient_restrictions
(这是必须的,否则会产生大量不必要的退回邮件):
smtpd_recipient_restrictions =
reject_unknown_recipient_domain
reject_unverified_recipient
permit_mynetworks
reject_unauth_destination
check_recipient_access hash:/etc/postfix/validrcptto
问题是第一次使用某个电子邮件地址时,会导致暂时错误,客户端应该稍后重试(如第节所定义450 4.1.1 <[email protected]>: Recipient address rejected: unverified address: Address verification in progress
4.5.4.1的RFC 5321)
虽然4xx
错误在几秒钟内消失(绝大多数情况下,或被5xx
永久性错误取代),但客户的网络脚本(当然)只尝试一次。
虽然在 Web 脚本中实现(SEND_MAIL
用while (count++ < 10) { SEND_MAIL; sleep(3) }
伪代码替换)相对简单,但不同客户的数量、第三方代码库及其自动升级等只是一遍又一遍地解释这个问题就会耗费大量的资源……
我想要的是类似这样的功能reject_unverified_recipient_after_autoretry=30s
,它不会立即回复RCPT TO
,450 Address verification in progress
而是会阻止,等待几秒钟,希望验证(8)将完成,并重试,并且只有450
当(比如说) 30 秒后代码仍然存在时才返回450
。
注意:接受来自网络脚本的所有邮件是不可接受的(即使发件人设置为<>
或某些无人值守/黑洞邮箱) - 我们确实需要地址验证,并且5xx
如果我们知道邮件无法到达收件人,我们希望网络应用程序收到错误。
答案1
最终找到了,所需的选项(verify(8)
手册页中未提及)是:
address_verify_poll_count = ${stress?1}${stress:6}
address_verify_poll_delay = 5s
这将RCPT TO
等待地址验证完成 6 次 5 秒的迭代(最多 30 秒)后返回错误(高负载下它只会尝试一次)。当然,如果地址验证更快完成,它会更快返回。450 4.1.1 <[email protected]>: Recipient address rejected: unverified address: Address verification in progress
这正是我需要的!
Postfix 2.1 及更高版本中提供这些选项