2013-07-16 36 views
5

Pracuję z SYmfony 1.4 i SWIFT Mailer, aby wysłać dużą liczbę wiadomości e-mail za pośrednictwem Sendgrid.Jak przedłużyć MailboxHeader.php w Swift Mailer lub sprawdzić poprawność wiadomości e-mail

Otrzymuję błąd zgodności RFC dla niektórych adresów e-mail.

Jednym z rozwiązań jest remove the condition to throw the error i działa, ale wymaga zmiany rdzenia. Jak rozszerzyć MailboxHeader.php w plikach serwisu, a nie rdzeń symfony. Coś takiego, ale nie dlatego, że to nie działa:

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

Wydaje się to również trochę ciężkie z przekazaniem. Czy istnieje sposób sprawdzenia poprawności wiadomości e-mail pod kątem zgodności z RFC. Jeśli tak, mógłbym po prostu usunąć to z tablicy.

AKTUALIZACJA 07/17/13

udało mi się umieścić gruntowne czyszczenie na każdy adres, aby to zgodne z RFC, która rozwiązuje ten problem. Chciałbym jednak wiedzieć, czy w SwiftMailer istnieje funkcja, która wykonuje tę kontrolę, zamiast pisania niestandardowej funkcji.

AKTUALIZACJA 07/18/13

Oto co mam do pracy. Starałem się w jak największym stopniu zdezynfekować zgłoszenia.

obciążenia tablicą adresów w zmiennej o nazwie $emailList

w działaniach:

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

w sendGridEmailer Klasa:

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

Więc ten pierwszy wykorzystuje sfValidator wykopać początkowa złe adresy. Następnie mam skrypt zgodności RFC here i wykonać go w klasie validateEmailForRFC, która powinna być zgodna z RFC.

Ostatni, robię ostateczny pregmatch dla wszelkich maruderów z dziwnymi znakami, których poprzednie kontrole nie złapały.

Pozwoliło to na utrzymanie rdzenia Symfony i przygotowanie adresów dla Swift bez błędów zgodności.

+0

Czy masz jakieś dane na temat adresów, które powodują błąd? Uniknięcie błędu przez przesłonięcie może być obejściem, ale nie rozwiązaniem. –

+0

W rzeczywistości nie ma szansy na uniknięcie tego. Kontrola pod kątem złych adresów jest zgodna z RFC, chociaż dostawcy mogą to zaakceptować. Reguły sprawdzania są zakodowane w Swift. Zmień rdzeń, nie wyrzucaj błędu, ale napisz do pliku dziennika adres. Możesz więc sprawdzić, czy adres jest błędny, czy to tylko ścisłe sprawdzanie. –

+0

Wolałbym nie usuwać sprawdzania błędów. Myślę, że istnieje funkcja SwiftMailer, która sprawdzi poprawność RFC. Czy to istnieje? –

Odpowiedz

3

Możesz użyć funkcji Symfony: sfValidatorEmail lub filter-var. Działają wystarczająco dobrze z SwiftMailer, ale żaden z nich nie jest IIRC zgodny z RFC. W celu sprawdzania poprawności dla specyfikacji RFC można użyć lub https://github.com/dominicsayers/isemail.

+0

Problem nie polega na tym, że "nie ma sprawdzania poprawności". Sprawdzanie wbudowane SwiftMailer jest zgodne z RFC i jest to zbyt rygorystyczne dla wielu dostawców poczty, którzy dopuszczają mniej ścisłe adresy (lokalna część adresu e-mail). –

+0

Ponieważ 'SwiftMailer' sprawdza adresy e-mail przed wysłaniem wiadomości e-mail i zgłasza wyjątek jeśli jest nieważny, więc powinieneś sprawdzić pocztę e-mail przed umieszczeniem ich w bazie danych lub przed wysłaniem wiadomości e-mail. Wysyłając tylko do jednego odbiorcy, możesz użyć polecenia "try ... catch", ale w przypadku wysyłania zbiorczego nie jest tak dobrze. – 1ed

+0

Sprawdzanie 'SwiftMailer's' jest rzeczywiście bardziej rygorystyczne niż RFC, np. http://isemail.info/root%40localhost kończy się niepowodzeniem w 'SwiftMailer' IIRC ... i to może być problem, dla użytkowników z egzotycznymi adresami e-mail, ale ogólnie jest OK. – 1ed