我正在使用 exim 传递由 Web 应用生成的邮件。gmx.net、gmx.de 和 web.de 域要求我限制发送的邮件数量,但我在 exim 中配置该功能时遇到了麻烦。
场景如下:
- 我的网络应用生成电子邮件
- 它们通过 phpmailer 提交到在本地主机上运行的 exim
- exim 立即将它们放入队列中(我已经
queue_smtp_domains = web.de : gmx.de : gmx.net
在配置中了) - 每次队列运行(每小时)时,它都会尝试投递邮件
- 成功交付几次后,这两个域名都会返回 421 错误代码(1.1.1.1 是我在原始日志条目中的 IP 地址,我在这里将其替换)。Exim 声称错误在连接到服务器后立即发生:
2019-09-12 14:50:41.157 [19619] 1i8OYb-00056H-01 H=mx01.emig.gmx.net [212.227.17.5]:25: SMTP error from remote mail server after initial connection: 421-gmx.net (mxgmx115) Nemesis ESMTP Service not available\n421-Service unavailable\n421-Reject due to policy restrictions.\n421 For explanation visit http://postmaster.gmx.com/en/error-messages?ip=1.1.1.1&c=irlims
链接他们建议降低发送率。这就是我正在尝试做的。
每隔三个小时,接收邮件服务器会接受固定数量的邮件,然后再次出现相同的错误消息。
我发现一个问题但看起来 acls 会在步骤 2 进行速率限制,而我不想这样做。我想在第 4 点进行速率限制。并且只针对所涉及的两个域。
我还发现了特殊重试规则的文档在 exim 中。但是我只想在域和错误代码匹配时应用特殊规则,而在我看来,我无法匹配连接上的错误 421(只有作为 MAIL 或 DATA 或 RCPT 命令的回复我才能匹配它)。
我怎样才能在 Exim 中配置这种限制,或者怎样才能以更快的速度接受这些邮件?
答案1
我已经发现此主题在 exim 邮件列表上。
他们讨论了不同的节流方法和解决方法,包括
- 编写一个 shell 脚本来手动休眠并传递消息(使用
exim -M
) - postfix 作为“智能主机”,显然可以做我们想做的事情
- 配置一个路由器,让它休眠几秒钟,然后将消息传递给下一个路由器
答案2
一个相当粗糙的解决方案:
iptables -A OUTPUT -d 212.227.0.0/19 -m state --state NEW -m limit --limit 10/min -j ACCEPT
iptables -A OUTPUT -d 212.227.0.0/19 -m state --state NEW -j DROP
(如果这也会导致发送到其他邮件服务器的限制,请替换DROP
为)REJECT
此示例针对 gmx+web.de(联合互联网) - 他们不仅使用 421,而且从本月开始使用 554 代码,这会导致邮件丢失。此外,他们似乎确实从本月开始重置了我们的 IP 例外。这次支持也完全没有沟通。我们开始警告用户不要使用 gmx/web.de。这发生在一个拥有 5000 多名成员的教育领域的非营利慈善机构。
主机上的邮件服务器将重试投递约一周。