当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在不发送电子邮件的情况下检查电子邮件地址是否存在》经验,为你挑选了5个好方法。

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

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



1> Joseph Tary..:

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

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

    VRFY用户

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

    邮件来自:<>

    RCPT TO:

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

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

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


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

2> Drew Noakes..:

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

您可以通过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: 
250 Ok

rcpt to: 
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: \r\n");
fwrite($smtp_server, "rcpt to: \r\n");



3> kmkaplan..:

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

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

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



4> l_39217_l..:

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

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

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

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



5> Piskvor cc-b..:

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

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

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

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有