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

14 投票
3 回答
33865 浏览
提问于 2025-04-17 21:10

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

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模块来验证电子邮件地址?我想检查这个电子邮件地址是否真的存在。

3 个回答

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

这里有一个简单的方法来验证电子邮件。这个代码稍微修改了一下,来源于这个链接。第一部分会检查电子邮件地址的格式是否正确,第二部分会向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')

撰写回答