Ve verzi PHP 5.2 přibyla nová funkce, pomocí které bylo jednoduché validovat email. Stačilo zadat filter_var($input, FILTER_VALIDATE_EMAIL)
a funkce vrátila emailovou adresu, nebo false
pokud adresa neprošla validací. Kromě skutečnosti, že některé validní adresy neprošly, fungovala a používala se často. Ale například nekontrolovala, jestli doména existuje. Přesto se jednalo o lepší řešení než si psát vlastní regulární výraz.
Tuto metodu donedávna používal i Laravel ve svých validačních pravidlech. Pak ale došlo k implementaci knihovny Email Validator. A ta doplnila plno dalších validačních pravidel.
Validace dle RFC, existence DNS i SpoofCheck
Jako základní pravidla knihovna obsahuje validaci podle RFC standardů. Konkrétně třída RFCValidation
a NoRFCWarningsValidation
. Zatímco první třída ignoruje veškerá varování, druhá už dle názvu je převede na chyby a email označí za nevalidní.
Pro všechny následující validační pravidla je nutné mít nainstalované PHP Intl rozšíření.
Co ale tak ještě zkontrolovat, že zadaná adresa dokáže přijímat emaily? Od toho je další validační pravidlo DNSCheckValidation
. Pomocí PHP funkce checkdnsrr
zjistí, má-li doména MX záznam. Pokud ne, validace neprojde. Funkce samozřejmě nezjistí existenci samotné schránky. Ale převážně se toto hodí pro kontrolu překlepů. Například záměna seznam.cz za senam.cz apod.
use Egulias\EmailValidator\EmailValidator; use Egulias\EmailValidator\Validation\DNSCheckValidation; use Egulias\EmailValidator\Validation\MultipleValidationWithAnd; use Egulias\EmailValidator\Validation\RFCValidation;
use Egulias\EmailValidator\Validation\SpoofCheckValidation; $validator = new EmailValidator(); $multipleValidations = new MultipleValidationWithAnd([ new RFCValidation(), new DNSCheckValidation(),
new SpoofCheckValidation(), ]); $validator->isValid("PAVEL.KUTAC@gmail.com", $multipleValidations); // true
$validator->isValid("PАVEL.KUTАC@gmail.com", $multipleValidations); // false
Třída SpoofCheckValidation
kontroluje věci, které nejsou na první pohled zřejmé. Proč první validace v kódu výše prošla a druhá ne? Protože v druhém řádku v mém jméně je znak A ve skutečnosti písmeno z Běloruské cyrilice.
Ještě pokročilejší kontrola s Mailgunem
O Mailgunu je zde na blogu také článek. Ten kromě odesílání emailů dokáže validovat emailové adresy na základě svých statistik. Jednoduše proto, že ví, které adresy prošly i když by neměly, jaké schránky neexistují a mnoho dalšího. Jedná se ale o externí službu za kterou se již musí platit. Jen 100 validací za měsíc je zdarma.
Jak se vypořádáváte s validací vy, máte nějaké tipy? Podělte se v komentářích
K tomuto článku již není možné přidávat další komentáře