Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Quelle syntaxe pour une adresse de courriel ?

26 réponses
Avatar
Olivier Miakinen
[ publication dans fr.comp.lang.php et fr.comp.mail,
suivi dans fr.comp.mail seul ]

Bonjour,

Lassé de voir tant de fonctions de contrôle des adresses de courriel
incorrectes, qui refusent par exemple les adresses « plussées » comme
la mienne (om+news en partie gauche) mais aussi les TLD¹ de plus de
trois caractères tels que .name, .aero ou .museum, j'ai l'intention de
faire inclure dans la FAQ de fr.comp.lang.php une fonction correspondant
mieux à la réalité.

Du coup, j'ai lu les RFC 952 et 1035 (noms de domaine), 2822 (format de
messages), 3696, et d'autres.

Il en ressort les choses suivantes.

1) Pour la partie gauche, avant l'arrobe (@)
--------------------------------------------
1a) Cette partie est composée d'une ou plusieurs sous-parties séparées
par des points (.).
1b) Chaque sous-partie est constituée d'au moins un caractère (donc on
n'a pas de point au début, ni à la fin, et on ne peut pas non plus
avoir deux points de suite.
1c) Les caractères suivants peuvent être utilisés tels quels, sans
protection :
- les lettres majuscules et minuscules sans accent (A à Z et a à z)
- les chiffres (0 à 9)
- les caractères !#$%&'*+-/=?^_`{|}
1d) Cela étant, on peut toujours utiliser d'autres caractères, y
compris l'espace ( ) et l'arrobe (@) à condition de les protéger,
par exemple <"John@Doe"@example.com> ou <John\ Doe@example.com>.

2) Pour la partie droite, après l'arrobe (@)
--------------------------------------------
2a) Cette partie est aussi composée d'une ou plusieurs sous-parties
séparées par des points (.).
2b) Là encore chaque sous-partie est constituée d'au moins un caractère.
2c) D'après le RFC 952, la syntaxe de chaque sous-partie est très
stricte :
- d'abord une lettre (A à Z ou a à z)
- suivie éventuellement par un certain nombre de lettres, de
chiffres (0 à 9) et de traits d'union (-)
- mais ne pouvant finir que par une lettre ou un chiffre (donc
pas un trait d'union
2d) D'après le RFC 1035, la syntaxe décrite ci-dessus n'est qu'une
« preferred syntax », tandis qu'en réalité à peu près n'importe
quelle chaîne de bits pourrait être stockée dans un DNS.
2e) L'expérience montre que les noms de sous-domaine ne commencent
pas forcément par une lettre, et d'ailleurs ne contiennent même pas
obligatoirement de lettre (ex : 123.net ou 93.fr).
2f) En revanche, il semble établi que le trait d'union ne peut jamais
être le premier ni le dernier caractère d'un nom de sous-domaine.
2g) Le RFC 1035 limite chaque nom de sous-domaine à 63 octets au
maximum, et le FQDN² à 255 octets au maximum.
2h) Le RFC 3696 considère qu'en dehors des applications chargées de
gérer les TLD eux-mêmes, tout nom de domaine devrait être un FQDN
avec donc au moins un point (.) séparant deux sous-domaines.

3) Pour l'ensemble
------------------
Le RFC 3696 limite la partie gauche à 64 octets au maximum, soit un
total de 320 octets au maximum pour l'adresse complète (64+1+255).


Tout ceci étant posé, j'envisage de conserver les règles suivantes :
(1a), (1b) et (1c) ; (2a), (2b), (2f), (2g) et (2h) ; (3). J'éliminerais
la possibilité (1d). Quant à (2c), (2d) et (2e), j'utiliserais une règle
(2c) assouplie pour accepter un chiffre comme premier caractère de
chaque sous-domaine (ce qui légitime les adresses constatées en (2e)).


En PHP, je construirais donc les expressions rationnelles suivantes :
// partie gauche
$atext = '[A-Za-z0-9!#$%&\'*+/=?^_`{|}-]';
$atom = "$atext+"
$leftpart = "$atom(\.$atom)*";
// partie droite
$letdig = '[A-Za-z0-9]';
$letdighyp = '[A-Za-z0-9-]';
$subdomain = "$letdig($letdighyp{0,61}$letdig)?";
$domain = "$subdomain(\.$subdomain)+";
// expression globale
$regexp = "$leftpart@$domain";

