2013-07-16 10 views
5

Sto lavorando con SYmfony 1.4 e un veloce mailer per inviare una serie di e-mail di massa tramite Sendgrid.Come estendere MailboxHeader.php in Swift Mailer o convalidare e-mail

Viene visualizzato un errore di conformità RFC su alcuni degli indirizzi di posta elettronica.

Una soluzione sarebbe a remove the condition to throw the error e funziona, ma comporta la modifica del core. Come estendere MailboxHeader.php nei file del sito e non nel nucleo di symfony. Qualcosa di simile, ma non questo perché non funziona:

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.' 
      // ); 
     } 
    } 
} 

Anche questo sembra un po 'pesante. C'è un modo per convalidare l'e-mail per la conformità RFC. Se è così, potrei semplicemente disinserirlo dall'array.

UPDATE 07/17/13

sono stato in grado di mettere una pulizia a fondo su ogni indirizzo per rendere più compatibili con RFC, che risolve il problema. Tuttavia, vorrei sapere se esiste una funzione in SwiftMailer che esegue questo controllo, piuttosto che scrivere una funzione personalizzata.

UPDATE 07/18/13

Ecco quello che ho avuto modo di lavorare. Ho provato a disinfettare le voci il più possibile.

carico di una serie di indirizzi in una variabile chiamata $emailList

in azioni:

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

in classe sendGridEmailer:

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

Quindi questo primo utilizza lo sfValidator a calci fuori l'iniziale indirizzi cattivi. Successivamente, ho ottenuto uno script di conformità RFC here ed eseguito quello nella classe validateEmailForRFC che dovrebbe renderli conformi a RFC.

Infine, eseguo un pregmatch finale per eventuali ritardatari con caratteri strani che i controlli precedenti non hanno catturato.

Ciò mi ha permesso di mantenere intatto il nucleo di Symfony e di aver preparato gli indirizzi per Swift senza errori di conformità.

+0

Avete dettagli sugli indirizzi che generano l'errore? Evitare l'errore eseguendo l'override può essere una soluzione, ma non una soluzione. –

+0

In realtà, non vi è alcuna possibilità di evitarlo. Il controllo degli indirizzi errati è conforme a RFC sebbene i provider possano accettarlo. Le regole di controllo sono hardcoded in Swift. Cambia il core, non lanciare l'errore ma scrivi su un file di log l'indirizzo. Quindi puoi controllare se l'indirizzo è sbagliato o è solo il controllo rigoroso. –

+0

Preferisco non rimuovere il controllo degli errori. Penserei che ci sia una funzione SwiftMailer che controllerebbe la convalida RFC. Questo esiste? –

risposta

3

È possibile utilizzare la funzione sfValidatorEmail di symfony o la funzione filter-var. Funzionano abbastanza bene con SwiftMailer, ma nessuno di questi è IIRC conforme allo standard RFC. Per la convalida con RFC è possibile utilizzare o https://github.com/dominicsayers/isemail.

+0

Il problema non è "nessuna convalida è stata eseguita". Il controllo integrato SwiftMailer è conforme a RFC e questo è troppo severo per molti provider di posta là fuori che consentono indirizzi meno rigidi (parte locale di un indirizzo e-mail) –

+0

Perché "SwiftMailer" controlla gli indirizzi e-mail prima di inviare una e-mail e lancia un'eccezione se non è valido, è necessario convalidare le e-mail prima di inserirle nel database o prima di inviare una e-mail. Quando si invia a un solo destinatario, è possibile utilizzare "try ... catch", ma per l'invio collettivo non è così buono. – 1ed

+0

IIRC Il controllo 'SwiftMailer' è in realtà più rigido di RFC, ad es. http://isemail.info/root%40localhost fallisce nell'IIRC di 'SwiftMailer' ... e questo può essere un problema, per l'utente con indirizzi email esotici, ma in generale va bene. – 1ed

Problemi correlati