发送电子邮件并检查状态

Posted

技术标签:

【中文标题】发送电子邮件并检查状态【英文标题】:send e-mail and check status 【发布时间】:2010-09-14 02:12:21 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

不确定这是一个好主意,垃圾邮件发送者滥用这种技术来验证电子邮件,现在大多数邮件客户端都不会自动显示图像。【参考方案3】:

您需要做的是将信封 SMTP 发件人设置为您监控 NDR 邮件的地址。您必须在收到电子邮件时对其进行解析并找出问题所在。这通常用于邮件列表,像 ListNanny 这样的产品用于处理消息(它是一个 .NET 产品,但我确信有一个 Java 等价物,或者您可以自己编写)。

信封“发件人”地址与邮件“发件人”地址不同。它是您的代码和 MTA 之间发生的 SMTP 对话的一部分。所有 NDR 都将发送到该地址。

【讨论】:

ListNanny 听起来正是我所需要的。不过,我还没有找到等效的 Java 库。 自己动手并不难,至少在基本层面上是这样。如果您可以找到要查看的 NDR,您会发现一些易于解析的半标准数据块。通常只要知道您有 NDR 就足够了。 我快速浏览了一下,似乎 NDR 的具体格式不规范,或者如果是,则存在许多不合规的实现。【参考方案4】:

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

最复杂的就是你所谓的“成功”:

简短回答:不。

长答案:理论上这是可能的,但是您必须等待数小时甚至数天才能知道状态。使用灰名单、白名单、垃圾邮件拦截的邮件服务器,许多邮件服务器只会在多次投递尝试后才接受电子邮件。只有当他们最终交付或放弃邮件时,您才会知道交付成功。并且根据邮件服务器的负载,电子邮件的发送可能会延迟任意时间。

【讨论】:

【参考方案5】:

我并不特别熟悉 Javamail,但我想说:即使“成功”也不一定是成功。

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

如果没有嵌入在消息中的某种“点击此处”,确保交付几乎是不可能的。

【讨论】:

【参考方案6】:

不要依赖从服务器返回(如果返回)信息。

许多邮件服务器现在设置为指示收件人是否存在,因为它会造成安全漏洞。 (例如,如果给定域报告(“是”/“否”)电子邮件地址的存在,黑客会简单地对服务器发动字典攻击以确定所有有效用户,因此他们会立即收到垃圾邮件列表。

【讨论】:

【参考方案7】:

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

【讨论】:

您好,此服务链接已关闭:(【参考方案8】:

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

这样,如果没有找到 MX 记录,你会得到一个“Hard Bounce”,如果找到但 send 方法抛出异常,你会得到一个“Soft Bounce”,如果它通过 - 你得到一个“成功”。

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

【讨论】:

【参考方案9】:

这个link 可能会对您有所帮助。这在一个使用 RFC 3642 和 RFC 3464 的实验 jar 文件中。它有一些基本类,可让您获取邮件传递状态。你还需要Javamail jar 文件。

【讨论】:

以上是关于发送电子邮件并检查状态的主要内容,如果未能解决你的问题,请参考以下文章

sh Bash脚本,用于检查网站是启动还是关闭,并通过电子邮件发送通知

通过AWS lambda存储值

使用 Paypal REST api 发送发票时,客户收不到电子邮件

检查某些条件后使用python发送电子邮件[重复]

检查分区已使用空间占总空间的百分比并发送告警邮件

使用curl和grep检查物品是否有库存状态?