La bibliothèque standard Python est livrée avec une fonction d'analyse syntaxique des e-mails : email.utils.parseaddr()
.
Il renvoie un couple contenant le nom réel et l'adresse réelle de l'e-mail :
>>> from email.utils import parseaddr
>>> parseaddr('foo@example.com')
('', 'foo@example.com')
>>> parseaddr('Full Name <full@example.com>')
('Full Name', 'full@example.com')
>>> parseaddr('"Full Name with quotes and <weird@chars.com>" <weird@example.com>')
('Full Name with quotes and <weird@chars.com>', 'weird@example.com')
Et si l'analyse syntaxique n'aboutit pas, elle renvoie un doublet de chaînes de caractères vides :
>>> parseaddr('[invalid!email]')
('', '')
Un problème avec cet analyseur est qu'il accepte tout ce qui est considéré comme une adresse e-mail valide pour RFC-822 et ses amis, y compris beaucoup de choses qui ne sont clairement pas adressables sur l'Internet :
>>> parseaddr('invalid@example,com') # notice the comma
('', 'invalid@example')
>>> parseaddr('invalid-email')
('', 'invalid-email')
Ainsi, comme le dit @TokenMacGuy, la seule façon définitive de vérifier une adresse électronique est d'envoyer un courrier électronique à l'adresse attendue et d'attendre que l'utilisateur agisse en fonction des informations contenues dans le message.
Cependant, vous pourriez vouloir vérifier, au moins, la présence d'un signe @ sur le deuxième élément du tuple, comme le suggère @bvukelic :
>>> '@' in parseaddr("invalid-email")[1]
False
Si vous voulez aller un peu plus loin, vous pouvez installer le programme dnspython et résoudre les serveurs de messagerie pour le domaine de courrier électronique (la partie après le '@'), en essayant d'envoyer un courrier électronique uniquement s'il y a des serveurs réels. MX
serveurs :
>>> from dns.resolver import query
>>> domain = 'foo@bar@google.com'.rsplit('@', 1)[-1]
>>> bool(query(domain, 'MX'))
True
>>> query('example.com', 'MX')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
[...]
dns.resolver.NoAnswer
>>> query('not-a-domain', 'MX')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
[...]
dns.resolver.NXDOMAIN
Vous pouvez attraper les deux NoAnswer
et NXDOMAIN
en attrapant dns.exception.DNSException
.
Et oui, foo@bar@google.com
est une adresse syntaxiquement valide. Seule la dernière @
doit être prise en compte pour détecter où commence la partie du domaine.