2013-07-16 10 views
5

Ich arbeite mit SYmfony 1.4 und Swift Mailer, um ein Massen-Array von E-Mails über Sendgrid zu senden.So erweitern Sie MailboxHeader.php in Swift Mailer oder validieren Sie E-Mails

Ich bekomme einen RFC-Compliance-Fehler für einige der E-Mail-Adressen.

Eine Lösung wäre remove the condition to throw the error, und es funktioniert, aber es beinhaltet das Ändern des Kerns. Wie würden Sie MailboxHeader.php in den Site-Dateien und nicht im Symfony-Core erweitern? Etwas wie das, aber nicht das, weil es nicht funktioniert:

class overrideRFCError extends Swift_Mime_Headers_AbstractHeader 
{ 
    private function _assertValidAddress($address) 
    { 
     if (!preg_match('/^' . $this->getGrammar('addr-spec') . '$/D', 
      $address)) 
     { 
      // throw new Swift_RfcComplianceException(
      // 'Address in mailbox given [' . $address . 
      // '] does not comply with RFC 2822, 3.6.2.' 
      // ); 
     } 
    } 
} 

Dies scheint auch ein wenig schwer durch. Gibt es eine Möglichkeit, die E-Mail auf RFC-Konformität zu überprüfen. Wenn ja, könnte ich es dann einfach aus dem Array entfernen.

UPDATE 07/17/13

konnte ich eine gründliche Reinigung an jeder Adresse um es RFC-konform zu machen, die das Problem löst. Ich würde jedoch gerne wissen, ob eine Funktion im SwiftMailer vorhanden ist, die diese Prüfung durchführt, anstatt eine benutzerdefinierte Funktion zu schreiben.

UPDATE 07/18/13

Hier ist, was ich zu arbeiten habe. Ich habe versucht, die Einträge so gut wie möglich zu bereinigen.

lädt eine Reihe von Adressen in einer Variablen $emailList

in Aktionen genannt:

$cleanList = sendGridEmailer::validateEmails($emailList); 

in sendGridEmailer Klasse:

// loop and validate each email address 
    public static function validateEmails($emailList) { 
     foreach($emailList as $address => $name) { 
      try { 
       $v = new sfValidatorEmail(); 
       $email = $v->clean($address); 

      } catch (sfValidatorError $e) { 
       unset($emailList[$address]); 
      } 
     } 
     foreach($emailList as $address => $name) { 
      $rfcTesting = validateEmailForRFC::is_email($address); 
      if(!$rfcTesting) { 
       unset($emailList[$address]); 
      } 
      if (!preg_match('/^[[email protected]]/', $address)) { 
       unset($emailList[$address]); 
      } 
     } 
     // List should be clean 
     return $emailList; 
    } 

Also das zuerst den sfValidator verwendet die anfängliche rauszuschmeißen schlechte Adressen. Als nächstes habe ich ein RFC-Compliance-Skript here und führe das in der validateEmailForRFC-Klasse, die sie RFC-konform machen sollte.

Zuletzt mache ich eine endgültige Pregmatch für alle Nachzügler mit seltsamen Zeichen, die die vorherigen Prüfungen nicht fangen.

Dies ermöglichte mir, den Symfony-Kern unberührt zu halten und die Adressen für Swift ohne Compliance-Fehler vorzubereiten.

+0

Haben Sie Details zu den Adressen, die den Fehler verursachen? Das Vermeiden des Fehlers durch Außerkraftsetzen kann eine Problemumgehung, aber keine Lösung sein. –

+0

Eigentlich gibt es keine Chance, dies zu vermeiden. Die Überprüfung auf falsche Adressen entspricht RFC, obwohl Anbieter dies akzeptieren können. Prüfregeln sind in Swift fest programmiert. Ändern Sie den Kern, werfen Sie nicht den Fehler, sondern schreiben Sie in eine Protokolldatei die Adresse. So können Sie überprüfen, ob die Adresse falsch ist oder es ist nur die strenge Überprüfung. –

+0

Ich möchte lieber die Fehlerprüfung nicht entfernen. Ich würde denken, dass es eine SwiftMailer-Funktion gibt, die die RFC-Validierung prüfen würde. Gibt es das? –

Antwort

3

Sie können die sfValidatorEmail oder die filter-var Funktion von symfony verwenden. Sie funktionieren gut genug mit SwiftMailer, aber keiner von ihnen sind RFC-konform IIRC. Zur Validierung gegen RFCs können Sie oder https://github.com/dominicsayers/isemail verwenden.

+0

Das Problem ist nicht "keine Validierung erfolgt". Die eingebaute SwiftMailer-Überprüfung ist RFC-konform und dies ist zu streng für viele Mail-Anbieter, die weniger strenge Adressen zulassen (lokaler Teil einer E-Mail-Adresse) –

+0

Weil 'SwiftMailer' die Email-Adressen vor dem Versenden einer Email überprüft und eine Ausnahme auslöst Wenn es ungültig ist, sollten Sie E-Mails validieren, bevor Sie sie in die Datenbank einfügen oder bevor Sie eine E-Mail senden. Wenn Sie nur an einen Empfänger senden, können Sie 'try ... catch' verwenden, aber für den Massenversand ist es nicht so gut. – 1ed

+0

IIRC 'SwiftMailer'-Check ist tatsächlich strenger als RFCs z.B. http://isemail.info/root%40localhost fehlschlägt in 'SwiftMailer' IIRC ... und das kann ein Problem sein, für Benutzer mit exotischen E-Mail-Adressen, aber im Allgemeinen ist es in Ordnung. – 1ed