我在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()
而不是设置From
和FromName
:,则会收到此问题的通知
$mail->setFrom('example@host.com', 'Admin');
其次,你的代码应该在PHPMailer 5.2.16上失败——你没有使用自动加载器,也没有加载SMTP类,所以它将无法找到该类,也不会为你加载它。这可能是因为你的代码在尝试发送之前就失败了,所以你没有看到这个问题。无论如何,我建议使用composer。