我一直在尝试验证用户在我的程序中输入的电子邮件地址。我目前的代码是:
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模块验证电子邮件地址?我想检查电子邮件地址是否确实存在。
答案 0 :(得分:8)
这是验证电子邮件的简单方法。这是来自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')
答案 1 :(得分:1)
未与端口一起正确定义服务器名称。根据您拥有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()
答案 2 :(得分:0)
您需要在SMTP
结构中指定smtp主机(服务器)。这取决于电子邮件域。例如,对于Gmail地址,您将需要使用gmail-smtp-in.l.google.com
之类的东西。
作为SMTP server.verify
的{{1}}可能不是您想要的。大多数服务器都禁用它。
您可能希望查看类似Real Email的服务,该服务具有python指南。 How to Validate Email Address in python。