【问题标题】:How to improve email sending and delivery reliability?如何提高电子邮件发送和传递的可靠性?
【发布时间】:2010-01-25 10:46:19
【问题描述】:

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

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

【问题讨论】:

    标签: java email reliability


    【解决方案1】:

    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 不会加载远程内容(再次防止垃圾邮件)。这只留下了保留内容服务器端并发送指向原始内容的可点击链接的选项。但这又假设您的收件人总是想阅读您的邮件。

    C.

    【讨论】:

      【解决方案2】:

      为您的应用程序设置一个生产质量的邮件服务器,并让它处理可靠邮件发送的所有非常肮脏的细节。您可能遇到了一些限制,例如旨在阻止垃圾邮件机器人的灰名单。

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

      【讨论】:

        【解决方案3】:

        Thorbjørn 和 symcbean 都提供了很多有用的信息,但它的完整性可能会让人不知所措。我会尽量让它更平易近人:

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

        因此,您的应用只需将邮件发送至您自己的邮件服务器,该服务器有望位于同一台机器上的 25 端口。没有 SSL 编码,没有垃圾邮件过滤,没有一堆可能出错的东西。此外,如果您的邮件服务器与您的应用在同一台机器上,它们(通常)要么都关闭,要么都打开。

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

        这些“开箱即用”的邮件服务器中的任何一个都非常擅长将邮件发送出去。自动重复已内置,在(例如)1 小时、2 小时、4、12、24 和 48 小时后重试。您的邮件服务器将尽最大努力传递您的邮件,并且无需您付出额外的努力。失败的尝试将显示在邮件服务器的日志中,您可以对其进行分析并得出结论。如果在最后一次可能的尝试后失败,日志文件中也会注明,您可以断定接收方出现问题。所有这些功能都已内置,您甚至不应该考虑尝试将其构建到您自己的邮件客户端中。

        最后说明:传输有可能在物理上是成功的,即邮件已送达,但随后被收件人的邮件服务器或客户端视为垃圾邮件;或者(人类)收件人只是意外删除了它。没有软件能确定地解决这个问题。

        【讨论】:

          【解决方案4】:

          在我看来,运行自己的邮件服务器正在迅速成为过去。

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

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

          该领域中一些最知名的名字是sendgridmailjetpostmarkApp,但您可以找到一个有趣的比较here

          【讨论】:

          • 是的,我现在完全同意这一点。
          【解决方案5】:

          如果您只想每天向有限的一组接收者发送几封电子邮件,仅此而已,请尝试通过 gmail 帐户发送它们。

          【讨论】:

          • 让 Java 邮件通过 Google SMTP 服务器发送需要一些 Java 巫术和授权帐户。我自己没有这样做,但我很确定这个问题已经在 StackOverflow 上提出了
          猜你喜欢
          • 2018-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-14
          • 1970-01-01
          • 1970-01-01
          • 2014-12-01
          • 2011-07-13
          相关资源
          最近更新 更多