如何在不发送电子邮件的情况下检查电子邮件地址是否存在?

2022-08-30 06:58:37

我遇到了这个PHP代码,使用SMTP检查电子邮件地址而不发送电子邮件

有没有人尝试过类似的东西,或者它对你来说有用吗?您能判断客户/用户输入的电子邮件是否正确和存在吗?


答案 1

有时可以使用两种方法来确定收件人是否确实存在:

  1. 您可以连接到服务器,并发出命令。很少有服务器支持此命令,但它正是针对此命令的。如果服务器使用 2.0.0 DSN 进行响应,则用户存在。VRFY

    VRFY user
    
  2. 您可以发出 一个 ,然后查看邮件是否被拒绝。RCPT

    MAIL FROM:<>
    RCPT TO:<user@domain>
    

如果用户不存在,您将获得 5.1.1 DSN。但是,仅仅因为电子邮件未被拒绝,并不意味着用户存在。某些服务器会以静默方式丢弃此类请求,以防止枚举其用户。其他服务器无法验证用户,并且无论如何都必须接受该消息。

还有一种称为灰名单的反垃圾邮件技术,它将导致服务器最初拒绝该地址,并期望真正的SMTP服务器会在一段时间后尝试重新传递。这将搞砸验证地址的尝试。

老实说,如果您尝试验证地址,最好的方法是使用简单的正则表达式来阻止明显无效的地址,然后发送一封实际的电子邮件,其中包含返回系统的链接,该链接将验证是否已收到电子邮件。这也确保了他们的用户输入了他们的实际电子邮件,而不是碰巧属于其他人的轻微拼写错误。


答案 2

这里的其他答案讨论了尝试执行此操作的各种问题。我想我会展示你如何尝试这个,以防你想通过自己做来学习。

您可以通过 telnet 连接到邮件服务器,询问电子邮件地址是否存在。以下是测试电子邮件地址的示例:stackoverflow.com

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

C:\>telnet STACKOVERFLOW.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@stackoverflow.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

以数字代码为前缀的行是来自 SMTP 服务器的响应。我添加了一些空行以使其更具可读性。

许多邮件服务器不会返回此信息作为防止垃圾邮件发送者收集电子邮件地址的手段,因此您不能依赖此技术。但是,通过检测无效的邮件服务器或如上所述拒绝收件人地址,您可能会在清除一些明显错误的电子邮件地址方面取得一些成功。

还要注意,如果您向邮件服务器发出太多请求,它们可能会将您列入黑名单。


在 PHP 中,我相信您可以使用 ,并以编程方式执行上述步骤:fsockopenfwritefread

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");

推荐