SMTP 协议并非旨在提供一种检查邮箱可用性的方法。
发送电子邮件时,通常采取以下步骤:
检查邮件域的MX记录
一封邮件somebody@example.com
将检查是否有 MX 记录example.com
。如果有的话,将联系具有最高优先级的人接受邮件。如果它没有响应,将联系任何现有的具有较低优先级的 MX。
如果没有 MX 记录,将搜索“A”记录example.com
,并连接该 IP 以接受邮件。
连接到 MX 或 A 记录中提到的服务器
联系接收邮件服务器。如果存在,邮件可能会被递送。SMTP 协议要求发送邮件服务器发送接收邮件地址、发送邮件地址,然后是邮件本身。
接收邮件服务器尝试将邮件投递到用户邮箱
这可能由于几个原因而失败。重要的信息是,此步骤可能发生在发送邮件服务器收到邮件已收到的肯定回复并且连接终止之后。因此,发送邮件服务器可能不知道投递失败。
在这种情况下,接收邮件服务器将发送退回邮件。但是此退回邮件会发送到指定接收错误的邮件地址。这可能是原始邮件地址,但也可能是不同的。此外,负责接收退回邮件的邮件服务器不得是发送原始邮件的服务器。
在这一点上,应该很清楚电子邮件确实是一种异步信息交换媒介,几乎没有内置任何可靠性。
一些技术使得希望略有改进变得可行:通常发送退回消息不是最好的主意。配置良好的邮件服务器拒绝接收有任何问题的邮箱的邮件,例如它们不存在或已满。
另一方面,邮件的新大黑洞是垃圾邮件过滤器。通常这些是由用户配置的,邮件服务器会很高兴地接收现有邮箱的任何邮件,但随后垃圾邮件会被自动删除或移动到垃圾邮件文件夹并被忽略。
此外,还有一种像灰名单这样的技术,可以回答任何尝试以临时故障状态传递邮件的尝试。普通邮件服务器将在稍后尝试,最终灰名单计时器结束(在某些设置中可能超过一个小时),并进行真正的投递尝试,最终拒绝或接受。同时,邮件服务器希望它包含垃圾邮件过滤器来检测新一波的垃圾邮件,而灰名单实际上只需要一些时间。众所周知的邮件服务器的任何常规投递尝试都会立即成功,因为成功的非垃圾邮件投递会被列入白名单。
在对真实邮件如何工作的所有描述之后,我认为您可以看到确实没有办法“简单地”检测邮件地址是否真的存在。你唯一能做的就是尝试检测它是否存在,如果你确实被告知邮箱不存在,因为目标邮件服务器拒绝投递,你可以假设你可能不再尝试向该目标投递邮件.
任何其他结果都不会告诉您任何事情。您还会注意到,检测邮件地址是否存在需要您发送邮件 - catch-22 情况。
您确实应该实施适当的退回管理和传递失败检测,以删除明显失败的邮件地址。其他任何东西都无法检测。