如何检查电子邮件地址是否有效?[重复]

2024-12-30 08:41:00
admin
原创
34
摘要:问题描述:有没有一种好的方法可以使用正则表达式检查表单输入,以确保它是正确样式的电子邮件地址?从昨晚开始搜索,每个回答过人们关于这个主题的问题的人似乎也遇到了问题,如果它是子域名电子邮件地址的话。解决方案 1:毫无意义。即使您可以验证电子邮件地址在语法上有效,您仍然需要检查它是否输入错误,以及它是否确实发送给...

问题描述:

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


解决方案 1:

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

因此,通常只需进行最基本的检查(例如,他们没有意外输入街道地址)就足够了。例如:它只有一个@标志,并且至少.在以下部分有一个标志@

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

您可能还希望禁止使用空格——可能存在包含空格的有效电子邮件地址,但我从未见过,因此这是用户错误的可能性在您这边。

如果您想要进行全面检查,请查看这个问题。


更新:以下是使用此类正则表达式的方法:

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 服务器来验证地址是否存在。但这仍然不能保证它属于正确的人。

解决方案 2:

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

通过捕获,您可以捕获NoAnswer和。NXDOMAIN`dns.exception.DNSException`

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

解决方案 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', \n    check_regex=True, check_mx=True, \n    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。

我们实际上所做的只是将输入字符串与一个巨大的正则表达式进行比较。但是,通过从 RFC 定义的“标记”组装它,可以更轻松地构建该正则表达式并确保其正确性。每个标记都在随附的单元测试文件中进行了测试。


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

pip install pyDNS

或者从 Ubuntu

apt-get install python3-dns

解决方案 4:

电子邮件地址并不像看上去那么简单!例如,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"

解决方案 5:

我找到了一种非常好的(经过测试的)方法来检查电子邮件地址是否有效。我将代码粘贴在这里:

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

解决方案 6:

我在这里看到了很多复杂的答案。其中一些答案无法识别简单、真实的电子邮件地址,或者存在误报。下面是测试字符串是否为有效电子邮件的最简单方法。它针对 2 个和 3 个字母的 TLD 进行测试。现在从技术上讲,您可以拥有更大的 TLD,您可能希望将 3 增加到 4、5 甚至 10。

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

解决方案 7:

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

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

解决方案 8:

电子邮件地址非常复杂。以下是匹配所有 RFC822 有效地址的示例正则表达式:
http ://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

您会注意到它可能比程序的其余部分更长。甚至有整个 Perl 模块用于验证电子邮件地址。因此,您可能无法获得 100% 完美且可读的正则表达式。这是一个示例递归下降解析器:http:
//cpansearch.perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm

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

解决方案 9:

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

解决方案 10:

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

参见validate_email 文档。

解决方案 11:

如果您想从长字符串或文件中取出邮件,请尝试这个。

([^@|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

另外,请注意这可能不是正确的答案...但我已将其发布在这里以帮助像我一样有特定要求的人

解决方案 12:

使用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")

解决方案 13:

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

解决方案 14:

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

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

解决方案 15:

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

import re 
a=open("aa.txt","r")
#c=a.readlines() 
b=a.read()
c=b.split("
")
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..

解决方案 16:

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

解决方案 17:

电子邮件验证

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

解决方案 18:

区分真实、有效电子邮件地址和无效电子邮件地址的唯一真正准确方法是向其发送邮件。 什么算作电子邮件令人惊讶地复杂("John Doe" <john.doe@example.com>"实际上是一个有效的电子邮件地址),并且您很可能希望该电子邮件地址稍后真正向其发送邮件。 在通过一些基本的健全性检查后(例如在 Thomas 的回答中,在 之后@至少有一个),您可能应该只向该地址发送电子邮件验证信,然后等待用户点击邮件中嵌入的链接以确认电子邮件有效。.`@`

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   997  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   34  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   40  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   39  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   71  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用