5 Stimmen

Wie man MailboxHeader.php in Swift Mailer erweitert oder E-Mails validiert

Ich arbeite mit SYmfony 1.4 und Swift Mailer, um über Sendgrid ein Array von E-Mails in großem Umfang zu senden.

Ich erhalte einen RFC-Konformitätsfehler bei einigen der E-Mail-Adressen.

Ein Lösungsansatz wäre, die Bedingung zum Werfen des Fehlers zu entfernen, und es funktioniert, aber es erfordert eine Änderung am Kern. Wie könnten Sie MailboxHeader.php in den Site-Dateien erweitern und nicht den Symfony-Kern. So etwas, aber nicht das, weil es nicht funktioniert:

class overrideRFCError extendet 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 etwas übertrieben zu sein. Gibt es eine Möglichkeit, die E-Mail auf RFC-Konformität zu validieren. Wenn ja, könnte ich sie dann einfach aus dem Array entfernen.

UPDATE 17.07.13

Ich konnte eine gründliche Reinigung für jede Adresse durchführen, um sie RFC-konform zu machen, was das Problem löst. Ich würde jedoch gerne wissen, ob eine Funktion im SwiftMailer existiert, die diesen Check durchführt, anstatt eine benutzerdefinierte Funktion zu schreiben.

UPDATE 18.07.13

Hier ist, was ich zum Laufen gebracht habe. Ich habe versucht, die Einträge so weit wie möglich zu bereinigen.

Laden Sie ein Array von Adressen in einer Variablen namens $emailList

in actions:

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

in sendGridEmailer-Klasse:

// Schleife und validiere jede E-Mail-Adresse
    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('/^[a-zA-Z0-9_.-@]/', $address)) {
                unset($emailList[$address]);
            }
        }
        // Liste sollte sauber sein
        return $emailList;
    }

Zunächst verwendet dies den sfValidator, um die ersten schlechten Adressen auszuschließen. Als nächstes habe ich ein RFC-Konformitätsskript hier bekommen und führe das in der Klasse validateEmailForRFC aus, was sie RFC-konform machen sollte.

Zuletzt führe ich einen finalen Pregmatch für mögliche Nachzügler mit seltsamen Zeichen aus, die die vorherigen Überprüfungen nicht erfasst haben.

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

5voto

1ed Punkte 3638

Sie können symfonys sfValidatorEmail oder die filter-var Funktion verwenden. Sie funktionieren gut genug mit SwiftMailer, aber keine von ihnen ist meines Wissens RFC-konform. Um gegen RFCs zu validieren, können Sie https://github.com/egulias/EmailValidator oder https://github.com/dominicsayers/isemail verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X