Php 如何在不发送电子邮件的情况下检查电子邮件地址是否存在?
我遇到过这个问题Php 如何在不发送电子邮件的情况下检查电子邮件地址是否存在?,php,email,smtp,telnet,email-validation,Php,Email,Smtp,Telnet,Email Validation,我遇到过这个问题 有没有人尝试过类似的方法,或者对你有效?您能告诉客户/用户输入的电子邮件是否正确和存在吗?不太正确…..某些服务器可能不会检查“rcpt to:” 这样做会带来安全风险 如果服务器这样做,您可以编写一个bot来发现服务器上的每个地址。…一般的答案是,如果您向其发送电子邮件,您无法检查电子邮件地址是否存在:它可能会进入黑洞 尽管如此,这里描述的方法还是相当有效的。除了使用RSET而不是QUIT之外,它在中的生产代码中使用 在用户与邮箱的交互不太频繁的情况下,许多站点实际上通过发
有没有人尝试过类似的方法,或者对你有效?您能告诉客户/用户输入的电子邮件是否正确和存在吗?不太正确…..某些服务器可能不会检查“rcpt to:” 这样做会带来安全风险
如果服务器这样做,您可以编写一个bot来发现服务器上的每个地址。…一般的答案是,如果您向其发送电子邮件,您无法检查电子邮件地址是否存在:它可能会进入黑洞 尽管如此,这里描述的方法还是相当有效的。除了使用RSET而不是QUIT之外,它在中的生产代码中使用 在用户与邮箱的交互不太频繁的情况下,许多站点实际上通过发送一个必须发送回发送者的秘密号码(通过转到一个秘密URL或通过电子邮件发送回该秘密号码)来测试邮件是否到达某个地方。大多数邮件列表都是这样工作的。有些问题:
有时,您必须按面值接受用户输入。否则,有许多方法可以破坏系统。假设是用户的地址,某些邮件服务器确实允许SMTP VRFY命令根据其邮箱实际验证电子邮件地址。大多数主要网站不会给你太多的信息;gmail的回复是“如果你想发邮件,我们会发邮件”或类似的聪明话。我想你不能,有很多情况下,即使发送电子邮件也可能失败。例如,用户端的邮件服务器暂时关闭,邮箱存在但已满,因此无法传递邮件,等等
这可能就是为什么这么多网站在用户确认收到确认电子邮件后验证注册。您所能做的就是搜索DNS并确保电子邮件地址中的域具有MX记录,除了没有可靠的处理方法之外 某些服务器可能使用rcpt to方法与SMTP服务器进行通信,但这完全取决于服务器的配置。另一个问题可能是过载的服务器可能返回550代码,表示用户未知,但这是一个临时错误,可以返回一个永久性错误(我想是451?)。这完全取决于服务器的配置
我个人会检查DNS MX记录,然后发送电子邮件验证MX记录是否存在。有时可以使用两种方法来确定收件人是否确实存在:
VRFY
命令。很少有服务器支持此命令,但它正是用于此目的的。如果服务器以2.0.0 DSN响应,则用户存在
VRFY user
RCPT
,查看邮件是否被拒绝
MAIL FROM:<>
RCPT TO:<user@domain>
邮件来源:
RCPT至:
老实说,如果您试图验证一个地址,最好的方法是使用一个简单的正则表达式来阻止明显无效的地址,然后发送一封带有链接的实际电子邮件回您的系统,以验证收到的电子邮件。这也确保了他们的用户输入了他们的实际电子邮件,而不是碰巧属于其他人的轻微打字错误。这里的其他答案讨论了尝试这样做的各种问题。我想我应该向你展示一下,如果你想通过自己动手来学习的话,你可以如何尝试 您可以通过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
当目标邮件服务器使用greylisting时,这将失败(除其他情况外)
Greylisting:SMTP服务器在以前未知的客户端第一次连接时拒绝传递,允许下次发送;这样可以在允许合法使用的同时阻止一定比例的垃圾邮件,因为合法邮件发送者会重试,这是正常邮件传输代理所做的
但是,如果您的代码只在服务器上检查一次,则具有greylisting的服务器将拒绝传递(因为您的客户端是第一次连接);除非稍后再次检查,否则您可能会错误地拒绝有效的电子邮件地址。
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
}
}
虽然这个问题有点老了,但此服务提示可能会帮助用户搜索类似的解决方案,在发送之前检查语法验证之外的电子邮件地址
我一直在使用它对一些项目的电子邮件进行更深入的验证(检查电子邮件地址域上的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
}
}
<?php
$email = "someone@exa mple.com";
if(!filter_var($email, FILTER_VALIDATE_EMAIL))
echo "E-mail is not valid";
else
echo "E-mail is valid";
?>