使用 Java 邮件,我想发送一封电子邮件并检查状态。可能的状态包括:
- 硬退回:未找到邮件服务器
- Soft-bounce:找到邮件服务器,但找不到帐户
- 成功
是否有可能以我上面描述的方式发送电子邮件并获得有关交付尝试的一些反馈?
编辑:一位受访者建议寻找一个提供与ListNanny相同功能的 Java 库。我四处寻找,但没有找到任何东西。知道这样的图书馆是否存在吗?
使用 Java 邮件,我想发送一封电子邮件并检查状态。可能的状态包括:
是否有可能以我上面描述的方式发送电子邮件并获得有关交付尝试的一些反馈?
编辑:一位受访者建议寻找一个提供与ListNanny相同功能的 Java 库。我四处寻找,但没有找到任何东西。知道这样的图书馆是否存在吗?
您无法可靠或始终如一地做到这一点。如果您的本地邮件服务器将其传递到公司的外发邮件服务器,然后当该服务器尝试传递它时它会反弹,会发生什么情况?如果邮件服务器无法与其他邮件服务器通信,然后消息在 4 天后超时,会发生什么情况?
如果您要发送 HTML 电子邮件,您可能希望在电子邮件中嵌入一个 1 像素的透明图像。图像 URL 实际上会引用一个返回图像的 servlet。URL 也会有某种消息 id 作为参数。这背后的想法是,当用户阅读消息时,他/她会显示图像,这会触发您的 servlet,该 servlet 将消息已被读取的数据写入数据库。
您需要做的是将信封 SMTP 发件人设置为您监视 NDR 邮件的地址。您必须在收到电子邮件时对其进行解析并找出问题所在。这通常用于邮件列表,像ListNanny这样的产品用于处理消息(它是一个 .NET 产品,但我确信有一个 Java 等价物,或者您可以自己编写)。
信封“发件人”与邮件“发件人”地址不同。它是您的代码和 MTA 之间发生的 SMTP 对话的一部分。所有 NDR 都将发送到该地址。
You can use http://www.mailcounter.info free service to check whether your email has been read as well as how many times it has been read by t he user. Its a free service.
查找邮件服务器并连接:简单。检查帐户:可能。但这首先取决于您是否可以访问邮件服务器。它可能会拒绝您的连接尝试(例如,因为您的网络被列入黑名单)
最复杂的就是你所说的“成功”:
简短的回答:没有。
长答案:理论上这是可能的,但是您必须等待数小时甚至数天才能知道状态。使用灰名单、白名单、垃圾邮件阻止邮件服务器,许多邮件服务器只会在多次投递尝试后才接受电子邮件。只有当他们最终交付或放弃邮件时,您才会知道交付成功。并且根据邮件服务器的负载,电子邮件的发送可能会延迟任意时间。
我不熟悉 Javamail,但我想说:即使“成功”也可能不是成功。
您对硬故障和软故障的定义应该足够简单以便检查。如果您找不到服务器,这很难,如果您连接并且服务器说“找不到邮箱”,那就是“软”。但是,如果服务器接受了该消息,然后稍后将其退回怎么办?许多前端服务器通过设计或必要性接受未知消息(“真实”后端服务器的前端中继),如果后来发现该消息被发送到无效地址,则该消息将被退回给发件人。在这种情况下,当发送确实不成功时,您将报告发送“成功”。
如果没有嵌入在消息中的某种“单击此处”,确保交付几乎是不可能的。
不要依赖从服务器返回(如果返回)信息的内容。
由于存在安全漏洞,许多邮件服务器现在设置为不指示收件人是否存在。(例如,如果给定域报告(“是”/“否”)电子邮件地址的存在,黑客将简单地对服务器发动字典攻击以确定所有有效用户,因此他们会立即收到垃圾邮件列表。
您应该做的实际上是检查收件人电子邮件的 MX 记录(电子邮件地址的域部分的 DNS MX 查询)并通过已解析的 SMTP 服务器发送消息。
这样,如果没有找到 MX 记录,你会得到一个“Hard Bounce”,如果找到但 send 方法抛出异常,你会得到一个“Soft Bounce”,如果它通过 - 你会得到一个“Success” ”。
您可以使用 dnsjava 项目来解析 MX 记录。 http://www.dnsjava.org/