如何在 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 记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 DNS 中的 MX 记录转发电子邮件

当邮件服务器不在网络主机上时发送邮件和 MX 记录

Netsuite - REST API - 如何使用基于令牌的身份验证 (TBA) 创建新条目记录 - (在 Python 中)

DNS域名解析中添加的各项解析记录

如何查看linux系统 mx记录ns记录

如何针对跨域的 PHP 会话 ID 对 Socket.IO 进行身份验证