Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何提高电子邮件发送和传递的可靠性?_Java_Email_Reliability - Fatal编程技术网

Java 如何提高电子邮件发送和传递的可靠性?

Java 如何提高电子邮件发送和传递的可靠性?,java,email,reliability,Java,Email,Reliability,目前的应用程序每天发送几封电子邮件,但有些电子邮件从未发送到客户端 根据应用服务器日志,邮件服务器出现了几次超时,但这并不能解释所有丢失电子邮件的情况。添加重试功能将有助于解决超时问题,但一般来说,还有其他方法可以提高电子邮件的可靠性吗 如果你只想每天向有限的接收者发送几封电子邮件,那么就试着通过gmail帐户发送 设置一个可供您的应用程序使用的生产质量邮件服务器,并让它处理可靠邮件发送的所有肮脏细节。您可能遇到了一些限制,如用于防止垃圾邮件的灰色列表 一个相当简单的场景是Linux机器上的后缀

目前的应用程序每天发送几封电子邮件,但有些电子邮件从未发送到客户端


根据应用服务器日志,邮件服务器出现了几次超时,但这并不能解释所有丢失电子邮件的情况。添加重试功能将有助于解决超时问题,但一般来说,还有其他方法可以提高电子邮件的可靠性吗

如果你只想每天向有限的接收者发送几封电子邮件,那么就试着通过gmail帐户发送

设置一个可供您的应用程序使用的生产质量邮件服务器,并让它处理可靠邮件发送的所有肮脏细节。您可能遇到了一些限制,如用于防止垃圾邮件的灰色列表


一个相当简单的场景是Linux机器上的后缀。就我个人而言,我喜欢Ubuntu,SMTP的本质是它不实现事务完整性

大约6年前,我做了一个相当详细的分析,为什么我当时工作的公司的邮件失败了。我只能看到接收MTA的情况,但这表明MTA的类型与故障率之间存在非常强的相关性(当时,远程端的Novell Groupwise和Sendmail最可靠,MSExchange最少,qmail和其他处于中间位置)。请注意,这是高度经验性的,可能反映了产品选择与可用技能的对比,而不是特定MTA中的固有问题,而且现在已经过时了。而且,这不是你能有效控制的

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

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

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

为了提高可交付性,您可以做的最重要的事情是了解很多SMTP,维护您自己的MTA并相应地进行配置。现在的一个关键问题是,每个人都在努力阻止垃圾邮件——每个人都有自己的方法来阻止垃圾邮件。通常他们不会告诉你他们秘制酱汁的配方。事实上,使用贝叶斯过滤,他们甚至可能不知道

我想下一步(在你检查了你的SPF是限制性的并且发布了,并且你不是RBL'd之后)应该是看看你如何确定你的邮件是否被送达——正如我所说的,你不能依赖DSN。你不能依靠窃听你的电子邮件(例如,通过HTML发送它们),因为大多数MUA不会加载远程内容(同样是为了防止垃圾邮件)。只剩下保留content Server端并发送指向原始内容的可单击链接的选项。但这再次假设收件人总是想阅读您的邮件


Thorbjørn和symcbean都提供了大量有用的信息,但其完整性可能令人望而却步。我会尽量让它更平易近人:

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

因此,您的应用程序只需将邮件发送到您自己的邮件服务器即可,该服务器有望位于同一台机器的端口25上。没有SSL编码,没有垃圾邮件过滤,没有一大堆可能出错的事情。此外,如果你的邮件服务器与你的应用程序在同一台机器上,它们(通常)要么同时关闭,要么同时启动

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

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


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

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

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

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


该领域一些最知名的名字是,和,但你可以找到一个有趣的比较

让Java Mail通过Google SMTP服务器发送需要一点Java voodoo和一个帐户进行授权。我自己没有这样做过,但我很肯定这个问题已经在StackOverflow上被问过了是的,我现在完全同意这一点。