如何在 python 中验证域的 MX 记录?
Posted
技术标签:
【中文标题】如何在 python 中验证域的 MX 记录?【英文标题】:How do I validate the MX record for a domain in python? 【发布时间】:2010-10-08 05:58:51 【问题描述】:我有大量的电子邮件地址要验证。最初我用一个正则表达式解析它们以抛出完全疯狂的那些。我留下了那些看起来很合理但仍然可能包含错误的东西。
我想查找哪些地址具有有效域,所以给我@abcxyz.com 我想知道是否可以向 abcxyz.com 发送电子邮件。
我想测试它是否对应于有效的 A 或 MX 记录 - 有没有一种简单的方法可以只使用 Python 标准库来做到这一点?我宁愿不为我的项目添加额外的依赖项来支持此功能。
【问题讨论】:
严格来说,即使没有 MX 记录,域也可以接收邮件。 rfc2811,第 5 节描述了对 A 记录的回退。我会考虑玩 smtp 会话的部分内容(直到 RCPT TO:) @hop:我不知道回退,谢谢参考。我认为您的意思是 RFC 2821? 无论如何,经过思考,我得出的结论是,最好不要进行先发制人的验证,而只做时事通讯(我认为这是拥有列表的原因)并收集之后反弹。 RFC 2821 已过时,请参阅 RFC 5321。回退现在不仅适用于 A 记录,也适用于 AAAA 记录。 使用正则表达式解析电子邮件地址是不现实的,并且会导致许多误报。见***.com/questions/201323/201378 【参考方案1】:一种简单有效的方法是使用名为 validate_email 的 python 包。 该软件包提供了这两种功能。查看这篇文章,它将帮助您check if your email actually exists or not。
【讨论】:
【参考方案2】:在标准库中没有做到这一点的简单方法是使用validate_email package:
from validate_email import validate_email
is_valid = validate_email('example@example.com', check_mx=True)
为了更快地处理大量电子邮件地址(例如列表 emails
,您可以隐藏域,并且仅在域不存在时才执行 check_mx。类似:
emails = ["email@example.com", "email@bad_domain", "email2@example.com", ...]
verified_domains = set()
for email in emails:
domain = email.split("@")[-1]
domain_verified = domain in verified_domains
is_valid = validate_email(email, check_mx=not domain_verified)
if is_valid:
verified_domains.add(domain)
【讨论】:
如果它确实是一封无效的电子邮件,这个包非常有用。如果它是真实的,则需要永远做出响应。【参考方案3】:标准库中没有 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 年以来没有任何活动。
编辑:我还想指出,使用正则表达式无法轻松解析电子邮件地址。您最好使用标准库 email.utils 模块中的 parseaddr() 函数(例如,请参阅我的answer to this question)。
【讨论】:
以上是关于如何在 python 中验证域的 MX 记录?的主要内容,如果未能解决你的问题,请参考以下文章
Netsuite - REST API - 如何使用基于令牌的身份验证 (TBA) 创建新条目记录 - (在 Python 中)