Il ne resterait plus qu'à tester indépendamment les longueurs max
respectives des parties gauche et droite (64 à gauche, 255 à droite).


En espérant ne pas vous avoir assommés avec ce long article, j'espère
avoir vos réactions.

Cordialement,
--
Olivier Miakinen
¹ TLD = Top level domain = domaine de premier niveau
² FQDN = Fully-qualified domaine name = nom de domaine complet

6 réponses

1 2 3
Avatar
F. Senault

Manifestement non. L'usage des nouveaux gTLDs, à commencer par .INFO est
ralenti à cause de tous les filtrages incorrects qui sont faits.


Erm, c'est de la grosse extrapolation, ça, IMHO.


Quand je vois le nombre de sites web qui refusent mon email (avec un + à
gauche), signe du nombre affolant de tests foireux, c'est tout sauf de
l'extrapolation selon moi.


Erf. Merveilleuse contradiction - faire de son cas une généralité, mais
non, pas extrapoler, quelle idée.

Je ne vois donc absolument pas pourquoi faire un tel
filtrage. Quite à faire un filtrage précis, il faudrait alors
comparer avec la liste complète des TLDs valides... mais liste qu'il
faudra mettre à jour.


On ne peut pas dire que ça change tous les jours.


Ce qui ne justifie pas non plus un filtrage sur la taille.


Ah. Ben je trouve que si.

Compte tenu des copier coller divers, faire une expression de filtrage
à l'heure actuelle qui fait de nouveau une limite à 3 caractères
pour le TLD, c'est clairement anti-productif et une baffe à l'avenir.


Au passage, l'expression dont il était question ne limitait pas à 3
caractères. JDC, JDR.


Ce n'est pas vous qui avait dit:
Par contre, pour compléter ton expression rationnelle, je te
conseillerais bien de te fendre d'un ([a-z]{2,6}) pour le (cc)TLD (de
mémoire, il me semble que ça suffit).


{2,6}. Pas trois.

Ce qui, selon moi, est une erreur. Erreur faite dans le passé, et je
trouve donc dommage de la faire dans le futur. Surtout compte-tenu des
évolutions (IDNs en particulier)


Je ne considère pas ceci comme étant une erreur, juste un choix :
augmenter le coût de la maintenance, tout en y gagnant de la précision.

Maintenant, c'est un choix que _je_ trouve intéressant. A chacun son
truc.

Fred
--
Something inside of me has opened up its eyes
Why did you put it there did you not realize
This thing inside of me it screams the loudest sound
Sometimes I think I could (Nine Inch Nails, Burn)



Avatar
Patrick Mevzek
Erm, c'est de la grosse extrapolation, ça, IMHO.


Quand je vois le nombre de sites web qui refusent mon email (avec un + à
gauche), signe du nombre affolant de tests foireux, c'est tout sauf de
l'extrapolation selon moi.


Erf. Merveilleuse contradiction - faire de son cas une généralité, mais
non, pas extrapoler, quelle idée.


Vous lisez ce que vous voulez lire. Je vous donne un exemple. Lisez un peu
les comptes rendus des rencontres ICANN vous en trouverez d'autres.

Ce n'est pas vous qui avait dit:
Par contre, pour compléter ton expression rationnelle, je te
conseillerais bien de te fendre d'un ([a-z]{2,6}) pour le (cc)TLD (de
mémoire, il me semble que ça suffit).


{2,6}. Pas trois.


Vous jouez sur les mots...

Ce qui, selon moi, est une erreur. Erreur faite dans le passé, et je
trouve donc dommage de la faire dans le futur. Surtout compte-tenu des
évolutions (IDNs en particulier)


Je ne considère pas ceci comme étant une erreur, juste un choix :


Pour moi c'est une erreur.

augmenter le coût de la maintenance, tout en y gagnant de la précision.


