如何验证电子邮件的存在?

How are emails verified for existance?

我正在构建一个 Web 服务,但无法验证电子邮件地址。除了典型的正则表达式验证之外,我还看到一些服务会验证电子邮件地址是否确实存在。

对我来说,域名解析很有意义,可以检查 DNS 记录中是否存在 MX 条目,但它们如何超越并检查实际收件人是否存在?

例如这样的服务:https://emailverification.whoisxmlapi.com/api

他们在技术上是如何做到这一点的?我有自己的网络服务器,它做对了。感谢您的帮助!

检查 MX 记录是第一步。之后,您可以使用这些记录给出的地址连接到 SMTP 服务器。那么:

  1. 你可以发送一个RCPT TO: <mail_to_check>命令,看看SMTP服务器有没有响应。

    • 如果用户存在,你会得到 250 2.1.5 Recipient OK.
    • 否则,您将得到 5.1.1 DSN
  2. 您可以发送VRFY <mail_to_check>命令,但是,根据我的经验,很少有服务器支持此命令。

注意事项

请注意,此方法在 100% 的情况下都行不通。以下是一些潜在问题:

  • 有些服务器只是简单地禁用此功能,以避免机器人通过其用户列出。
  • 灰名单:一些服务器阻止来自未知 IP 的第一个连接,并允许后续连接。
  • 注意接受*@mydomain.com但并不一定意味着收件箱实际上属于某人的接听电话提供商。
  • 如果您从同一 IP 向一台服务器发送过多请求,则该 IP 很可能会被列入黑名单。

示例演示

下面是从 another SO thread 中获取的此类流的输出。它找到 whosebug.com 的 MX 记录,并使用 telnet 连接到 SMTP 服务器和 send/parse SMTP 命令。

C:\>nslookup -q=mx whosebug.com
Non-authoritative answer:
whosebug.com       MX preference = 40, mail exchanger = whosebug.com.S9B2.PSMTP.com
whosebug.com       MX preference = 10, mail exchanger = whosebug.com.S9A1.PSMTP.com
whosebug.com       MX preference = 20, mail exchanger = whosebug.com.S9A2.PSMTP.com
whosebug.com       MX preference = 30, mail exchanger = whosebug.com.S9B1.PSMTP.com

C:\>telnet whosebug.com.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 ready.  CA Business and Professions Code Section 17538.45 forbids use of this system for unsolicited electronic mail advertisements.

helo hi
250 Postini says hello back

mail from: <me@myhost.com>
250 Ok

rcpt to: <fake@whosebug.com>
550-5.1.1 The email account that you tried to reach does not exist. Please try
550-5.1.1 double-checking the recipient's email address for typos or
550-5.1.1 unnecessary spaces. Learn more at
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

披露

我运行Reacher,实时邮箱验证API。我的代码是用 Rust 编写的,并且是 100% 开源的。如果您想要更强大的解决方案,请查看:

https://github.com/amaurymartiny/check-if-email-exists

为了克服上述警告,我克服了一些困难,我设法验证了大约 80% 的电子邮件 我的客户检查。