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

php*_*guy 114 php email smtp telnet email-validation

我发现这个PHP代码使用SMTP检查电子邮件地址而不发送电子邮件.

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

Jos*_*ary 90

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

  1. 您可以连接到服务器,并发出VRFY命令.很少有服务器支持此命令,但它仅用于此目的.如果服务器以2.0.0 DSN响应,则用户存在.

    VRFY用户

  2. 您可以发出RCPT,并查看邮件是否被拒绝.

    邮件来自:<>

    RCPT TO:<user @ domain>

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

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

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

  • 有些服务器甚至会接受该消息,但稍后会将错误消息发送回信封发件人,特别是如果它是一个拥有许多内部部门并拥有自己的邮件服务器的大型组织.边境服务器甚至可能不知道其中的所有帐户. (9认同)
  • @Shehi:实际上垃圾邮件发送者*可能会*使用这种方法,这很难说.但是,由于垃圾邮件发送者*可能*使用它,几乎所有邮件服务器都禁用VRFY,因此在实践中VRFY可能是无用的. (6认同)
  • 对于VRFY,gmail回复"发送一些邮件,我会尽我所能";-) (3认同)
  • 那么为什么垃圾邮件发送者不会使用这种方法来验证电子邮件地址?我的意思是,这些方法只有很少的服务器支持.或者他们呢? (2认同)
  • 您能举例说明如何使用RCPT TO:<user @ domain>?谢谢 (2认同)

Dre*_*kes 45

这里的其他答案讨论了尝试这样做的各种问题.我想我会告诉你如何尝试这个,以防你想通过自己学习来学习.

您可以通过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中,我相信您可以使用fsockopen,fwritefread以编程方式执行上述步骤:

$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");
Run Code Online (Sandbox Code Playgroud)


kmk*_*lan 8

一般的答案是,如果您向其发送电子邮件,则无法检查电子邮件地址是否存在事件:它可能只是陷入黑洞.

可以说,那里描述的方法非常有效.它在ZoneCheck的生产代码中使用,除了它使用RSET而不是QUIT.

凡与他的邮箱用户交互不是overcostly许多网站实际测试,该邮件(无论是去一个秘密的网址或通过电子邮件发回这个秘密的数目)到达某处通过发送必须发回发射器的秘密号码.大多数邮件列表都是这样的.


ama*_*iny 7

我可以确认约瑟夫和德鲁的答案以使用RCPT TO: <address_to_check>。我想在这些答案的基础上添加一些小附录。

包罗万象的供应商

一些邮件提供商实施包罗万象的政策,这意味着*@mydomain.com命令将返回正数RCPT TO:。但这并不一定意味着邮箱“存在”,如“属于人类”。这里无能为力,只是要注意。

IP灰名单/黑名单

灰名单:来自未知 IP 的第一个连接被阻止。解决办法:至少​​重试2次。

黑名单:如果您从同一IP发送太多请求,则该IP将被阻止。解决方案:使用IP轮换。

注册表单上的 HTTP 请求

这是特定于提供商的,但有时您可以使用精心设计的 HTTP 请求,并解析这些请求的响应以查看用户名是否已向该提供商注册。密码恢复页面上的无头浏览器自动化也可能起到作用。

完整收件箱

这可能是一种边缘情况,但当用户的收件箱已满时,RCTP TO:将返回一条5.1.1 DSN错误消息,指出收件箱已满。这意味着该帐户确实存在!


l_3*_*7_l 6

不是真的.....某些服务器可能无法检查"rcpt to:"

http://www.freesoft.org/CIE/RFC/1123/92.htm

这样做是安全风险.....

如果服务器这样做,你可以编写一个bot来发现服务器上的每个地址....


Gra*_*row 6

一些问题:

  1. 我确信,如果您提供的地址不存在,某些 SMTP 服务器会立即通知您,但有些服务器出于隐私措施不会这样做。他们只会接受您提供给他们的任何地址,并默默地忽略不存在的地址。
  2. 正如文章所述,如果您对某些服务器过于频繁地执行此操作,它们会将您列入黑名单。
  3. 对于某些 SMTP 服务器(例如 gmail),您需要使用 SSL 才能执行任何操作。 仅当使用 gmail 的 SMTP 服务器发送电子邮件时才会出现这种情况。


Pis*_*3.0 6

当目标邮件服务器使用灰名单时,这将失败(在其他情况下).

灰名单:SMTP服务器在以前未知的客户端第一次连接时拒绝传递,允许下次(s); 这保留了一定比例的垃圾邮件,同时允许合法使用 - 因为预计合法邮件发件人将重试,这是普通邮件传输代理将执行的操作.

但是,如果您的代码仅检查服务器一次,则具有灰名单的服务器将拒绝传递(因为您的客户端是第一次连接); 除非您稍后再次检查,否则您可能会错误地拒绝有效的电子邮件地址.