php*_*guy 114 php email smtp telnet email-validation
我发现这个PHP代码使用SMTP检查电子邮件地址而不发送电子邮件.
有没有人尝试过类似的东西或者它对你有用吗?您能否判断一位电子邮件客户/用户是否输入正确且存在?
Jos*_*ary 90
您有时可以使用两种方法来确定收件人是否确实存在:
您可以连接到服务器,并发出VRFY命令.很少有服务器支持此命令,但它仅用于此目的.如果服务器以2.0.0 DSN响应,则用户存在.
VRFY用户
您可以发出RCPT,并查看邮件是否被拒绝.
邮件来自:<>
RCPT TO:<user @ domain>
如果用户不存在,您将获得5.1.1 DSN.但是,仅仅因为电子邮件未被拒绝,并不意味着用户存在.某些服务器将默默地丢弃此类请求,以防止枚举其用户.其他服务器无法验证用户,并且必须接受该消息.
还有一种称为灰名单的反垃圾邮件技术,它会导致服务器最初拒绝该地址,期望真正的SMTP服务器稍后会尝试重新传递.这将破坏验证地址的尝试.
老实说,如果您尝试验证地址,最好的方法是使用简单的正则表达式来阻止显然无效的地址,然后发送一个带有链接的实际电子邮件回到您的系统,该链接将验证收到的电子邮件.这也确保了用户输入了他们的实际电子邮件,而不是恰好属于其他人的轻微拼写错误.
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
,fwrite
并fread
以编程方式执行上述步骤:
$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)
一般的答案是,如果您向其发送电子邮件,则无法检查电子邮件地址是否存在事件:它可能只是陷入黑洞.
可以说,那里描述的方法非常有效.它在ZoneCheck的生产代码中使用,除了它使用RSET而不是QUIT.
凡与他的邮箱用户交互不是overcostly许多网站实际测试,该邮件(无论是去一个秘密的网址或通过电子邮件发回这个秘密的数目)到达某处通过发送必须发回发射器的秘密号码.大多数邮件列表都是这样的.
我可以确认约瑟夫和德鲁的答案以使用RCPT TO: <address_to_check>
。我想在这些答案的基础上添加一些小附录。
一些邮件提供商实施包罗万象的政策,这意味着*@mydomain.com
命令将返回正数RCPT TO:
。但这并不一定意味着邮箱“存在”,如“属于人类”。这里无能为力,只是要注意。
灰名单:来自未知 IP 的第一个连接被阻止。解决办法:至少重试2次。
黑名单:如果您从同一IP发送太多请求,则该IP将被阻止。解决方案:使用IP轮换。
这是特定于提供商的,但有时您可以使用精心设计的 HTTP 请求,并解析这些请求的响应以查看用户名是否已向该提供商注册。密码恢复页面上的无头浏览器自动化也可能起到作用。
这可能是一种边缘情况,但当用户的收件箱已满时,RCTP TO:
将返回一条5.1.1 DSN
错误消息,指出收件箱已满。这意味着该帐户确实存在!
不是真的.....某些服务器可能无法检查"rcpt to:"
http://www.freesoft.org/CIE/RFC/1123/92.htm
这样做是安全风险.....
如果服务器这样做,你可以编写一个bot来发现服务器上的每个地址....
一些问题:
当目标邮件服务器使用灰名单时,这将失败(在其他情况下).
灰名单:SMTP服务器在以前未知的客户端第一次连接时拒绝传递,允许下次(s); 这保留了一定比例的垃圾邮件,同时允许合法使用 - 因为预计合法邮件发件人将重试,这是普通邮件传输代理将执行的操作.
但是,如果您的代码仅检查服务器一次,则具有灰名单的服务器将拒绝传递(因为您的客户端是第一次连接); 除非您稍后再次检查,否则您可能会错误地拒绝有效的电子邮件地址.