我碰到过此PHP代码,无需发送电子邮件即可使用SMTP检查电子邮件地址。
有没有人尝试过类似的方法或对您有用?您能告诉客户/用户输入的电子邮件是否正确并且存在吗?
我碰到过此PHP代码,无需发送电子邮件即可使用SMTP检查电子邮件地址。
有没有人尝试过类似的方法或对您有用?您能告诉客户/用户输入的电子邮件是否正确并且存在吗?
Answers:
有两种方法可以 有时使用来确定收件人是否确实存在:
您可以连接到服务器,然后发出VRFY
命令。很少有服务器支持此命令,但正是为此目的而设计的。如果服务器以2.0.0 DSN响应,则该用户存在。
VRFY user
您可以发出RCPT
,然后查看邮件是否被拒绝。
MAIL FROM:<>
RCPT TO:<user@domain>
如果该用户不存在,您将获得5.1.1 DSN。但是,仅因为未拒绝电子邮件并不意味着该用户存在。某些服务器会像这样静默丢弃请求,以防止枚举其用户。其他服务器无法验证用户,而必须接受消息。
还有一种称为灰名单的反垃圾邮件技术,它将使服务器最初拒绝该地址,并期望真正的SMTP服务器将在一段时间后尝试重新发送。这会弄乱验证地址的尝试。
老实说,如果您尝试验证地址,最好的方法是使用一个简单的正则表达式阻止明显无效的地址,然后将实际的电子邮件及其链接发送回系统,以验证是否已接收到该电子邮件。这还可以确保他们的用户输入了他们的实际电子邮件,而不是碰巧属于其他人的轻微错字。
这里的其他答案讨论了尝试执行此操作时遇到的各种问题。我想我会告诉您如何尝试这样做,以防您想自己学习。
您可以通过telnet连接到邮件服务器,询问是否存在电子邮件地址。这是一个测试电子邮件地址的示例stackoverflow.com
:
C:\> nslookup -q = mx stackoverflow.com 非权威答案: stackoverflow.com MX首选项= 40,邮件交换器= STACKOVERFLOW.COM.S9B2.PSMTP.com stackoverflow.com MX首选项= 10,邮件交换器= STACKOVERFLOW.COM.S9A1.PSMTP.com stackoverflow.com MX首选项= 20,邮件交换器= STACKOVERFLOW.COM.S9A2.PSMTP.com stackoverflow.com MX首选项= 30,邮件交换器= STACKOVERFLOW.COM.S9B1.PSMTP.com C:\> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25 220 Postini ESMTP 213 y6_35_0c4准备就绪。CA Business and Professions Code部分17538.45禁止将此系统用于未经请求的电子邮件广告。 嗨 250 Postini向您问好 邮件来自:<me@myhost.com> 250好 rcpt至:<fake@stackoverflow.com> 550-5.1.1您尝试访问的电子邮件帐户不存在。请尝试 550-5.1.1仔细检查收件人的电子邮件地址是否有错字或 550-5.1.1不必要的空格。了解更多 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");
并非完全如此.....某些服务器可能未选中“ rcpt to:”
http://www.freesoft.org/CIE/RFC/1123/92.htm
这样做存在安全风险。
如果服务器运行,您可以编写一个机器人来发现服务器上的每个地址...。
当目标邮件服务器使用灰名单时,这将失败(在其他情况下)。
灰名单:SMTP服务器在先前未知的客户端第一次连接时拒绝传送,允许下次传送;这样一来,您就可以避免垃圾邮件的出现,同时又可以合法使用- 可以预期,合法的邮件发件人将重试,这是普通邮件传输代理所要做的。
但是,如果您的代码只在服务器上检查一次,则具有灰名单的服务器将拒绝传送(因为您的客户端是第一次连接);除非您稍后再检查一次,否则可能是错误地拒绝了有效的电子邮件地址。
一些问题:
“您能告诉客户/用户输入的电子邮件是否正确并且存在吗?”
实际上,这是两件分开的事情。它可能存在,但可能不正确。
有时,您必须以面值接受用户输入。否则,有许多方法可以击败该系统。
您几乎可以做的就是搜索DNS,并确保电子邮件地址中的域具有MX记录,除此之外,没有可靠的处理方法。
在与SMTP服务器通信时,某些服务器可能会使用rcpt-to方法工作,但这完全取决于服务器的配置。另一个问题可能是过载的服务器可能返回550代码,表明用户未知,但这是一个暂时性错误,存在可以返回的永久性错误(我认为是451)。这完全取决于服务器的配置。
我个人将检查DNS MX记录,然后发送电子邮件验证(如果MX记录存在)。
function EmailValidation($email)
{
$email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
//checks to make sure the email address is in a valid format
$domain = explode( "@", $email ); //get the domain name
if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
//if the connection can be established, the email address is probably valid
echo "Domain Name is valid ";
return true;
} else {
echo "Con not a email domian";
return false; //if a connection cannot be established return false
}
return false; //if email address is an invalid format return false
}
}
我可以确认约瑟夫和德鲁的答案RCTP TO: <address_to_check>
。我想在这些答案的上方添加一些小附录。
某些邮件提供者实施了“包罗万象”策略,这意味着*@mydomain.com
该RCTP TO:
命令将返回肯定值。但这并不一定意味着邮箱“存在”,如“属于人类”。请注意,在这里您无能为力。
灰名单:来自未知IP的第一连接被阻止。解决方案:重试至少2次。
黑名单:如果您从同一IP发送太多请求,则该IP被阻止。解决方案:使用IP轮换;到达者使用Tor。
这是非常特定于提供程序的,但是您有时可以使用精心设计的HTTP请求,并解析这些请求的响应,以查看用户名是否已为此提供程序注册。
这是我编写的用于*@yahoo.com
使用HTTP请求检查地址的开源库中的相关功能:check-if-email-exists。我知道我的代码是Rust,并且该线程标记为PHP,但是同样的想法适用。
这可能是一种极端情况,但是当用户的收件箱已满时,RCTP TO:
将返回一条5.1.1 DSN
错误消息,指出已满。这意味着该帐户实际存在!
我运行实时电子邮件验证API Reacher。我的代码是用Rust编写的,并且是100%开源的。如果需要更强大的解决方案,请查看:
Github: https //github.com/amaurymartiny/check-if-email-exists
通过各种技术的组合,我设法验证了客户检查的大约80%的电子邮件。