Ostatnio klient zgłosił, że w jego stronie, w momencie wysyłania newsletter’a pojawia się błąd i wiadomości nie dochodzą do klientów. Okazało się, że formularz, który używał do walidacji klasę sfValidatorEmail przepuszczał adresy w postaci konto.@host.com. Uwaga dla niedowidzących -> kropka jest przed znakiem małpy. Do wysyłania maili był zaprzęgnięty sfMailer, który notabene dziedziczy po Swift_Mailer, który z kolei sprawdza “po swojemu” i (podobno) zgodnie z jakimś RFC co powodowało zrzucanie wyjątku Swift_RfcComplianceException (wg. RFC 2822 taki adres nie powinien mieć miejsca). Trochę mnie to zirytowało, ponieważ ślepo zaufałem REGEXP’owi w ww. walidatorze.
Nauczony doświadczeniem zacząłem sprawdzać, jakby tu wykorzystać wyrażenia ze Swift_Mailer’a do własnej walidacji ale niestety po przebrnięciu stwierdziłem, że jest sporo obiektów do tworzenia gdybym chciał tylko sprawdzić adres więc napisałem walidator, który tworzy nową wiadomość i przechwytuje ww. wyjątek. Udostępniam dla potomnych i czekam na niepochlebne komentarze :))) Dla ułatwienia, dziedziczy on po sfValidatorEmail więc nie musimy używać obu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <?php /** * Walidator do adresów email korzystający z biblioteki Swift * do sprawdzania czy adres email jest zgodny z odpowiednim RFC * * @author Arkadiusz Malinski * * @uses Swift_Message */ class fnValidatorSwiftEmail extends sfValidatorEmail { /** * Konfiguracja walidatora. Dodany komunikat błedów "invalid_rfc" który * otrzymywany jest z walidatora w momencie gdy * * @param array $options An array of options * @param array $messages An array of error messages * * @see sfValidatorEmail */ protected function configure($options = array(), $messages = array()) { parent::configure($options, $messages); $this->addMessage('invalid_rfc', '"%value%" is not valid email (RFC 2822, 3.6.2).'); } /** * Sprawdzanie podanej wartości na podstawie tworzonej * nowej wiadomości Swift_Message * * @see sfValidatorEmail */ protected function doClean($value) { $value = parent::doClean($value); try { $msg = new Swift_Message(); $msg->addTo($value); } catch (Swift_RfcComplianceException $exception) { throw new sfValidatorError($this, 'invalid_rfc', array('value' => $value)); } unset($msg); return $value; } } ?> |