2016-07-27 86 views
0

我在PHPMailer中的地址验证器中遇到问题。有人可以帮我一个有效的吗?我的PHP版本是5.6.19,而PHPMailer的版本是5.2.16,所以基本上选择的库是pcre8。弱小编码:PHPMailer版本5.2.16和PHP版本5.6.19的有效PCRE8库

return (boolean)preg_match(
       '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . 
       '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . 
       '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . 
       '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . 
       '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . 
       '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . 
       '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . 
       '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . 
       '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', 
       $address 
      ); 

send.php:

<?php 
ini_set('display_errors', true); 
    error_reporting(E_ALL); 
    require_once('class.phpmailer.php'); 
    $to=isset($_POST['verify'])?$_POST['verify']:false; 
    $subject="Email verification"; 
    $message='<p>Welcome to Our service this is an email verification procedure, Please click <a href="#">here</a> to go back.'; 

//$to= "[email protected]"; 
    $mail = new PHPMailer(); 
    $mail->isSMTP(); // telling the class to use SMTP 

// SMTP Configuration 
$mail->SMTPSecure='ssl'; 
$mail->SMTPAuth = true;     // enable SMTP authentication 
$mail->Host = "smtp.gmail.com "; // SMTP server 
$mail->Username = "[email protected]"; 
$mail->Password = "mypassword";    
$mail->Port = 465; // optional if you don't want to use the default 

$mail->From = "<[email protected]>"; 
$mail->FromName = "Admin"; 
$mail->Subject = $subject; 

//$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test 
    $mail->isHTML(true); 
    $mail->Body=$message; 
    $mail->msgHTML($message); 


    $mail->addAddress($to); 
    if(!$mail->Send()) 
    { 
    $response = "Message error!".$mail->ErrorInfo; 
echo $response; 
    // echo $to; 
} 


    else { 
$response = "Message sent!"; 
    echo $response; 
} 


?> 

谢谢!

+0

这是相当正确的。您是否看过其他一些关于使用PHP验证电子邮件的主题? http://stackoverflow.com/questions/12026842/how-to-validate-an-email-address-in-php – chris85

+0

这不是关于使用正则表达式验证电子邮件地址的一般问题;它关于PHPMailer中的验证机制。 – Synchro

+0

@Synchro这是怎样的不同? PHPMailer似乎使用正则表达式进行验证,并且问题实际上是要求为此验证提供有效的正则表达式。 –

回答

0

从理论上说,你无法准确地使用正则表达式验证电子邮件地址(正如那个着名的问题所示),但这主要是由于试图容纳更复杂(并且在这种情况下大多不相关)的需求RFC822,而不是RFC821的更实际和更简单的要求。然而,在实践中,它运作得很好,值得。这就是为什么,例如,PHP filter_var函数的FILTER_VALIDATE_EMAIL标志使用一个(与PHPMailer中的pcre8模式相同的作者)。

我怀疑你遇到了一个long-standing PHPMailer bug,这对于PHP中的PCRE是有用的 - 但它不一致,即使它们具有相同的PHP和PCRE版本也不会影响每个人,所以它没有被解决。 pcre8模式使用一些仅在更高版本的PCRE中可用的功能,而较老的不太精确的pcre模式不使用这些功能,并且不会遇到同样的问题。你可以告诉PHPMailer的设置该类物业用于其内部验证该模式:

PHPMailer::$validator = 'pcre'; 

另外,您可以通过同一个类属性设置为一个可调用注入自己的验证功能,例如这将使其考虑有效的所有地址:

PHPMailer::$validator = function($email) { return true; }; 

更新:它总是有助于看到您的代码!我看到两个问题:

$mail->From = "<[email protected]>"; 

这不是一个有效的发件人地址,而且可能是您的错误原因。你会得到这个问题的通知,如果你使用的setFrom(),而不是设置FromFromName

$mail->setFrom('[email protected]', 'Admin'); 

其次,你的代码应该失败的PHPMailer的5.2.16 - 你不使用自动加载和不加载SMTP类,所以它将无法找到该类,并且不会为您加载它。这可能是因为你的代码在尝试发送之前就失败了,所以你没有看到这个问题。无论如何,我推荐使用作曲家。

+0

我试过了,它仍然不起作用,我试过所有模式的案例,但没有工作,我已将验证函数更改为filter_var,但它会引发错误“您必须在列表中提供一个收件人”。 –

+0

在这种情况下,问题不在于验证模式,而是在其他地方,可能与小块代码处理有关。请问你可以在你的问题中发布你的其他代码吗? – Synchro

+0

是PHPMailer类还是我的发送代码? –