symfony sfEmailValidator

ViPHP
fab
ViPHP | 2657 Messages

19 févr. 2009, 03:40

Voici le fruit de mes recherches :)

Problématique : Validé un email avec symfony et sans accès internet

J'ai jetté un coup d'oeil dans le sfEmailValidator dans le but d'utiliser autrepart la regex
elle est assez balèse et provient d'un article intéressant sur la validation des e-mails : http://iamcal.com/publish/articles/php/ ... email/pdf/

Donc je me suis pas embeté
	/**
	 * Check if a an email address is valid or not
	 *
	 * @param string $mail
	 *
	 * @return boolean
	 */
	public static function isValidMail($mail)
	{
		 $re = '/^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-'
           .'\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c\\x00-'
           .'\\x7f)*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-'
           .'\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80'
           .'-\\xff]|\\x5c\\x00-\\x7f)*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29'
           .'\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^'
           .'\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*\\x5d)(\\x2e([^\\x00-'
           .'\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-'
           .'\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*'
           .'\\x5d))*$/'
      ;

		if (!preg_match($re, $mail)) {
			return false;
 		}

		return true;
	}
Et là lors de mes test à ma grand surprise, les adresses de type "xxx@xxx" sont dites valides!!
J'ai donc cherché dans l'article le pourquoi du comment, la réponse est simple : cette regex respecte au poil près la RFC, on vérifie donc que le format est valide mais pas si c'est une adresse e-mail internet valide et toute la nuance est là!
C'est pour ça que symfony utilise la vérification du domain via http://fr.php.net/checkdnsrr

Donc pour valider des e-mails avec symfony sans accès internet, il faut éviter le sfEmailValidator sous peine d'avoir des e-mails incorrects.
Voici une regex pas trop mal qui fera le travail dans 99,999% des cas

Code : Tout sélectionner

^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$

Avec l'espoir que ce post puisse servir à éviter des migraines :)
[/b]
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

19 févr. 2009, 09:21

Comment tu fais pour avoir un serveur web qui doit traiter (et donc certainement envoyer) des e-mails avec des adresses "web" valides, sans accès internet ? :)

ViPHP
fab
ViPHP | 2657 Messages

19 févr. 2009, 14:39

application intranet qui n'envoie pas d'e-mail et dont l'email là qu'a titre indicatif
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }