如何提高电子邮件发送和交付可靠性?

时间:2010-01-25 10:46:19

标签: java email reliability

当前的应用程序使用Simple Java Mail每天发送几封电子邮件,但有些电子邮件从未发送给客户端。

根据应用程序服务器日志,有几个邮件服务器超时,但这并不能解释所有丢失电子邮件的情况。添加重试功能有助于解决超时问题,但是有没有其他方法可以提高电子邮件的可靠性?

5 个答案:

答案 0 :(得分:3)

SMTP的本质是它没有实现事务完整性。

大约6年前,我对我当时工作的公司邮件失败的原因进行了详细的分析。我只能看到接收MTA,但这显示了MTA类型与失败率之间的非常强的相关性(当时,Novell Groupwise和远程端的Sendmail是最可靠的,MSExchange最少, qmail和中间的其他人)。请注意,这是高度经验性的,可能反映了产品选择与可用技能的比较,而不是特定MTA中的固有问题 - 现在它已经过时了。此外,它不是你可以有效控制的东西。

尽管如此,由于您有机会在MTA之上开发和实现自己的逻辑,因此无法保证:

1)如果在离开您的MTA后邮件失败,您将收到任何退回通知

2)如果您发送带有DSN请求的消息(请参阅RFC 1891),远程系统将实际发送回DSN

为提高可传递性,您可以做的最重要的事情是了解很多关于SMTP,维护自己的MTA并相应地进行配置。这些天的关键问题之一是每个人都试图阻止垃圾邮件 - 每个人都有自己的方法来做到这一点。而且通常他们不会告诉你秘方酱的配方。实际上,对于贝叶斯过滤,他们甚至可能都不知道!

我想下一个停靠港(在您检查了您的SPF之后是限制性的并且已经发布,并且您没有RBL)将会看看如何确定您的邮件是否已经发送 - 就像我说,你不能依靠DSN。您不能依赖窃听电子邮件(例如,通过将其作为HTML发送出去,例如),因为大多数MUA不会加载远程内容(再次防止垃圾邮件)。这样就可以保留内容服务器端并发送一个可点击链接到原始内容。但这再次假设您的收件人总是想要阅读您的信息。

下进行。

答案 1 :(得分:2)

设置适用于您的应用程序的生产质量邮件服务器,并让它处理可靠邮件发送的所有非常脏的细节。您可能会遇到一些限制,例如设计用于保持垃圾邮件的灰名单。

一个相当简单的场景是Linux机器上的Postfix。我个人喜欢Ubuntu

答案 2 :(得分:2)

Thorbjørn和symcbean都提供了大量有用的信息,但它的完整性可能会令人难以招架。我会尝试让它更平易近人:

关于您可以做的最糟糕的事情是在您的应用程序中构建一个SMTP客户端,并依靠它将邮件发送到世界上的某个地方。一个更好的解决方案是在本地或最差的情况下在您自己的网络中运行“标准”MTA和/或SMTP服务器。

因此,您的应用程序只需要将邮件发送到您自己的邮件服务器,这有望在同一台计算机上的端口25上。没有SSL编码,没有垃圾邮件过滤,也没有一堆可能出错的东西。此外,如果您的邮件服务器与您的应用程序在同一台计算机上,它们(通常)将同时关闭或同时关闭。

一旦您的应用将其邮件推送到您的本地邮件服务器(这是快速且几乎万无一失),将服务器发送到最终目的地是服务器的问题。在Linux服务器上,您将安装Sendmail,qmail,exim或postfix;在Windows上,我不知道。

任何一个“开箱即用”的邮件服务器都非常有能力收发邮件。已经内置了自动重复,在(例如)1小时,2小时,4小时,12小时,24小时和48小时之后重试。您的邮件服务器将尝试最好地发送您的邮件,并且您将不需要额外的努力就可以完成。失败的尝试将显示在邮件服务器的日志中,您可以分析并得出结论。如果在最后一次可能的尝试后失败,那么也会在日志文件中记录,并且您可以得出结论:接收方出现了问题。所有这些功能都已内置,您甚至不应该考虑将其构建到自己的邮件客户端中。

最后注意事项:转移可能在物理上成功,即邮件已发送,但接收方的邮件服务器或客户端将其视为垃圾邮件;或者(人类)接收者只是偶然删除它。没有任何软件可以肯定地解决这个问题。

答案 3 :(得分:2)

在我看来,运行自己的邮件服务器很快就会成为过去。

如果我的应用会发送多封电子邮件,我通常会设置一个电子邮件即服务提供商并忘记它。其中大多数都允许您在应用程序中使用SMTP。

作为奖励,他们中的大多数都会向您显示有关谁通过您的电子邮件做什么的统计数据。

该空间中的一些最知名的名称是sendgridmailjetpostmarkApp,但您可以找到有趣的比较here

答案 4 :(得分:1)

如果您只想每天向有限的接收器发送几封电子邮件,那就试试通过Gmail帐户发送它们。