EmailAddress Zend_Validate_EmailAddress permet de valider une adresse mail. Ce validateur éclate d'abord l'adresse mail entre partie locale et domaine et essaie de valider ces deux parties conformément aux spécifications des adresses mail et des noms de domaine. Utilisation de base Vous trouverez ci-dessous un exemple d'utilisation basique  isValid($email)) { // l'email est valide } else { // l'email est invalide ; afficher pourquoi foreach ($validateur->getMessages() as $message) { echo "$message\n"; } } ]]> Ceci validera l'adresse mail $email et, en cas d'échec, fournira des messages d'erreur informatifs via $validator->getMessages(). Options for validating Email Addresses Zend_Validate_EmailAddress supports several options which can either be set at initiation, by giving an array with the related options, or afterwards, by using setOptions(). The following options are supported: allow: Defines which type of domain names are accepted. This option is used in conjunction with the hostname option to set the hostname validator. For more informations about possible values of this option, look at Hostname and possible ALLOW* constants. This option defaults to ALLOW_DNS. deep: Defines if the servers MX records should be verified by a deep check. When this option is set to TRUE then additionally to MX records also the A, A6 and AAAA records are used to verify if the server accepts emails. This option defaults to FALSE. domain: Defines if the domain part should be checked. When this option is set to FALSE, then only the local part of the email address will be checked. In this case the hostname validator will not be called. This option defaults to TRUE. hostname: Sets the hostname validator with which the domain part of the email address will be validated. mx: Defines if the MX records from the server should be detected. If this option is defined to TRUE then the MX records are used to verify if the server accepts emails. This option defaults to FALSE. setOptions(array('domain' => false)); ]]> Parties locales complexes Zend_Validate_EmailAddress validera toute adresse mail conforme à la RFC2822. Comme par exemple bob@domaine.com, bob+jones@domaine.fr, "bob@jones"@domaine.com et "bob jones"@domaine.com. Quelques formats de mail obsolètes ne seront pas validés (comme toute adresse mail contenant un retour chariot ou un caractère "\"). Validation uniquement de la partie locale Si vous avez besoin de Zend_Validate_EmailAddress uniquement pour vérifier la partie locale d'une adresse mail, et que vous souhaitez désactiver la validation du nom d'hôte, vous pouvez spécifier le paramètre domain à la valeur false. Cela force Zend_Validate_EmailAddress à ne pas valider le nom d'hôte de l'adresse mail. setOptions(array('domain' => FALSE)); ]]> Validation de différents types de noms de domaine La partie domaine d'une adresse mail est validée via Zend_Validate_Hostname. Par défaut, seules les domaines qualifiés sous la forme domaine.com sont acceptés, même si, il vous est possible d'accepter les adresses IP et les domaines locaux également. Afin de réaliser cette opération, il vous faut instancier Zend_Validate_EmailAddress en lui passant un paramètre indiquant le type de nom de domaine à accepter. Les détails sont disponibles dans Zend_Validate_EmailAddress mais vous trouverez ci-dessous un exemple illustrant comment accepter les noms de domaines qualifiés et les hôtes locaux : isValid($email)) { // l'email est valide } else { // l'email est invalide ; afficher pourquoi foreach ($validateur->getMessages() as $message) { echo "$message\n"; } } ]]> Vérification que le nom de domaine accepte réellement le courriel Le fait qu'une adresse électronique est dans un format correct, ne signifie pas nécessairement que l'adresse électronique existe en réalité. Pour aider résoudre ce problème, vous pouvez utiliser la validation MX pour vérifier si une entrée MX (le courriel) existe dans le l'enregistrement du DNS pour le nom de domaine du courriel. Cela vous dit que le nom de domaine accepte le courriel, mais ne vous dit pas que l'adresse électronique elle-même est valable. La vérification MX n'est pas active par défaut et est seulement supporté par des plates-formes UNIX pour l'instant. Pour activer la vérification MX vous pouvez passer un deuxième paramètre au constructeur Zend_Validate_EmailAddress. Zend_Validate_Hostname::ALLOW_DNS, 'mx' => true ) ); ]]> MX Check under Windows Within Windows environments MX checking is only available when PHP 5.3 or above is used. Below PHP 5.3 MX checking will not be used even if it's activated within the options. Alternativement vous pouvez passer soit TRUE soit FALSE à $validator->setValidateMx() pour activer ou désactiver la validation MX. En activant ce paramètre, les fonctions de réseau seront utilisés pour vérifier la présence d'un enregistrement MX sur le nom de domaine de l'adresse électronique que vous voulez valider. Faîtes cependant attention, cela ralentira probablement votre scénario. Sometimes validation for MX records returns FALSE, even if emails are accepted. The reason behind this behaviour is, that servers can accept emails even if they do not provide a MX record. In this case they can provide A, A6 or AAAA records. To allow Zend_Validate_EmailAddress to check also for these other records, you need to set deep MX validation. This can be done at initiation by setting the deep option or by using setOptions(). Zend_Validate_Hostname::ALLOW_DNS, 'mx' => true, 'deep' => true ) ); ]]> Performance warning You should be aware that enabling MX check will slow down you script because of the used network functions. Enabling deep check will slow down your script even more as it searches the given server for 3 additional types. Disallowed IP addresses You should note that MX validation is only accepted for external servers. When deep MX validation is enabled, then local IP addresses like 192.168.* or 169.254.* are not accepted. Valider les noms de domaines internationaux Zend_Validate_EmailAddress peut aussi vérifier les caractères internationaux qui existent dans quelques domaines. Ceci est connu comme le support de Nom de Domaine International (IDN). Celui-ci est activé par défaut, quoique vous puissiez le mettre hors service en changeant le paramètre via l'objet interne Zend_Validate_Hostname qui existe dans Zend_Validate_EmailAddress. hostnameValidator->setValidateIdn(false); ]]> De plus amples informations concernant l'utilisation de setValidateIdn() sont présentes dans la documentation de Zend_Validate_Hostname. Notez cependant que les IDNs sont seulement validés si vous autorisez la validation des nom de domaines. Validation des "Top Level Domains" Par défaut un nom de domaine sera vérifié grâce à une liste de TLDs connus. Ceci est activé par défaut, quoique vous puissiez le mettre hors service en changeant le paramètre via l'objet Zend_Validate_Hostname interne qui existe dans Zend_Validate_EmailAddress. hostnameValidator->setValidateTld(false); ]]> De plus amples informations concernant l'utilisation de setValidateTld() sont présentes dans la documentation de Zend_Validate_Hostname. Notez cependant que les TLDs sont seulement validés si vous autorisez la validation des nom de domaines. Setting messages Zend_Validate_EmailAddress makes also use of Zend_Validate_Hostname to check the hostname part of a given email address. As with Zend Framework 1.10 you can simply set messages for Zend_Validate_Hostname from within Zend_Validate_EmailAddress. setMessages( array( Zend_Validate_Hostname::UNKNOWN_TLD => 'I don't know the TLD you gave' ) ); ]]> Before Zend Framework 1.10 you had to attach the messages to your own Zend_Validate_Hostname, and then set this validator within Zend_Validate_EmailAddress to get your own messages returned.