如果是电子邮件地址,我该如何验证它是否有效? (该电子邮件的域名将接受该地址的电子邮件。)
这在PHP中看起来如何?
注意:我不想验证电子邮件地址本身在语法上是否有效。我想知道域名是否接受电子邮件到该地址。
我原本以为有一些方法可以使用MX记录或其他东西......
答案 0 :(得分:4)
我认为您唯一的选择是SMTP RCPT TO或VRFY命令。
RCPT TO 可以成为一种检查方式,只要您在发布后断开连接即可。但是,如果该帐户不存在,则并非所有服务器都会引导您(防止该问题,捕获所有地址等)。
VRFY可以告诉您该服务器上是否存在帐户,但这几乎总是被禁用以防止帐户探测。
执行RCPT TO验证的PHP类(以及其他方法)是:http://code.google.com/p/php-smtp-email-validation/
答案 1 :(得分:2)
因为你明确说明了
电子邮件的域名将接受该地址的电子邮件。
没有正则表达式可以帮助你。验证的唯一方法是尝试向该地址发送电子邮件,看看它是否反弹。即便如此,您也可能会得到误报,因为邮件服务器可能不会发送失败通知。
使用PHP发送这样的基本电子邮件相当简单;查看mail()
函数here的文档。
答案 2 :(得分:1)
您无法实际检查服务器是否接受它。邮件服务器没有处理它的API。
曾经有一个尝试连接到MX服务器的脚本,并从服务器查找某种表示需要密码的响应,而不是仅仅将其拒绝为非使用中的邮箱。然而,这是非常糟糕的做法。
您唯一可以做的就是检查有效的电子邮件地址,并希望获得最佳效果:
http://www.linuxjournal.com/article/9585
这是实际遵循RFC标准的教程之一。
/**
Validate an email address.
Provide email address (raw input)
Returns true if the email address has the email
address format and the domain exists.
*/
function validEmail($email)
{
$isValid = true;
$atIndex = strrpos($email, "@");
if (is_bool($atIndex) && !$atIndex)
{
$isValid = false;
}
else
{
$domain = substr($email, $atIndex+1);
$local = substr($email, 0, $atIndex);
$localLen = strlen($local);
$domainLen = strlen($domain);
if ($localLen < 1 || $localLen > 64)
{
// local part length exceeded
$isValid = false;
}
else if ($domainLen < 1 || $domainLen > 255)
{
// domain part length exceeded
$isValid = false;
}
else if ($local[0] == '.' || $local[$localLen-1] == '.')
{
// local part starts or ends with '.'
$isValid = false;
}
else if (preg_match('/\\.\\./', $local))
{
// local part has two consecutive dots
$isValid = false;
}
else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain))
{
// character not valid in domain part
$isValid = false;
}
else if (preg_match('/\\.\\./', $domain))
{
// domain part has two consecutive dots
$isValid = false;
}
else if
(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',
str_replace("\\\\","",$local)))
{
// character not valid in local part unless
// local part is quoted
if (!preg_match('/^"(\\\\"|[^"])+"$/',
str_replace("\\\\","",$local)))
{
$isValid = false;
}
}
if ($isValid && !(checkdnsrr($domain,"MX") ||
↪checkdnsrr($domain,"A")))
{
// domain not found in DNS
$isValid = false;
}
}
return $isValid;
}
在确保电子邮件能够发送的方式中,验证与您将获得的一样好。
答案 3 :(得分:1)
验证电子邮件地址有效是多么容易?
根本不容易。请查看PHP中的Dominic Sayers' email validation,这可能是任何语言中最完整的电子邮件验证库。它还包括DNS检查。
另请参阅this related article from Jeff Atwood了解保证电子邮件到达所需的检查。
答案 4 :(得分:0)
(语法上)有效的电子邮件与接受电子邮件的电子邮件不同。为了检查域是否接受电子邮件,您必须尝试直接向MX发送电子邮件,但即便如此,如果SMTP服务器接受,您也不能保证不会被拒绝,即将发送非送达报告。如果您使用的是动态地址池或没有DNS反向,则SMTP服务器可能会拒绝您的电子邮件
答案 5 :(得分:0)
答案 6 :(得分:-1)
如果您使用的是PHP 5.2.x,那么现在不需要使用自定义验证功能。 PHP附带built in函数