验证电子邮件地址在PHP中有效是多么容易?

时间:2010-05-15 03:44:02

标签: php email verify

如果是电子邮件地址,我该如何验证它是否有效? (该电子邮件的域名将接受该地址的电子邮件。)

这在PHP中看起来如何?

注意:我不想验证电子邮件地址本身在语法上是否有效。我想知道域名是否接受电子邮件到该地址。

我原本以为有一些方法可以使用MX记录或其他东西......

7 个答案:

答案 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)

我以为我会提到PHP有一个内置函数getmxrr(),可以从域中检索MX记录。

这有用,我不知道......在页面上说明:

  

此功能不应用于地址验证。

因此,它的使用仅限于验证域甚至是否有邮件服务器。

答案 6 :(得分:-1)

如果您使用的是PHP 5.2.x,那么现在不需要使用自定义验证功能。 PHP附带built in函数