2016-07-27 37 views
0

Ich habe ein Problem mit meinem Adressvalidierer in PHPMailer. Kann mir jemand mit einem gültigen helfen? Meine PHP-Version ist 5.6.19 und PHPMailers Version ist 5.2.16, also ist die ausgewählte Bibliothek im Prinzip pcre8. mickrig Encode:Valid PCRE8 Library für PHPMailer Version 5.2.16 und PHP Version 5.6.19

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; 
} 


?> 

Dank!

+0

Das ist ziemlich die Regex. Haben Sie sich die anderen Themen zur Validierung von E-Mails mit PHP angesehen? http://stackoverflow.com/questions/12026842/how-to-validate-an-email-address-in-php – chris85

+0

Dies ist keine allgemeine Frage über die Validierung von E-Mail-Adressen mit Regexes; Es geht um einen Validierungsmechanismus in PHPMailer. – Synchro

+0

@Synchro wie ist das anders? PHPMailer scheint eine Regex für die Validierung zu verwenden, und die Frage fragt buchstäblich nach einem gültigen Regex-Ausdruck für diese Validierung. –

Antwort

0

Es ist sicherlich wahr, dass Sie in der Theorie nicht E-Mail-Adressen mit regulären Ausdrücken genau validieren können (wie diese berühmte Frage demonstriert), obwohl das vor allem aufgrund der komplexeren (und in diesem Kontext meist irrelevanten) Anforderungen von zu tun ist RFC822, anstelle der praktischeren und viel einfacheren Anforderungen von RFC821. In der Praxis funktioniert es jedoch so gut, dass es sich lohnt. Das ist der Grund, warum zum Beispiel das Flag FILTER_VALIDATE_EMAIL der PHP-filter_var einen verwendet (vom selben Autor wie das Muster pcre8 in PHPMailer).

Ich vermute, Sie laufen in eine long-standing PHPMailer bug das ist etwas mit PCRE in PHP - aber es ist inkonsistent und betrifft nicht alle, auch wenn sie die gleichen PHP und PCRE-Versionen haben, so ist es nicht gelöst worden. Das pcre8 Muster verwendet einige Funktionen, die nur in späteren Versionen von PCRE verfügbar sind, und das ältere, weniger genaue pcre Muster verwendet diese Features nicht und es tritt nicht das gleiche Problem auf. Sie können PHPMailer sagen, dass Muster für seine internen Validierungen zu verwenden, indem diese Klasse-Eigenschaft:

PHPMailer::$validator = 'pcre'; 

Alternativ können Sie Ihre eigene Prüffunktion injizieren durch die gleiche Klasse-Eigenschaft auf einen aufrufbare Einstellung, zum Beispiel das wird es machen betrachten alle Adressen gültig:

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

aktualisieren: Es hilft immer, Ihren Code zu sehen! Ich sehe zwei Probleme:

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

Das ist keine gültige Absenderadresse, und ist wahrscheinlich die Ursache für Ihren Fehler. Sie würden Meldung dieses Problems, wenn man setFrom() verwendet stattdessen From und FromName der Einstellung:

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

, zweitens Ihr Code sollte auf PHPMailer scheitern 5.2.16 - Sie verwenden nicht den Autoloader und nicht die SMTP-Klasse geladen , so dass es die Klasse nicht finden kann und sie nicht für Sie lädt. Es kann sein, dass Ihr Code versagt, bevor er versucht, zu senden, so dass Sie dieses Problem nicht sehen. Ich empfehle sowieso, Komponist zu verwenden.

+0

Ich habe es versucht, es funktioniert immer noch nicht, ich habe alle Muster Fälle versucht, aber nicht funktioniert, ich habe die Validierungsfunktion zu filter_var geändert, aber es wirft einen Fehler "Sie müssen auf der Liste einen Empfänger zur Verfügung stellen". –

+0

In diesem Fall ist das Problem nicht mit den Validierungsmustern, aber anderswo, wahrscheinlich mit der mickrigen Code-Handhabung zu tun. Kannst du bitte den Rest deines Codes in deiner Frage posten? – Synchro

+0

Die PHPMailer-Klasse oder mein sendender Code? –