Symfony fournit une contrainte de validation pour les emails :

/**
 * @var string
 * @ORM\Column(name="email", type="string", length=255)
 * @Assert\Email()
 */
private $email;

De base cette constrainte n’est pas très évoluée et les adresses mail suivantes sont autorisées :

!~@test.*
@@test.a
...

Activer la vérification du MX du domaine de l’email

Le MX du domaine permet de s’assurer que :

  1. Le nom de domaine existe
  2. Un champ MX est défini pour ce domaine et qu’il est donc très probable qu’il y ait un serveur mail derrière

Pour activer la vérification du MX :

/**
 * @var string
 * @ORM\Column(name="email", type="string", length=255)
 * @Assert\Email(checkMX=true)
 */
private $email;

Il est possible également de vérifier le Host avec checkHost=true. Cette contrainte vérifie qu’il existe un champ A, un champ AAAA ou un champ MX. Mais je ne recommande pas l’utilisation de cette contrainte car checkMX permet de s’assurer qu’il existe au moins un champ MX et c’est ce qui est important pour envoyer un mail.

Activer la validation de l’email selon la RFC

La RFC 3696 définit précisément le format d’une adresse mail.

Pour activer la validation selon la RFC 3696 :

/**
 * @var string
 * @ORM\Column(name="email", type="string", length=255)
 * @Assert\Email(strict=true)
 */
private $email;

Il faut au préalable ajouter le bundle suivant : egulias/email-validator. Ce bundle permet de vérifier le format de l’adresse mail selon les préconisations de le RFC 3696.

composer require egulias/email-validator

Double validation

Avec ces deux contraintes, la validation est très correcte. On est sûr que le domaine existe et que l’adresse est au bon format. Pour utiliser les deux contraintes en même temps :

/**
 * @var string
 * @ORM\Column(name="email", type="string", length=255)
 * @Assert\Email(strict=true, checkMX=true)
 */
private $email;

Si tu veux personnaliser les messages d’erreur en fonction du type de contrainte :

/**
 * @var string
 * @ORM\Column(name="email", type="string", length=255)
 * @Assert\Email(strict=true, message="Le format de l'email est incorrect")
 * @Assert\Email(checkMX=true, message="Aucun serveur mail n'a été trouvé pour ce domaine")
 */
private $email;

Voir la documentation officielle

Full validation

Comment être sûr à 100% que l’adresse mail saisie est bien réelle ?

  • Envoyer un mail sur l’adresse mail saisie contenant un lien protégé qui, lorsqu’il est appelé, valide l’adresse mail
  • Envoyer un mail sur l’adresse mail saisie en indiquant un ReturnPath. Si l’adresse n’existe pas, tu recevra un mail de no-delivery sur cette adresse. Il faudra alors déclencher une opération à la réception de l’email pour invalider l’adresse mail.

Inconvénient : On ne peut pas vérifier au moment de la saisie.