从Java代码发送邮件-可靠的方法

3
发送邮件是应用程序中常见的需求,但大多数情况下都很麻烦。因此,我使用基于“官方”java邮件API的Apache Commons Email,并以最简单的方式发送邮件,即不需要对SMTP服务器进行身份验证。我只需要对目标主机名进行简单的MX查找,获取MX服务器并尝试在第一个服务器上传递我的消息(无论邮件是否被拒绝都是完全不同的问题,我可能很快就会问有关return-path: vs. from: vs. reply-to:以及这些头部在Java中如何处理的混乱问题的更多问题)。回到正题...所以我刚刚尝试将我的消息放在具有最低优先级得分的邮件服务器上。
以下是示例:我想写给recipient@domain.com。 MX查找告诉我,domain.com知道两个MX服务器,它们是例如具有10优先级得分的mail1.domain.com和具有20优先级得分的mail2.domain.com。按照rfc的方式做事情是去访问优先级最低的服务器并在那里发送邮件。所以这就是我所做的。
最后,我的问题是:如果该服务器以某种方式不可用怎么办?很简单——我去另一个服务器,但Apache Commons(我怀疑Java邮件API也是如此)不允许我这样做。 mail.smtp.host变量位于消息中的会话道具内部,并且我无法获取它。
那么,处理这个问题的最佳方法是什么?我应该从头开始构建我的电子邮件并使用新主机名(mail2),还是有一些聪明的方法可以在Java中轻松解决这个问题?
1个回答

1

看起来你正在尝试实现一个部分邮件服务器,而不仅仅是发送电子邮件。路由、中继、缓存和投递重试是所有邮件服务器实现和提供的操作,通常不由邮件客户端完成。

你应该做的是使用一个(一个!)已存在的邮件服务器,该服务器已为你配置允许中继出站邮件,或者如果你没有访问这样的服务器(我怀疑),则设置和运行自己的服务器。然后在mail.smtp.host中配置服务器,忘记你所学习的关于DNS查找、服务器优先级以及如果没有MX服务器可达时该怎么办的担忧。


是的,我考虑过使用 aspirin 或者甚至 james,或者一个完全功能的“外部”SMTP服务器(但在后一种情况下,每个客户端都必须设置自己的SMTP服务器,这对于现在的客户来说确实太过分了:)],但似乎这样做对于解决如此简单的问题来说有些过度杀伤力。或者只是我的“简单”和“过度杀伤力”的概念有些偏颇 :) - ingenious
我不知道你的软件应该在哪里运行或者你所说的客户端是哪种类型,但是如果你的软件需要发送外部邮件,那么提供一个正在运行的SMTP服务器并不过分。公司通常都会运行SMTP服务器,而家庭用户也可以从他们的互联网服务提供商或像GMail或Hotmail这样的“纯”邮件提供商那里获得SMTP服务器的访问权限。 - jarnbjo
我同意,使用现有的电子邮件服务器。如果您仍然想自己完成此操作,您可能需要直接使用JavaMail API,以便可以使用Transport.connect方法直接连接到任何您想要的服务器。 - Bill Shannon
我完全同意你们的观点。但是我有自己的需求,不能走那条路(相信我,我已经试过争论应该使用现有的SMTP服务器)。尽管如此,我仍然想以正确的方式处理事情。@BillShannon Apache Commons Mail可以很好地处理com.sun.mail.smtp.SMTPTransportjavax.mail.Transport。请注意,我想做的事情并不是不可能实现,只是对我来说似乎有点丑陋(等待异常,如果捕获到异常则创建一个新消息并尝试在下一个MX主机上删除它,等等)。 - ingenious
我不确定是否还有其他方法。你实际上在你的应用程序中实现了SMTP服务器的发送部分。 - Bill Shannon

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