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

Python 如何检查有效的电子邮件地址?,python,regex,email-validation,email-address,Python,Regex,Email Validation,Email Address,有没有一种好方法可以使用正则表达式检查表单输入,以确保它是一个正确的电子邮件地址?从昨晚开始一直在搜索,每个回答了人们关于这个主题的问题的人似乎都有问题,如果它是一个子域电子邮件地址。这通常是使用正则表达式解决的。然而,有许多不同的解决方案。这取决于您需要的严格程度,以及您是否有验证的自定义要求,或者您是否会接受任何有效的电子邮件地址 请参阅本页以获取参考:电子邮件地址极其复杂。下面是一个与每个RFC822有效地址匹配的示例正则表达式: 您会注意到它可能比程序的其余部分要长。甚至还有整个Per

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

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


请参阅本页以获取参考:

电子邮件地址极其复杂。下面是一个与每个RFC822有效地址匹配的示例正则表达式:

您会注意到它可能比程序的其余部分要长。甚至还有整个Perl模块用于验证电子邮件地址。因此,你可能不会得到任何100%完美的正则表达式,同时也具有可读性。下面是一个递归下降解析器示例:


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

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

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

[^@]+@[^@]+\.[^@]+
您可能还想禁止使用空格--可能存在包含空格的有效电子邮件地址,但我从未见过,因此这可能是用户错误

如果你想要全额支票,请看一下


更新:以下是如何使用任何此类正则表达式:

import re

if not re.match(r"... regex here ...", email):
  # whatever
蟒蛇≥3.4具有比重新匹配更可取的选项

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

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

import re

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

if not EMAIL_REGEX.match(email):
  # whatever


另一个选项是使用该包,该包实际上与SMTP服务器联系以验证该地址是否存在。然而,这仍然不能保证它属于正确的人。

区分真实、有效和无效电子邮件地址的唯一真正准确的方法是向它发送邮件。作为电子邮件的内容令人惊讶地复杂(
“John Doe”
实际上是一个有效的电子邮件地址),而且您很可能希望该电子邮件地址稍后实际向其发送邮件。在它通过一些基本的健全性检查后(例如在Thomas的回答中,在
@
之后有一个
@
),您可能只需向该地址发送一封电子邮件验证信,然后等待用户按照邮件中嵌入的链接确认电子邮件是否有效。

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

我在lepl软件包()方面有点运气。它可以验证RFC 3696中所示的电子邮件地址:

找到一些旧代码:

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

Python标准库附带一个电子邮件解析函数:

它返回一个两元组,其中包含电子邮件的真实名称和实际地址部分:

>>> 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')
此解析器的一个问题是,它接受任何被视为RFC-822和朋友的有效电子邮件地址的内容,包括许多在互联网上显然无法寻址的内容:

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

>>> parseaddr('invalid-email')
('', 'invalid-email')
因此,正如@TokenMacGuy所说,检查电子邮件地址的唯一确定方法是向预期地址发送电子邮件,然后等待用户根据消息中的信息采取行动

但是,您可能希望至少检查第二个元组元素上是否存在@符号,正如@bvukelic所建议的:

>>> '@' in parseaddr("invalid-email")[1]
False
如果您想更进一步,可以安装项目并解析电子邮件域的邮件服务器(在“@”之后的部分),仅当存在实际的
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.resolver导入查询的
>
>>>域foo@bar@google.com.rsplit('@',1)[-1]
>>>bool(查询(域,'MX'))
真的
>>>查询('example.com','MX')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
[...]
dns.resolver.NoAnswer
>>>查询('not-a-domain','MX')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
[...]
dns.resolver.NXDOMAIN
您可以通过捕获
dns.exception.DNSException
来捕获
NoAnswer
NXDOMAIN


是的,
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}$"
存在一个名为的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()的目标是忠实于

我们真正要做的就是将输入字符串与1进行比较 巨大的正则表达式。但是构建这个正则表达式 安瑟林
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)
pip install pyDNS
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)
import re
def valid_email(email):
  return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))
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..
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))
[^@\s]+@[^@\s]+\.[^@\s]+