适用于PHPMailer版本5.2.16和PHP版本5.6.19的有效PCRE8库

时间:2016-07-27 15:09:35

标签: php phpmailer pcre

我的PHPMailer中的地址验证器有问题。有人可以用有效的帮我吗?我的PHP版本是5.6.19,而PHPMailer的版本是5.2.16,所以基本上选择的库是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= "whoto@otherdomain.com";
   $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 = "mymail@gmail.com";
$mail->Password = "mypassword";            
$mail->Port = 465; // optional if you don't want to use the default 

 $mail->From = "<example@host.com>";
 $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;
}


?>

谢谢!

1 个答案:

答案 0 :(得分: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 = "<example@host.com>";

这不是有效的发件人地址,可能是导致错误的原因。如果您使用setFrom()而不是设置FromFromName,则会收到此问题的通知:

$mail->setFrom('example@host.com', 'Admin');

其次,您的代码应该在PHPMailer 5.2.16上失败 - 您没有使用自动加载器而不加载SMTP类,因此它将无法找到该类并且不会为您加载它。可能是您的代码在尝试发送之前失败了,因此您没有看到该问题。无论如何,我建议使用作曲家。