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

有一个好的方法来检查表单input使用正则expression式,以确保它是一个适当的样式电子邮件地址? 从昨天开始search,每个回答了人们关于这个话题的问题,如果它是一个子地址的电子邮件地址,似乎也有问题。

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

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

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

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

如果你想全面检查,看看这个问题 。


更新:以下是如何使用任何这样的正则expression式:

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

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

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

 import re EMAIL_REGEX = re.compile(r"... regex here ...") if not EMAIL_REGEX.match(email): # whatever 

Python标准库附带一个电子邮件parsing函数: 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') 

如果parsing不成功,则返回空string的二元组:

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

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

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

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

但是,您可能希望至less检查第二个元组元素上是否存在@ -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 ,可以捕获NoAnswerNXDOMAIN

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

电子邮件地址并不像看起来那么简单! 例如,Bob_O'Reilly+tag@example.com是一个有效的电子邮件地址。

我已经与lepl软件包( http://www.acooke.org/lepl/ )有一些运气。 它可以validation电子邮件地址,如RFC 3696所示: http : //www.faqs.org/rfcs/rfc3696.html

发现一些旧的代码:

 import lepl.apps.rfc3696 email_validator = lepl.apps.rfc3696.Email() if not email_validator("email@example.com"): print "Invalid email" 

我还没有看到自定义正则expression式的答案已经在这里的答案,但…

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

检查电子邮件string是否有效

 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 。

我们所做的只是将inputstring与一个巨大的正则expression式进行比较。 但是通过将它从RFC定义的“标记”中组装起来,构build该正则expression式并确保其正确性变得更容易。 每个令牌都在随附的unit testing文件中进行testing。


用pip安装

 pip install validate_email 

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

 pip install pyDNS 

这通常使用正则expression式来解决。 然而,解决scheme有很多种。 取决于你需要多严格,如果你有自定义的validation要求,或者接受任何有效的电子邮件地址。

请参阅此页面以供参考: http : //www.regular-expressions.info/email.html

我在这里看到很多复杂的答案。 其中有些人不懂得简单,真实的电子邮件地址,或者有误报。 下面是testing这个string是一个有效的电子邮件的最简单的方法。 它针对2个和3个字母的TLD进行testing。 现在你在技术上可以有更大的,你可能希望增加3至4,5甚至10。

 import re def valid_email(email): return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[az]{2,3}$", email)) 

电子邮件地址非常复杂。 这里有一个示例正则expression式,它将匹配每个RFC822有效地址: http : //www.ex-parrot.com/pdw/Mail-RFC822-Address.html

你会注意到它可能比你的其他程序更长。 甚至还有用于validation电子邮件地址的Perl模块。 所以你可能不会得到任何100%完美的正则expression式,同时也是可读的。 下面是recursion下降parsing器的示例: http : //cpansearch.perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm

但是您需要决定是否需要完美的parsing或简单的代码。

我发现一个很好的(和testing)的方式来检查有效的电子邮件地址。 我在这里粘贴我的代码:

 # here i import the module that implements regular expressions import re # here is my function to check for valid email address def test_email(your_pattern): pattern = re.compile(your_pattern) # here is an example list of email to check it at the end emails = ["john@example.com", "python-list@python.org", "wha.t.`1an?ug{}ly@email.com"] for email in emails: if not re.match(pattern, email): print "You failed to match %s" % (email) elif not your_pattern: print "Forgot to enter a pattern!" else: print "Pass" # my pattern that is passed as argument in my function is here! pattern = r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?" # here i test my function passing my pattern test_email(pattern) 
 import re def email(): email = raw_input("enter the mail address::") match = re.search(r'[\w.-]+@[\w.-]+.\w+', email) if match: print "valid email :::", match.group() else: print "not valid:::" email() 

如果你想从长string或文件中取出邮件然后试试这个。

 ([^@|\s]+@[^@]+\.[^@|\s]+) 

请注意,当您的电子邮件地址前后有空格时,这将起作用。 如果你没有空间或有一些特殊的字符,那么你可以尝试修改它。

工作示例:

 string="Hello ABCD, here is my mail id example@me.com " res = re.search("([^@|\s]+@[^@]+\.[^@|\s]+)",string,re.I) res.group(1) 

这将从这个string中取出example@me.com。

此外,请注意这可能不是正确的答案..但我已经在这里贴出来帮助像我这样的具体要求的人

上面提到的parseaddr会忽略尾部的@。

 from email.utils import parseaddr parseaddr('aaa@bbb@ccc.com') ('', 'aaa@bbb') 

大概提取地址,并与原来的比较?

有没有人试过validate.email?

查找电子邮件ID: 找到IP截图

 import re a=open("aa.txt","r") #c=a.readlines() b=a.read() c=b.split("\n") print(c) for d in c: obj=re.search(r'[\w.]+\@[\w.]+',d) if obj: print(obj.group()) #for more calcification click on image above.. 
 "^[\w\.\+\-]+\@[\w]+\.[az]{2,3}$" 

电子邮件validation

 import re def validate(email): match=re.search(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9.]*\.*[com|org|edu]{3}$)",email) if match: return 'Valid email.' else: return 'Invalid email.' 

唯一真正准确的区分真正有效的电子邮件地址和无效电子邮件地址的方法是发送邮件给它 。 什么是电子邮件令人惊讶地令人惊讶( "John Doe" <john.doe@example.com>"实际上是一个有效的电子邮件地址),你很可能希望电子邮件地址实际发送邮件给它。一些基本的理智检查(例如在托马斯的回答中,在@之后有一个@和至less一个),你可能只需要发送一封电子邮件validation信到这个地址,然后等待用户按照信息中embedded的链接确认电子邮件是有效的。