发送电子邮件并检查状态

使用Java邮件,我想发送电子邮件并检查状态。 可能的状态包括:

  • 硬弹跳:未找到邮件服务器
  • 软退回:找到邮件服务器,但找不到帐户
  • 成功

是否有可能以我上面描述的方式发送电子邮件并获得有关交付尝试的一些反馈?

编辑:一位受访者建议寻找一个提供与ListNanny相同function的Java库。 我四处搜寻,但没找到任何东西。 知道这样的图书馆是否存在?

干杯,唐

你不能可靠或一致地做到这一点。 如果您的本地邮件服务器将其传递到公司外出邮件服务器,然后当该服务器尝试传递它时它会弹回,会发生什么? 如果邮件服务器无法与其他邮件服务器通信,然后4天后邮件超时,会发生什么情况?

如果您要发送HTML电子邮件,则可能需要在电子邮件中嵌入1像素透明图像。 图像URL实际上将引用返回图像的servlet。 URL也会有某种消息ID作为参数。 这背后的想法是,当用户阅读消息时,他/她会显示图像,该图像会触发您的servlet,该图像会向数据库写入已读取消息的消息。

您要做的是将信封SMTP发件人设置为您监视NDR邮件的地址。 你必须在他们进来时解析电子邮件并弄清楚出了什么问题。 这通常用于邮件列表,而像ListNanny这样的产品用于处理消息(它是一个.NET产品,但我确定有一个Java等价物,或者你可以自己编写)。

信封“from”与消息“from”地址不同。 它是您的代码和MTA之间发生的SMTP会话的一部分。 所有NDR都将被发送到该地址。

找到邮件服务器并连接:简单。 检查帐户:可能。 但这取决于您是否首先访问邮件服务器。 它可能会拒绝您的连接尝试(例如,因为您的网络被列入黑名单)

最复杂的是你称之为“成功”的东西:

简答:没有。

答案很长:从理论上讲,它是可能的,但如果不是几天就必须等待数小时才知道状态。 使用灰名单,白名单,阻止垃圾邮件的邮件服务器,许多人只会在多次传递尝试后接受电子邮件。 只有当他们最终交付或放弃邮件时,您才会知道交付成功。 并且根据邮件服务器负载,发送电子邮件可能会被推迟一段任意时间。

我并不特别熟悉Javamail,但我会这样说:即使“成功”也许并不成功。

您对硬性和软性故障的定义应该足够简单,以便检查。 如果你找不到服务器很难,如果你连接并且服务器说“找不到邮箱”它就是“软”。 但是,如果服务器接受该消息然后稍后将其退回,该怎么办? 许多前端服务器接受未知消息,无论是设计还是必要(“实际”后端服务器的前端中继),如果稍后发现消息被发送到无效地址,则消息将被退回给发送方。 在这种情况下,如果真的没有成功,你会在发送时报告“成功”。

确保交付几乎不可能在消息中嵌入某种“点击此处”。

不要依赖从服务器获得的信息(如果你回来)。

现在,许多邮件服务器都设置为显示收件人是否存在,因为它创建了安全漏洞。 (例如,如果某个域报告(“是”/“否”)存在电子邮件地址,黑客就会在服务器上释放字典攻击以确定所有有效用户,从而获得即时垃圾邮件名单。

您可以使用http://www.mailcounter.info免费服务来检查您的电子邮件是否已被阅读以及用户已阅读的次数。 它是一项免费服务。

您应该做的是实际检查收件人电子邮件的MX记录(电子邮件地址的域部分的DNS MX查询),并通过已解决的SMTP服务器发送邮件。

这样,如果找不到MX记录,你会得到一个“硬弹跳”,如果找到它但是send方法抛出一个exception,你得到一个“软弹跳”,如果它通过 – 你得到一个“成功”。

您可以使用dnsjava项目来解析MX记录。 http://www.dnsjava.org/

此链接可能对您有所帮助。 这是一个使用RFC 3642和RFC 3464的实验性jar文件。它有一些基本类,允许您获取邮件传递状态。 而且你还需要Javamail jar文件。