为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

ABOUTYOU 2019-07-17 14:33:41

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

是否有一个好的方法来检查一个表单输入使用regex,以确保它是一个适当的样式电子邮件地址?从昨晚开始搜索,所有回答过这个话题的问题的人,如果它是一个附属邮件地址的话,似乎也会有问题。



查看完整描述

3 回答

?
慕斯卡3215842

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

因此,最基本的检查(例如,他们没有意外地输入他们的街道地址)通常就足够了。就像:它确实有一个@签个字,至少有一个.在后面的部分@:

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

你可能也想不允许空白-可能有效的电子邮件地址,其中有空白,但我从来没有见过,所以这是一个用户错误的可能性在你这一边。

如果你想要一张完整的支票,请看一看这个问题.


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

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

PythonJava3.4re.fullmatchre.match.

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

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

import re

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

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


查看完整回答
反对 回复 2019-07-17
?
白衣非少年

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

如果您想更进一步,可以安装强的松项目并解析电子邮件域的邮件服务器(“@”之后的部分),只有在实际情况下才尝试发送电子邮件。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

你可以同时抓到NoAnswerNXDOMAIN通过捕捉dns.exception.DNSException.

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


查看完整回答
反对 回复 2019-07-17
?
12345678_0001

我还没有在这里看到这个答案,但是.

有一个名为python的库验证电子邮件它有三个级别的电子邮件验证,包括询问有效的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)

对于那些对脏细节感兴趣的人,请验证_email.py(来源)的目标是忠实于RFC 2822.

我们真正要做的就是将输入字符串与一个巨大的正则表达式进行比较。但是,通过从RFC定义的“令牌”组装regexp并确保它的正确性,构建这个regexp要容易得多。这些令牌中的每一个都在附带的单元测试文件中进行测试。


用pip安装

pip install validate_email

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

pip install pyDNS

或来自Ubuntu

apt-get python3-dns


查看完整回答
反对 回复 2019-07-17

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信