Vos applications valident-elles correctement les adresses e-mail ?
Retour sur les détails des spécifications
Le 2011-03-04 12:36:34, par Idelways, Expert éminent sénior
Les adresses e-mail sont au cœur de toutes les applications Web. Et s'il y a bien une seule tâche commune à tous les projets de développement Web, c'est la validation de ces adresses.
Si cette validation peut sembler au premier abord simple, facilement accomplie par le test de conformité à une expression rationnelle, beaucoup de développeurs ignorent les détails des spécifications et risquent de rejeter des utilisateurs aux adresses e-mail peu habituelles certes, mais tout à fait conformes.
Le problème vient essentiellement du fait que les spécifications autorisent bien plus de caractères que ne le pensent beaucoup de développeurs. Les caractères ! $ & * – = ^ ` | ~ # % ‘ + / ? _ { } étant tous aussi valides les uns que les autres.
Les spécifications autorisent même la présence du caractère « @ » (arobase) dans la première partie de l'adresse pour peu qu'il soit échappé (précédé par un Antislash)
Cette problématique est d'autant plus compliquée que certains utilisateurs disposent d'adresses e-mail cette fois non conformes aux spécifications, mais tout à fait fonctionnelles.
Chris Sinjakli (un développeur anglais) préconise une solution plutôt radicale : ne valider l'adresse e-mail que par le lien (ou code) de validation envoyé au compte de messagerie en question.
Et vous ?
Comment validez-vous les adresses mail ?
Vos scripts de validation respectent-il les spécifications ?
Source : Blog de Chris Sinjakli
Si cette validation peut sembler au premier abord simple, facilement accomplie par le test de conformité à une expression rationnelle, beaucoup de développeurs ignorent les détails des spécifications et risquent de rejeter des utilisateurs aux adresses e-mail peu habituelles certes, mais tout à fait conformes.
Le problème vient essentiellement du fait que les spécifications autorisent bien plus de caractères que ne le pensent beaucoup de développeurs. Les caractères ! $ & * – = ^ ` | ~ # % ‘ + / ? _ { } étant tous aussi valides les uns que les autres.
Les spécifications autorisent même la présence du caractère « @ » (arobase) dans la première partie de l'adresse pour peu qu'il soit échappé (précédé par un Antislash)
Cette problématique est d'autant plus compliquée que certains utilisateurs disposent d'adresses e-mail cette fois non conformes aux spécifications, mais tout à fait fonctionnelles.
Chris Sinjakli (un développeur anglais) préconise une solution plutôt radicale : ne valider l'adresse e-mail que par le lien (ou code) de validation envoyé au compte de messagerie en question.
Et vous ?
Source : Blog de Chris Sinjakli
-
HezivaMembre régulierLa regexp de validation des emails est simple pourtant...
Code : 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55(?:(?:rn)?[ t])*(?:(?:(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t] )+|\Z|(?=[\["()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?: rn)?[ t])*)(?:.(?:(?:rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:( ?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t])*))*@(?:(?:rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\0 31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|\[([^\[\]\r\\]|\\.)*\ ](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".[] 000-031]+ (?:(?:(?:rn)?[ t])+|Z|(?=[["()<>@,;:\\".[]]))|[([^[]r]|.)*](?: (?:rn)?[ t])*))*|(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z |(?=[\["()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn) ?[ t])*)*<(?:(?:rn)?[ t])*(?:@(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\ r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".[] 000-031]+(?:(?:(?:rn) ?[ t])+|Z|(?=[["()<>@,;:\\".[]]))|[([^[]r]|.)*](?:(?:rn)?[ t] )*))*(?:,@(?:(?:rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])* )(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".[] 000-031]+(?:(?:(?:rn)?[ t] )+|Z|(?=[["()<>@,;:\\".[]]))|[([^[]r]|.)*](?:(?:rn)?[ t])*))*) *:(?:(?:rn)?[ t])*)?(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+ |\Z|(?=[\["()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:r n)?[ t])*)(?:.(?:(?:rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?: \r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t ]))*"(?:(?:rn)?[ t])*))*@(?:(?:rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\031 ]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|\[([^\[\]\r\\]|\\.)*\]( ?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".[] 000-031]+(? :(?:(?:rn)?[ t])+|Z|(?=[["()<>@,;:\\".[]]))|[([^[]r]|.)*](?:(? :rn)?[ t])*))*>(?:(?:rn)?[ t])*)|(?:[^()<>@,;:".\[\] \000-\031]+(?:(? :(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)? [ \t]))*"(?:(?:rn)?[ t])*)*:(?:(?:rn)?[ t])*(?:(?:(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|"(?:[^"\r\\]| \\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t])*)(?:.(?:(?:rn)?[ t])*(?:[^()<> @,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|" (?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t])*))*@(?:(?:rn)?[ t] )*(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;: ".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(? :[^()<>@,;:\\".[] 000-031]+(?:(?:(?:rn)?[ t])+|Z|(?=[["()<>@,;:\\".[ ]]))|[([^[]r]|.)*](?:(?:rn)?[ t])*))*|(?:[^()<>@,;:".\[\] \000- \031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\.|( ?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t])*)*<(?:(?:rn)?[ t])*(?:@(?:[^()<>@,; :".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|\[([ ^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\" .[] 000-031]+(?:(?:(?:rn)?[ t])+|Z|(?=[["()<>@,;:\\".[]]))|[([^[ ]r]|.)*](?:(?:rn)?[ t])*))*(?:,@(?:(?:rn)?[ t])*(?:[^()<>@,;:".\ [\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|\[([^\[\]\ r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".[] 000-031]+(?:(?:(?:rn)?[ t])+|Z|(?=[["()<>@,;:\\".[]]))|[([^[]r] |.)*](?:(?:rn)?[ t])*))*)*:(?:(?:rn)?[ t])*)?(?:[^()<>@,;:".\[\] \0 00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\ .|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t])*)(?:.(?:(?:rn)?[ t])*(?:[^()<>@, ;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\]]))|"(? :[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t])*))*@(?:(?:rn)?[ t])* (?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:". \[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[ ^()<>@,;:\\".[] 000-031]+(?:(?:(?:rn)?[ t])+|Z|(?=[["()<>@,;:\\".[] ]))|[([^[]r]|.)*](?:(?:rn)?[ t])*))*>(?:(?:rn)?[ t])*)(?:,s*( ?:(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;: ".\[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t])*)(?:.(?:( ?:rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[ \["()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t ])*))*@(?:(?:rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t ])+|\Z|(?=[\["()<>@,;:".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(? :\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".[] 000-031]+(?:(?:(?:rn)?[ t])+| Z|(?=[["()<>@,;:\\".[]]))|[([^[]r]|.)*](?:(?:rn)?[ t])*))*|(?: [^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:".\[\ ]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t])*)*<(?:(?:rn) ?[ t])*(?:@(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[" ()<>@,;:".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n) ?[ \t])*(?:[^()<>@,;:\\".[] 000-031]+(?:(?:(?:rn)?[ t])+|Z|(?=[["()<> @,;:\\".[]]))|[([^[]r]|.)*](?:(?:rn)?[ t])*))*(?:,@(?:(?:rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@, ;:".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t] )*(?:[^()<>@,;:\\".[] 000-031]+(?:(?:(?:rn)?[ t])+|Z|(?=[["()<>@,;:\\ ".[]]))|[([^[]r]|.)*](?:(?:rn)?[ t])*))*)*:(?:(?:rn)?[ t])*)? (?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:". \[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t])*)(?:.(?:(?: rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[ "()<>@,;:".\[\]]))|"(?:[^"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:rn)?[ t]) *))*@(?:(?:rn)?[ t])*(?:[^()<>@,;:".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]) +|\Z|(?=[\["()<>@,;:".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\ .(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".[] 000-031]+(?:(?:(?:rn)?[ t])+|Z |(?=[["()<>@,;:\\".[]]))|[([^[]r]|.)*](?:(?:rn)?[ t])*))*>(?:( ?:rn)?[ t])*))*)?;s*)
le 04/03/2011 à 13:16 -
kryogenMembre régulierle 04/03/2011 à 13:48
-
jayfazeMembre actif
T'es serieux toi ?
Puis les regex ça pue ! :pSi elle sont trop grosse ça alourdi l’exécution du script
en plus .....
bug php #43402FILTER_VALIDATE_EMAIL is not RFC2822 compliantle 04/03/2011 à 22:36 -
Notons aussi que pour une application PHP, il suffit d'un simple :
Code : filter_var($adresse_email, FILTER_VALIDATE_EMAIL)
le 04/03/2011 à 13:11 -
bigsisterMembre actifHeziva tu peux citer ta source STP
? le 04/03/2011 à 13:24 -
grunkModérateurChris Sinjakli (un développeur anglais) préconise une solution plutôt radicale : ne valider l'adresse e-mail que par le lien (ou code) de validation envoyé au compte de messagerie en question.
Cependant ca n'empèche pas de faire une validation grossière au moment de la saisie du genre vérifié que j'ai au moins un arobase , un identifiant et un domaine (pas forcément d'extension à ce domaine).le 04/03/2011 à 13:43 -
TopeurMembre régulierJe ne sais combien de fois je me suis vu refusé mon adresse email spécial newsletter de gmail par les formulaires de contact.
Ces adresses email sont des alias.
toto+newsletter@gmail.comLe + n'est pas considéré comme un caractère valide à tort !
toto+perso@gmail.comle 04/03/2011 à 16:18 -
NekoMembre chevronnéPeut-être que si y'avait pas autant de sites qui demandaient l'adresse mail pour rien ( si ce n'est les revendre/envoyer du spam ) les gens n'utiliseraient pas ce genre de procédés....le 04/03/2011 à 16:23
-
bigsisterMembre actifJ'ai pris le temps une fois de lire une RFC sur ce sujet, mais c'est assez long/compliqué... Sur internet, chacun propose son expression régulière miracle pour valider ses emails... mais à chaque fois il y a un problème
Du coup je m'en sors avec celle-ci :
Code : '^[a-zA-Z0-9\._-]{1,60}@[a-zA-Z0-9\._-]{1,36}[\.][a-zA-Z0-9]{2,4}$'
Bill si tu passes par là, donne la nous enfin cette satanée expression !!!le 04/03/2011 à 13:15 -
Les commentaires dans la doc php mentionnent des erreurs de validations. Notamment la validation d'une adresse mail sans extension (genre : utilisateur@developpez au lieu de utilisateur@developpez.net).le 04/03/2011 à 13:43