我有大量电子邮件地址要验证。最初,我用regexp解析它们,以剔除那些完全疯狂的。我只剩下那些看起来明智但仍然可能包含错误的。
我想找出哪些地址有有效的域,所以给我@abcxyz.com,我想知道是否有可能向abcxyz.com发送电子邮件。
我想测试一下它是否对应于一个有效的A或MX记录——是否有一种简单的方法只使用Python标准库来完成它?我不想在我的项目中添加额外的依赖项来支持这个特性。

最佳答案

标准库中没有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,尽管与2008年8月的pydns上次更新相比,它自2002年以来似乎没有任何活动。
编辑:我还想指出,用regexp无法轻松解析电子邮件地址。最好在标准库email.utils模块中使用parseaddr()函数(例如,请参见myanswer to this question)。

10-07 20:30