【问题标题】:Python: Validate if MX Record(s) of Domain Name have active inbox. Check mx records, validate emailPython:验证域名的 MX 记录是否有活动的收件箱。检查 mx 记录,验证电子邮件
【发布时间】:2018-04-26 00:13:12
【问题描述】:

我需要验证是否存在与在域名的 DNS 区域/记录中找到的 MX 记录相关的收件箱。在我使用dns.resolver.query(domain, 'MX') 检索所有 MX 后,我根据优先级进行排序,并使用以下函数循环并一一测试它们是否处于活动状态。获得所有 MX 后,我将它们一一传递给 check_mailbox()mx_record 是具有 MX 值 exmp 的变量。 mx.something.com。第二个参数mail 变量是我正在测试的实际电子邮件。

我目前的功能:

def check_mailbox(mx_record, mail):
    code = ""

    try:
        server = smtplib.SMTP(timeout=300)
        server.set_debuglevel(0)  # 1 for all data show
        server.connect(mx_record['mx'])  # Starting the communication 
        server.helo(server.local_hostname)
        server.mail("from@address.sample")
        code, message = server.rcpt(str(mail))  # Test the mailbox
        server.quit()
    except Exception as e:
        print(str(e))
        code = "error"
    finally:
        if code == 250 or code == 251:
            return {'code': code, 'message': message}
        else:
            return False

正如我所说,在我当前的功能中,我单独测试了所有 MX。当然,根据网络,它可能会有一些延迟。

  • 我想知道是否有更快的方法可以执行此检查?
  • 还有其他(完全不同的)方法可以执行此验证吗?
  • 如果我每次检查后不执行 server.quit() 会更好
    但是打开它,保持打开状态,然后在所有检查完成后关闭它?

提前谢谢你。


您需要的任何其他信息都可以问我。在我进入这个阶段之前,我有一个这样的逻辑跟进: run() -> check(email) -> validator() -> checkEmailStructure() -> checkDomainAlive() -> checkHasMXs() -> 循环到 oder -> 使用 check_mailbox() 循环

这样我可以确定结构是否错误,结束验证。如果,域是死路验证。并且仅当结构 OK、域 OK 并且具有 MX 时才循环检查。同样在最后一个循环中,如果其中一个 MX 返回 250 或 251,我将停止测试,因为至少有一个有效!我按优先级排序。

欢迎提出任何建议!这里需要优化和保证目标。

【问题讨论】:

  • 为邮箱测试 所有 个 MX 服务器有什么意义?它们都应该代表 一个 逻辑邮件服务器,并且都应该具有相同的邮箱集。因此,只有在第一个连接失败时,您才应该继续使用辅助服务器。
  • 我忘了说。如果一个返回 250 或 251,我会停止 :) 我刚刚更新。订购后我还会检查优先顺序,所以直到这里都很好

标签: python email networking dns mx-record


【解决方案1】:

我想知道是否有更快的方法可以执行此检查?

某些邮件服务器允许您在等待每个响应之前一次发送所有命令(helo、mail、rect、quit)。然而,只有部分邮件服务器支持这一点,而且它通常是快速的邮件服务器(如 Google),因此并没有太大的好处。

还有其他(完全不同的)方法可以执行此验证吗?

据我所知没有。一些邮件服务器有vrfy 命令,但大多数没有。

如果我在每次检查后不执行 server.quit() 会更好吗 但是打开它,保持它打开并在所有检查完成后关闭它?

是的,这会让事情变得更快。您可能需要在检查之间使用RSET 命令,但不确定。

同样值得注意的是,即使rcpt 命令成功,仍然不能保证电子邮件地址有效。例如,Yahoo/Verizon/AOL 在 data 命令之后才会给出错误。

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 2010-12-12
    • 2010-10-08
    • 2015-05-16
    • 2014-11-26
    • 2016-11-18
    • 2018-06-02
    • 2019-03-12
    • 2011-12-08
    相关资源
    最近更新 更多