La validation d'emails

Publié le 28 avril 2024 par Rémy Guillermic
Couverture de l'article La validation d'emails

Dans cet article, nous allons parler de validation et plus spécifiquement de la validation des adresses email dans vos formulaires.

Laravel s'appuie sur le package egulias/email-validator pour effectuer la validation des adresses email, ce package offre 6 méthodes de validations distinctes.

  1. RFC
  2. Strict
  3. DNS
  4. Spoof
  5. Filter
  6. Filter Unicode

Voici un aperçu et les spécificités des différentes méthodes proposées par le package pour valider des adresses email !

Un peu de vocabulaire

Avant de lister les différentes méthodes de validation d'adresse email, il est nécessaire de comprendre quelques termes afin de bien saisir les subtilités entre les possibilités de validations.

Une adresse email est toujours constituée d'une partie locale, d'un domaine séparés par un @ et souvent d'une extension :

Les méthodes de validation que nous allons voir présenteront parfois des contraintes différentes pour chacun de ces quatre éléments.

RFC

La méthode RFC est celle utilisée par défaut par Laravel et répondra à la plupart de vos cas d'utilisation.

Cette validation se base sur différents standards RFC autorisant les adresses email contenant des lettres, des chiffres, les caractères suivants !#$%&'*+-/=?^_{|}~ et des caractères unicode.

Valide : ✅

1"bonjour@afla.dev"
2"人@afla.भारत"
3"ĽĄŖĂƲɆȽ@example.com"
4"!#$%&'*+-/=?^_`{|}~@gmail.com"
5"(contact)test.com"
6"pasdextension@test"

Chose étonnante, l'extension n'est pas obligatoire pour être valide en RFC !

En RFC, les adresses suivantes seront invalides, cette méthode de validation sera le juste milieu entre des validations plus permissives et restrictives.

Invalide : ❌

1"sansarobase.dev"
2"@sanslocale.fr"
3"sansdomaine@"
4".point@point."
5'guillemet"@test.fr'

Strict

La règle Strict sera moins laxiste que la règle par défaut : elle refusera les adresses de plus de 254 caractères, sans extension de domaine, avec un espace avant le '@', des backslashes, ou encore des chaînes de caractères entre guillemets ou parenthèses.

Contrairement à la méthode RFC, les adresses mails suivantes seront invalides avec la méthode Strict.

Invalide : ❌

1"(contact)test.com"
2"pasdextension@test"

DNS

La validation DNS vérifiera l'existence d'un enregistrement DNS, via la fonction PHP dns_get_record(), de l'adresse mail que vous souhaitez valider.

Bien qu'imparfaite et facilement contournable, cette validation DNS sera une preuve supplémentaire que l'adresse mail proposée existe belle et bien !

Spoof

La validation Spoof empêchera l'usage d'adresses email contenant des caractères susceptibles d'être confondus avec d'autres par des humains, en utilisant la fonction isSuspicious de la classe native de PHP, Spoofchecker.

Par exemple, dans l'adresse email spооf@lаpоstе.fr, chaque voyelle est en réalité un caractère issu de l'alphabet cyrillique et non latin, rendant cette adresse invalide selon la méthode de validation anti-spoofing.

Filter

La validation Filter utilise la fonction native de PHP filter_var avec l'option FILTER_VALIDATE_EMAIL.

Cette validation était celle par défaut dans Laravel jusqu'à la version 5.8 !

La validation par filtre est moins élaborée que la validation RFC et se limite à rejeter certains critères spécifiques, tels que la présence de caractères unicode dans les parties locale ou domaine de l'adresse, les caractères entre parenthèses, ainsi que certains caractères spéciaux tels que les guillemets et le tiret long.

Invalide : ❌

1"人@unicodedomaine.भारत"
2"人unicodelocal@test.fr"
3"double“quotation”mark@test.fr"
4"en–dash”Mark@test.fr"

Filter Unicode

Semblable à son homologue filter, la validation filter_unicode utilisera également filter_var, conservant le drapeau FILTER_VALIDATE_EMAIL mais en ajoutant l'option FILTER_FLAG_EMAIL_UNICODE.

Cette option supplémentaire permettra d'inclure des caractères unicode dans la partie locale de l'adresse email, comme dans l'exemple suivant ĽĄŖĂƲɆȽ@example.com.

Ainsi, l'adresse suivante sera considérée comme valide, contrairement à la méthode Filter : ✅

1"人unicodelocal@test.fr"

Les adresses jetables

D'autre part, le package Laravel-Disposable-Email pourra vous aider à filtrer les adresses email jetables fournies par des sites tels que yopmail.com, 10minutemail.com, ces prestataires d'emails étant régulièrement utilisées à des fins malveillantes :

1'email' => 'email|indisposable',

Vos propres règles :

Si aucune des règles précédemment présentées ne répond à vos besoins, n'oubliez pas qu'il est également possible de créer vos propres validations à l'aide de la commande suivante :

1php artisan make:rule

Vous pourriez, par exemple, mettre en place une règle refusant les alias dans une adresse email.

1<?php
2 
3namespace App\Rules;
4 
5use Closure;
6use Illuminate\Contracts\Validation\ValidationRule;
7 
8class SubAddressing implements ValidationRule
9{
10 public function validate(string $attribute, mixed $value, Closure $fail): void
11 {
12 if (Str::contains($value, '+')) {
13 $fail('The :attribute cannot contain Sub-addressing.');
14 }
15 }
16}

Une fois fonctionnelle, vous pourrez utiliser votre règle personnalisée dans vos validations de la manière suivante :

1$request->validate([
2 'email' => ['required', new SubAddressing()],
3]);

Conclusion

Vous êtes désormais paré pour valider des adresses emails dans vos formulaires !

Pour des vérifications plus exhaustives, nous vous conseillons vivement de combiner plusieurs méthodes de validation :

1'email' => 'email:strict,dns'

L'utilisation des règles strict et DNS devrait fournir un niveau de vérification adapté à la majorité de vos projets !

Source : https://github.com/egulias/EmailValidator
Rémy Guillermic avatar
Rémy Guillermic
Développeur full stack spécialisé dans l'écosystème de Laravel

A lire

Autres articles de la même catégorie