电子邮件服务器设计:避免邮件循环

3
假设您正在设计一个带有规则支持(如条件转发等)的高级电子邮件服务器。古老的电子邮件循环问题摆在了您的面前:
1)假设您设置了一个规则,将所有邮件转发到另一个地址。如果该地址不存在,并且该域的管理员向您发送消息告诉您这一点。当然,您的规则不会区分这些消息并将它们转发,从而创建一个循环。
2)另一种情况是两个用户使用此客户端设置彼此的地址的转发规则。我们只需要一个启动器消息,它们就会进入循环。
3)或者,考虑一种自动回复情况,其中客户端转发到一个自动回复的地址,从而引发另一个循环。
我不是这方面的专家,但似乎检测循环不起作用。我们可以想出一些启发式方法,但似乎不存在通用算法。
我一直在考虑的一个解决方案根本不涉及检测。相反,我们只需观察高邮件发送活动(或由规则引起的高发送活动)的帐户,并暂时禁用这些帐户的电子邮件/规则,直到他们纠正问题。但是,此解决方案必须在引起循环的帐户和仅接收大量邮件并将其转发到其他位置的帐户之间保持平衡。
我们还可以对所有帐户应用节流,并确保如果循环开始,它们不会占用大量带宽。但这无法阻止循环运行,直到邮箱填满为止。
我是否遗漏了任何好的解决方案?
3个回答

7
首先,阅读RFC 3834,它能提供一些有关您所关心的内容的好见解。(虽然它只涵盖自动回复而非转发,但仍然有用。)
通常,在转发过程中,您需要向邮件添加一个X-header,以指示该邮件已经传递到用户的邮箱中。 (这是Sieve RFC在其redirect部分中提到的。) 如果某个消息发给了bob@example.com,并且有一个提及bob@example.com的X-header,则会形成一个循环。 因此,可以采用以下方式:
X-YourServer-Delivered: bob@example.com

您还需要避免转发消息传递通知,这些通知应该使用<>作为SMTP MAIL FROM。不要转发自动回复消息,这些消息应该具有一个Auto-Submitted头,其值不是“no”。

查看RFC 3834,获取更多关于不转发的内容的想法,但上述内容应该涵盖大部分情况。


如果你想给自定义的循环破解头部命名,Delivered-ToX-Loop 是比较流行的选项之一。 - undefined
这是一个不错的开始,但它仍然依赖其他系统也遵循RFC协议,大多数情况下可能是真的,但我们没有任何保证。听起来我们希望在任何情况下都有一种限制连接的方式作为备用方案。 - undefined

2

1) 假设您设置了一个规则,将所有邮件转发到另一个地址。如果该地址不存在,并且该域的邮局管理员向您发送消息告诉您这一点。当然,您的规则不会区分这些消息,并将它们转发,从而创建循环。

好吧,想想看,您会收到相同的“邮箱无法访问”消息一次、两次、三次。如果您只将其视为垃圾邮件,并在第3个相同副本后停止应用规则,那么就完成了!

对于您的第三个示例也是如此,自动回复将是相同的。在第3个相同消息之后停止运行规则。

第2个示例有点棘手,而且可能性很小。我不确定最佳解决方案是什么,但您可以检查差异,看看新消息是否只是在标题中添加了FW:或添加了引用。我不知道...


0
你可以在规则处理器中加入一段代码,用来检查自动生成的电子邮件的收件人。如果该收件人已经收到过完全相同的电子邮件(可能通过哈希值进行比较),那么就不再发送该邮件。

你需要对消息体进行哈希处理,因为每个跳点都会添加一个 Received 头部。从技术上讲,即使这样做也存在风险,因为许多RFC文档提到中间邮件传输代理可能会在行尾添加/删除空格。(虽然我怀疑在实际操作中这种情况很少见。) - undefined
好观点 - 你的答案绝对是最好的方法。=) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接