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

14

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

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模块验证电子邮件地址,以确定该邮件地址是否真实存在。


4
你需要详细解释“verify”的含义。你是想检查地址是否格式正确,还是要确认该地址是否存在? - loopbackbee
https://gist.github.com/blinks/47987 - Omid Raha
3个回答

17

这是一种验证电子邮件的简单方法。这是从此链接中稍作修改的代码。第一部分将检查电子邮件地址是否格式正确,第二部分将使用该地址对SMTP服务器进行ping操作,并查看是否返回成功代码(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')

2
太棒了!谢谢@verybadatthis。还可以添加导入语句并调整解析器(无法使用dns.resolver)吗?import re; from dns import resolver; import socket; import smtplib; - propjk007
6
除了Gmail账户,这种方法不适用于其他电子邮件。如何检查其他电子邮件域名,例如hotmail和yahoo等? - Akhil Mathew

0

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

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

您可能需要查看像Real Email这样的服务,该服务提供了Python指南。如何在Python中验证电子邮件地址


0

服务器名称和端口未正确定义。根据您的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端口? - Tejas Tank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接