Pokročilá validace emailové adresy

PHP, Tipy & triky

Validace emailové adresy je vždy kámen úrazu a správné řešení není jednoduché. Naštěstí v PHP existují knihovny, které s tím pomohou. Jde to ale i bez knihoven jen pomocí základních funkcí. Nebo naopak s externími službami povýšit na úplně nový level.

Pokročilá validace emailové adresy

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