Python检查有效的电子邮件地址?

有没有一种好的方法来检查表单输入使用正则表达式,以确保它是一个适当的风格电子邮件地址? 从昨晚开始搜索,每个已经回答了人们关于这个主题的问题的人,如果它是一个subdomained的电子邮件地址,似乎也有问题。


无关紧要。 即使您可以验证电子邮件地址在语法上是否有效,您仍然需要检查它是否错误输入,并确实发送给您认为它的人。 要做到这一点的唯一方法是给他们发送一封电子邮件,让他们点击链接进行验证。

因此,最基本的检查(例如,他们没有意外进入他们的街道地址)通常就足够了。 就像这样:它只有一个@符号,并且至少有一个符号.@之后的部分:

[^@]+@[^@]+.[^@]+

你可能也想禁止空白 - 有可能是有效的电子邮件地址与他们的空白,但我从来没有见过一个,所以这是一个用户错误的可能性在你身边。

如果你想完整的检查,看看这个问题。


更新:这里是你可以使用任何这样的正则表达式:

import re

if not re.match(r"... regex here ...", email):
  # whatever

注意字符串前面的r ; 这样,你不需要两次逃避事情。

如果你有大量的正则表达式要检查,首先编译正则表达式可能会更快:

import re

EMAIL_REGEX = re.compile(r"... regex here ...")

if not EMAIL_REGEX.match(email):
  # whatever

Python标准库附带一个电子邮件解析函数: email.utils.parseaddr()

它返回一个包含真实姓名和电子邮件实际地址部分的二元组:

>>> 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')

如果解析不成功,它将返回一个空字符串的二元组:

>>> parseaddr('[invalid!email]')
('', '')

这个解析器的一个问题是,它接受任何被认为是RFC-822和朋友的有效电子邮件地址的东西,其中包括许多显然无法在宽Internet上寻址的东西:

>>> parseaddr('invalid@example,com') # notice the comma
('', 'invalid@example')

>>> parseaddr('invalid-email')
('', 'invalid-email')

因此,正如@TokenMacGuy所说的,检查电子邮件地址的唯一明确方法是发送电子邮件到预期的地址,并等待用户对邮件内的信息采取行动。

但是,您可能希望至少检查第二个元组元素上是否存在@ -sign,如@ bvukelic所示:

>>> '@' in parseaddr("invalid-email")[1]
False

如果你想更进一步,你可以安装dnspython项目(或者Python 3的这个项目)并解析电子邮件域的邮件服务器('@'之后的部分),只尝试发送一个e邮件,如果有实际的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 "<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

你能赶上两个NoAnswerNXDOMAIN通过捕获dns.exception.DNSException

是的, foo@bar@google.com是一个语法上有效的地址。 只有最后一个@应该被考虑用于检测域部分的起始位置。


自定义正则表达式答案的混乱之中,我还没有看到答案,但是......

Python有一个名为validate_email的模块,它有3个级别的电子邮件验证,包括询问有效的SMTP服务器,如果该电子邮件地址是有效的(不发送电子邮件)。

检查电子邮件字符串有效格式:

from validate_email import validate_email
is_valid = validate_email('example@example.com')

检查主机是否有SMTP服务器:

is_valid = validate_email('example@example.com',check_mx=True)

检查主机是否有SMTP服务器并且电子邮件确实存在:

is_valid = validate_email('example@example.com',verify=True)

对于那些对肮脏细节感兴趣的人,validate_email.py(source)旨在忠实于RFC 2822。

我们所做的只是将输入字符串与一个巨大的正则表达式进行比较。 但是通过将它与RFC定义的“标记”组合起来,构建该正则表达式并确保其正确性变得更容易。 每个令牌都在随附的单元测试文件中进行测试。


用pip安装

pip install validate_email

你需要pyDNS模块来检查SMTP服务器

pip install pyDNS
链接地址: http://www.djcxy.com/p/92933.html

上一篇: Python check for valid email address?

下一篇: How do I send an email to an address with a dash in it?