Quelle précision ? La précision serait une recherche dans la liste des
TLDs officiels. Pas un filtrage sans justification.

Maintenant, c'est un choix que _je_ trouve intéressant. A chacun son
truc.


Et justement le propos est de trouver une expression pour tout le monde,
pas que pour vous.

Et pour tout le monde, limiter à 6 n'a aucune justification ni aucun
intérêt. Pire, cela viole le standard.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>



Avatar
Patrick Mevzek
Rapport qualité prix : j'élimine sans faute et pour un prix minable un
truc qui ne m'intéressera certainement pas, sans besoin de technologies
compliquées comme des lookups DNS ou ce genre de choses.


Tout en laissant passer des milliers de cas invalides : .xx .xyz .abcdef
etc... etc...

Bref vous réglez 1% du problème, et l'appel au DNS est obligatoire à un
moment donné ou un autre (vérification de la présence d'un A ou MX) de
toute façon.

Une fausse bonne solution donc.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
F. Senault

Rapport qualité prix : j'élimine sans faute et pour un prix minable un
truc qui ne m'intéressera certainement pas, sans besoin de technologies
compliquées comme des lookups DNS ou ce genre de choses.


Tout en laissant passer des milliers de cas invalides : .xx .xyz .abcdef
etc... etc...


Oui.

Bref vous réglez 1% du problème, et l'appel au DNS est obligatoire à un
moment donné ou un autre (vérification de la présence d'un A ou MX) de
toute façon.


En réception de courrier ? Go ahead, make my day.

Une fausse bonne solution donc.


Fred
--
And you run and you run to catch up with the sun, but it's sinking
And racing around to come up behind you again
The sun is the same in the relative way, but you're older
Shorter of breath and one day closer to death (Pink Floyd, Time)


Avatar
Olivier Miakinen

Mon point de vue - généralement orienté serveurs de courrier, de news,
spam et anti-spams - est fatalement différent.


Bon, je veux bien. Mais que t'apporte de plus le fait de détecter
immédiatement comme invalide l'adresse
alors que ne sera pas détectée, pas plus que
?


Rapport qualité prix : j'élimine sans faute et pour un prix minable un
truc qui ne m'intéressera certainement pas, sans besoin de technologies
compliquées comme des lookups DNS ou ce genre de choses.


Bon, d'accord. Ton point de vue est effectivement différent de celui
visé par la FAQ de fr.comp.lang.php. Par ailleurs, tu es loin d'être un
débutant en matière de courriel, et tu sauras donc facilement adapter
tes outils le jour où un TLD d'une lettre ou de plus de six lettres
apparaîtra, ce qui t'exclut encore une fois du public visé par cette
FAQ (public constitué essentiellement par des concepteurs de site web,
en PHP, lesquels ne sont pas forcément très sensibilisés au monde SMTP).

Note que, dans le contexte dans lequel je me place, faire des lookups
DNS est aussi une *très* mauvaise solution, alors qu'envoyer un courriel
de demande de confirmation d'inscription est *la* bonne méthode. Je vais
donc rester sur mon idée de départ, en simplifiant un peu l'expression,
mais sans restreindre davantage le répertoire de caractères ni la
longueur du TLD.

Je te remercie en tout cas de tes réponses, qui ont apporté un éclairage
différent. J'espère d'ailleurs que Patrick et toi ne vous monterez pas
trop l'un contre l'autre, comprenant chacun que vos positions sont
toutes deux défendables, dans leurs contextes respectifs.


Cordialement,
--
Olivier Miakinen



Avatar
F. Senault

Je te remercie en tout cas de tes réponses, qui ont apporté un éclairage
différent.


Service, tout ça.

J'espère d'ailleurs que Patrick et toi ne vous monterez pas
trop l'un contre l'autre, comprenant chacun que vos positions sont
toutes deux défendables, dans leurs contextes respectifs.


C'est tout compris pour moi, ceci étant d'ailleurs mon dernier message
de ce fil.

CYA,

Fred
--
Well, that's a whole 'nother thread by now, and I don't want to tangle
too many threads in one place. Being called a Usenet Kitten would be
embarrassing.
(Alan in the SDM)

1 2 3