我有大量的电子邮件地址需要验证。最初我用正则表达式解析它们以抛弃那些完全疯狂的东西。我留下那些看起来合理但仍然可能包含错误的东西。
我想找到哪些地址有效域名,所以给我me@abcxyz.com我想知道是否有可能发送电子邮件到abcxyz.com。
我想测试它是否与有效的A或MX记录相对应 - 是否有一种简单的方法只使用Python标准库?我宁愿不为我的项目添加额外的依赖项,只是为了支持这个功能。
答案 0 :(得分:16)
标准库中没有DNS接口,因此您必须自己滚动或使用第三方库。
这不是一个快速变化的概念,因此外部库是稳定且经过充分测试的。
我使用的成功与您的问题相同的任务是PyDNS。
我的代码的粗略草图是这样的:
import DNS, smtplib
DNS.DiscoverNameServers()
mx_hosts = DNS.mxlookup(hostname)
# Just doing the mxlookup might be enough for you,
# but do something like this to test for SMTP server
for mx in mx_hosts:
smtp = smtplib.SMTP()
#.. if this doesn't raise an exception it is a valid MX host...
try:
smtp.connect(mx[1])
except smtplib.SMTPConnectError:
continue # try the next MX server in list
另一个可能比PyDNS更好/更快的库是dnsmodule,尽管它看起来自2002年以来没有任何活动,与2008年8月的PyDNS上次更新相比。
编辑:我还想指出,使用正则表达式无法轻松解析电子邮件地址。最好在标准库email.utils模块中使用parseaddr()函数(例如,参见我的answer to this question)。
答案 1 :(得分:1)
在标准库中执行此操作的简便方法是使用validate_email package:
strings.xml
为了更快地处理大量电子邮件地址(例如列表from validate_email import validate_email
is_valid = validate_email('example@example.com', check_mx=True)
),您可以隐藏域名,只有在域名不存在时才执行check_mx。例如:
emails
答案 2 :(得分:0)
一个简单有效的方法是使用名为 validate_email 的 python 包。 这个包提供了这两种设施。查看这篇文章,它将帮助您check if your email actually exists or not。