2011-01-19 99 views
2

可以说你正在设计一个有规则支持(如条件转发等)的华丽电子邮件服务器。电子邮件循环的古老问题盯着你:电子邮件服务器设计:避免环路

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

2)另一种情况是两个用户,使用这个客户端客户端,为彼此的地址设置转发规则。我们所需要的只是一条启动信息,而且他们将要分成一个循环。

3)或者,如果自动回复的情况下,客户端转发到自动回复地址,导致另一个循环。

我不是这方面的专家,但它看起来不像检测循环会起作用。我们当然可以想出一些启发式算法,但似乎并不存在一窍不通的算法。

我一直在想的一个解决方案根本不涉及检测。相反,我们只是注意帐户中的高邮件发送活动(或由规则导致的高发送活动),并暂时禁用这些帐户的电子邮件/规则,直到他们纠正问题。但是,这种解决方案必须在导致循环的账户之间行,以及只收到大量邮件并将其转发到其他地方的账户。

我们也可以将节流应用到所有帐户,并确保如果循环开始,它们不吸取大量的带宽。这不会停止运行循环,直到邮箱填满为止。

我错过了什么好的解决方案吗?

回答

5

首先,通过阅读RFC 3834开始。它对你关心的事情提供了一些很好的见解。 (它涵盖自动回复,不转发,但仍然有用。)

在一般情况下,你要转发以表示该消息已被传递到用户的邮箱,一旦期间的X头添加到邮件。 (This is what the Sieve RFC mentions in its redirect section.)如果有消息进来了[email protected]和有一个X-头提[email protected],你有一个循环。因此,像这样:

X-YourServer-Delivered: [email protected] 

您也想避免转发消息传递通知,里面应该有<>作为SMTP MAIL FROM。并且不要转发自动回复消息,该消息的Auto-Submitted标头的值不是“no”。

查看RFC 3834以了解更多关于不是转发的想法,但上面应该涵盖大多数情况。

0

您可以在规则处理器中包含一些位,检查自动生成的电子邮件的收件人,并且如果该确切的电子邮件(可能是通过散列)已经发送给该收件人,则它不会发送电子邮件。

+0

你不得不散列身体,每一跳增添了`Received`头。从技术上讲,甚至是有风险的,因为许多[RFC中引用的MTA中转添加来自线的端部/删除空白的可能性](http://tools.ietf.org/html/rfc2045#section-6.7)。 (虽然我怀疑现在的做法很常见。) – dkarp 2011-01-19 19:08:58

+0

好点 - 你的答案绝对是最好的方法。 =) – 2011-01-28 14:10:16

2

1)假设你设置了一个规则,将所有的邮件转发到另一个地址 。 如果该地址不存在, 和该域的邮局主管 会将邮件发回给您,并告诉您此地址为 。当然,您的规则不会 对这些消息 进行区分并转发它们,从而创建一个 循环。

考虑一下,你会回复一次,两次,三次相同的“邮箱无法访问”消息。如果您只是将其视为垃圾邮件,并在第三份相同的副本之后停止对其应用规则,那么您就已设置!

这同样适用于你的第三个例子,autoreply将是相同的。在第三条相同的消息后停止运行你的规则。

第二个有点棘手,而且不太可能。我不确定是否有最佳解决方案,但是您可以例如检查差异并查看所有新消息是否在标题中添加FW:或添加引用。我不知道。

相关问题