2016-07-27 72 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類還是我的發送代碼? –