PHPMailer 5.2.16版和PHP 5.6.19版的有效PCRE8库



我在PHPMailer中的地址验证器有问题。有人能帮我拿一个有效的吗?我的PHP版本是5.6.9,PHPMailer的版本是5.2.16,所以基本上选择的库是pcre8。puny编码:

return (boolean)preg_match(
                '/^(?!(?>(?1)"?(?>\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\[ -~]|[^"])"?(?1)){65,}@)' .
                '((?>(?>(?>((?>(?>(?>x0Dx0A)?[t ])+|(?>[t ]*x0Dx0A)?[t ]+)?)(((?>(?2)' .
                '(?>[x01-x08x0Bx0Cx0E-'*-[]-x7F]|\[x00-x7F]|(?3)))*(?2))))+(?2))|(?2))?)' .
                '([!#-'*+/-9=?^-~-]+|"(?>(?2)(?>[x01-x08x0Bx0Cx0E-!#-[]-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;
}

?>

谢谢!

理论上确实不能使用正则表达式来验证电子邮件地址(正如那个著名的问题所表明的那样),尽管这主要是因为试图适应RFC822中更复杂(在这种情况下大多无关紧要)的要求,而不是RFC821中更实用、更简单的要求。然而,在实践中,它的效果非常好,值得一试。这就是为什么,例如,PHP filter_var函数的FILTER_VALIDATE_EMAIL标志使用一个(由与PHPMailer中的pcre8模式相同的作者)。

我怀疑你遇到了一个长期存在的PHPMailer错误,它与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类,所以它将无法找到该类,也不会为你加载它。这可能是因为你的代码在尝试发送之前就失败了,所以你没有看到这个问题。无论如何,我建议使用composer。

相关内容

  • 没有找到相关文章

最新更新