Webform (Drupal) a validace emailové adresy

Pokud používáte webform s email políčkem, možná budete časem překvapeni, že defaultní validací projde adresa ve formátu foo@bar. Proč to tak je a jak to vyřešit, si nyní ukážeme.

Je email foo@bar v pořádku?

Jednoho dne jsem si všiml, že validací prochází emailové adresy typu foo@bar – tedy bez top level domény typu .cz, což přináší pozdější problémy. Byl jsem docela překvapený, že tohle webform nemá ošetřené, tak jsem začal pátrat. Ukázalo se, že je vše trochu složitější.

Webform samotný používá email.validator service, konkrétně \Drupal::service('email.validator')->isValid($value); A tato služba používá je definována dle definice "2.3.5. Domain Names of RFC 5321". K mému překvapení se ukázalo, že adresa foo@bar je dle definice v pořádku, jelikož taková adresy by mohla mít využití v lokáních sítích,, např. test@localhost

Co s tím?

Problém je diskutován např. v ticketu webformu Add optional routable email check for email address element https://www.drupal.org/project/webform/issues/3173490 Zde je k dispozici patch pro webform, který validuje email včetně top level domény.

Další diskuze se vede přímo v Drupal Core: Drupal email.validator service isValid accepts emails with no domain https://www.drupal.org/project/drupal/issues/2822142 I zde je popsané řešení, a to použití vlastní třídy pro validaci emailu.

RegExp řešení

Mě se zatím osvědčilo pro každé políčko typu email nastavit vlastní validaci pomocí regulárního výrazu [a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$

33Pattern regular expression

 

Závěr

Člověk se stále učí, a dnes se to opět ukázalo. Ani emailová adresa nemusí být jen taková, jakou ji běžně známe a používáme.