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