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

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

405700 次浏览

这通常是使用正则表达式解决的。然而,有许多不同的解决方案。这取决于您需要的严格程度,以及您是否有自定义的验证要求,或者是否接受任何有效的电子邮件地址。

请参阅本页以获取参考:http://www.regular-expressions.info/email.html

电子邮件地址非常复杂。下面是一个匹配每个rfc822有效地址的示例正则表达式: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html < / p >

你会注意到它可能比程序的其他部分要长。甚至还有用于验证电子邮件地址的Perl完整模块。所以你可能不会得到任何东西,100%完美的正则表达式,同时也可读。下面是一个递归下降解析器示例: http://cpansearch.perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm < / p >

但是您需要决定是需要完美的解析还是简单的代码。

没有任何意义。即使您可以验证电子邮件地址在语法上是有效的,您仍然需要检查它是否没有输入错误,并且它实际上是发送给您认为的那个人的。唯一的方法就是给他们发一封电子邮件,让他们点击一个链接来验证。

因此,最基本的检查(例如,他们没有不小心输入他们的街道地址)通常就足够了。类似于:它只有一个@符号,并且在@之后的部分中至少有一个.:

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

您可能还想禁止使用空格——可能有一些有效的电子邮件地址中有空格,但我从未见过,所以这是用户错误的可能性在您这边。

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


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

import re


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

Python≥3.4有re.fullmatch,比re.match更好。

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

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

import re


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


if not EMAIL_REGEX.match(email):
# whatever

另一种选择是使用validate_email包,它实际联系SMTP服务器以验证地址是否存在。不过,这仍然不能保证它属于正确的人。

唯一真正准确地区分真实有效的电子邮件地址和无效的电子邮件地址的方法是向它发送邮件。电子邮件的定义令人惊讶地复杂("John Doe" <john.doe@example.com>"实际上是一个有效的电子邮件地址),你很可能希望电子邮件地址以后实际发送邮件给它。在它通过了一些基本的完整性检查之后(比如在Thomas的回答中,有一个@,并且在@之后至少有一个.),你应该只向该地址发送一封电子邮件验证信,并等待用户按照消息中嵌入的链接来确认电子邮件是有效的。

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

我有一些运气与lepl包(http://www.acooke.org/lepl/)。它可以验证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"

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和朋友的有效电子邮件地址的东西,包括许多在广泛的互联网上显然无法寻址的东西:

>>> 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 "<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

你可以通过捕获dns.exception.DNSException来捕获NoAnswerNXDOMAIN

和Yes, foo@bar@google.com是一个语法有效的地址。只有最后的@应该被考虑用于检测域部分从哪里开始。

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

如果你想从一个长字符串或文件中取出邮件,那么试试这个。

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

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

工作的例子:

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

这将从该字符串中取出example@me.com

另外,注意这可能不是正确答案……但我把它贴在这里是为了帮助像我这样有特殊要求的人

"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"

我还没有在这里的一堆自定义正则表达式答案中看到答案,但是……

存在一个名为py3-validate-email validate_email的python库,它有3个级别的电子邮件验证,包括询问有效的SMTP服务器电子邮件地址是否有效(不发送电子邮件)。

安装

python -m pip install py3-validate-email

基本用法:

from validate_email import validate_email
is_valid = validate_email(email_address='example@example.com', \
check_regex=True, check_mx=True, \
from_address='my@from.addr.ess', helo_host='my.host.name', \
smtp_timeout=10, dns_timeout=10, use_blacklist=True)

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

我们所做的只是将输入字符串与1进行比较 庞大的正则表达式。但是构建那个regexp 通过组装它,可以更容易地确保其正确性 从“令牌”;由RFC定义。每一个符号都是 在附带的单元测试文件中测试

you 五月需要pyDNS模块来检查SMTP服务器

pip install pyDNS

或者来自Ubuntu

apt-get install python3-dns

电子邮件验证

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

我发现了一个很好的(经过测试的)方法来检查有效的电子邮件地址。我把代码粘贴在这里:

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

我在这里看到了很多复杂的答案。他们中的一些人,不知道简单,真实的电子邮件地址,或有假阳性。下面是测试字符串是否为有效电子邮件的最简单方法。它测试2和3个字母的TLD。现在技术上你可以有更大的,你可能希望增加3到4,5甚至10。

import re
def valid_email(email):
return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))
< p >发现电子邮箱: finding 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..

检查电子邮件使用email_validator

from email_validator import validate_email, EmailNotValidError


def check_email(email):
try:
v = validate_email(email)  # validate and get info
email = v["email"]  # replace with normalized form
print("True")
except EmailNotValidError as e:
# email is not valid, exception message is human-readable
print(str(e))


check_email("test@gmailcom")
from validate_email import validate_email
is_valid = validate_email('example@example.com',verify=True)
print(bool(is_valid))

看到validate_email文档

发现这是一个实用的实现:

^[^@\s]+@[^@\s]+\.[^@\s]+$

在电子邮件输入上使用此过滤器掩码: emailMask: /[\w.\-@'"!#$%&'*+/=?^_{|} ~) /我< / p >