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
你能赶上两个NoAnswer
和NXDOMAIN
通过捕获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?