如何使用 smtplib 在 Python 中验证电子邮件地址

Posted

技术标签:

【中文标题】如何使用 smtplib 在 Python 中验证电子邮件地址【英文标题】:How to Verify an Email Address in Python Using smtplib 【发布时间】:2014-04-09 15:23:53 【问题描述】:

我一直在尝试验证用户在我的程序中输入的电子邮件地址。我目前拥有的代码是:

server = smtplib.SMTP()
server.connect()
server.set_debuglevel(True)
try:
    server.verify(email)
except Exception:
    return False
finally:
    server.quit()

但是当我运行它时,我得到:

ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

所以我要问的是如何使用 smtp 模块验证电子邮件地址?我想检查邮箱地址是否真的存在。

【问题讨论】:

您需要详细说明“验证”的含义。您要检查地址是否格式正确或是否存在? gist.github.com/blinks/47987 【参考方案1】:

这是验证电子邮件的简单方法。这是来自this link 的最小修改代码。第一部分将检查电子邮件地址是否格式正确,第二部分将使用该地址 ping SMTP 服务器并查看它是否返回成功代码 (250)。话虽如此,这不是故障安全的——取决于它的设置方式,有时每封电子邮件都会被返回为有效的。所以你还是应该发送一封验证邮件。

email_address = 'example@example.com'

#Step 1: Check email
#Check using Regex that an email meets minimum requirements, throw an error if not
addressToVerify = email_address
match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]2,4)$', addressToVerify)

if match == None:
    print('Bad Syntax in ' + addressToVerify)
    raise ValueError('Bad Syntax')

#Step 2: Getting MX record
#Pull domain name from email address
domain_name = email_address.split('@')[1]

#get the MX record for the domain
records = dns.resolver.query(domain_name, 'MX')
mxRecord = records[0].exchange
mxRecord = str(mxRecord)

#Step 3: ping email server
#check if the email address exists

# Get local server hostname
host = socket.gethostname()

# SMTP lib setup (use debug level for full output)
server = smtplib.SMTP()
server.set_debuglevel(0)

# SMTP Conversation
server.connect(mxRecord)
server.helo(host)
server.mail('me@domain.com')
code, message = server.rcpt(str(addressToVerify))
server.quit()

# Assume 250 as Success
if code == 250:
    print('Y')
else:
    print('N')

【讨论】:

太棒了!谢谢@verybadatthis。还可以添加导入语句并调整解析器(无法使用 dns.resolver)? import re; from dns import resolver; import socket; import smtplib; 这不适用于 Gmail ID 以外的电子邮件。如何检查其他电子邮件域,如 hotmail yahoo 等【参考方案2】:

服务器名称未与端口一起正确定义。根据您拥有 SMTP 服务器的方式,您可能需要使用登录功能。

server = smtplib.SMTP(str(SERVER), int(SMTP_PORT))
server.connect()
server.set_debuglevel(True)
try:
    server.verify(email)
except Exception:
    return False
finally:
    server.quit()

【讨论】:

我们如何知道客户端或第三方电子邮件地址的 smtp 端口?【参考方案3】:

您需要在SMTP 构造中指定 smtp 主机(服务器)。这取决于电子邮件域。例如,对于 gmail 地址,您需要类似gmail-smtp-in.l.google.com

server.verify 是一个 SMTP VRFY 可能不是你想要的。大多数服务器禁用它。

您可能想查看像Real Email 这样的服务,它有python 指南。 How to Validate Email Address in python.

【讨论】:

以上是关于如何使用 smtplib 在 Python 中验证电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

python:利用smtplib模块发送邮件详解

python:利用smtplib发送邮件详解

如何使用 python smtplib 向多个收件人发送电子邮件?

Python smtplib 代理支持

Python 2.7 smtplib 如何发送带有错误 13 权限的附件被拒绝?

Python使用SMTP模块email模块发送邮件