Стандартная библиотека Python поставляется с функцией разбора электронной почты: email.utils.parseaddr()
.
Возвращает двоичный код, содержащий действительное имя и фактические адреса e-mail:
>>> from email.utils import parseaddr
>>> parseaddr('foo@example.com')
('', 'foo@example.com')
>>> parseaddr('Full Name ')
('Full Name', 'full@example.com')
>>> parseaddr('"Full Name with quotes and " ')
('Full Name with quotes and ', 'weird@example.com')
И если синтаксический анализ не увенчался успехом, он возвращает два кортежа пустых строк:
>>> parseaddr('[invalid!email]')
('', '')
Проблема с этим парсером заключается в том, что это принятие чего-либо, что считается действительным адресом электронной почты для RFC-822 и друзей, включая многие вещи, которые явно не адресуются в широком Интернете:
>>> parseaddr('invalid@example,com') # notice the comma
('', 'invalid@example')
>>> parseaddr('invalid-email')
('', 'invalid-email')
Итак, как @TokenMacGuy положил его , единственный окончательный способ проверки адреса электронной почты - отправить электронное письмо на ожидаемый адрес и дождаться, когда пользователь будет воздействовать на информацию внутри сообщения.
Однако вы можете захотеть проверьте, по крайней мере, наличие @ -знака на втором элементе кортежа, поскольку @bvukelic предлагает:
>>> '@' in parseaddr("invalid-email")[1]
False
Если вы хотите сделать еще один шаг, вы можете установить dnspython и разрешить почтовые серверы для домена электронной почты (часть после «@»), только пытается отправить электронное письмо, если есть настоящие MX
серверы:
>>> 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 "", line 1, in
[...]
dns.resolver.NoAnswer
>>> query('not-a-domain', 'MX')
Traceback (most recent call last):
File "", line 1, in
[...]
dns.resolver.NXDOMAIN
Вы можете поймать оба NoAnswer
и NXDOMAIN
, поймав dns.exception.DNSException
.
И Да, foo@bar@google.com
является синтаксически корректным адресом. Только последний @
следует рассмотреть для обнаружения, где начинается доменная часть.