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.