我试图检查域名是否有使用dnspython
模块解析的MX记录。在连接到mx记录服务器时,我得到以下错误。有人能解释一下为什么我面临这个问题吗?
Traceback (most recent call last):
File "c:UsersiamfaOneDriveDesktoptestemail_mx.py", line 26, in <module>
dns.resolver.resolve("cmrit.ac.in", 'MX')
File "c:UsersiamfaOneDriveDesktoptestenv1libsite-packagesdnsresolver.py", line 1193, in resolve
return get_default_resolver().resolve(qname, rdtype, rdclass, tcp, source,
File "c:UsersiamfaOneDriveDesktoptestenv1libsite-packagesdnsresolver.py", line 1066, in resolve
timeout = self._compute_timeout(start, lifetime,
File "c:UsersiamfaOneDriveDesktoptestenv1libsite-packagesdnsresolver.py", line 879, in _compute_timeout
raise LifetimeTimeout(timeout=duration, errors=errors)
dns.resolver.LifetimeTimeout: The resolution lifetime expired after 5.001 seconds: Server 10.24.0.1 UDP port 53 answered The DNS operation timed out.; Server 198.51.100.1 UDP port 53 answered The DNS operation timed out.; Server 10.95.11.110 UDP port 53 answered The DNS operation timed out.
这是我的代码:
import dns.resolver
if dns.resolver.resolve("cmrit.ac.in", 'MX'):
print(True)
else:
print(False)
然而,它工作得很好,直到昨天,但当我试图运行相同的代码今天我面临这个问题。
如果远程DNS服务器需要很长时间才能响应,或者接受连接但根本没有响应,那么您真正能做的唯一事情就是继续前进。也许以后再试。您可以使用try
/except
捕获错误:
import dns.resolver
try:
if dns.resolver.resolve("cmrit.ac.in", 'MX'):
print(True)
else:
print(False)
except dns.resolver.LifetimeError:
print("timed out, try again later maybe?")
如果您想应用更长的超时,resolve
方法接受lifetime
关键字参数,该参数在Resolver.resolve
文档中有记录。Resolver
类(文档在同一页的顶部)也有一个timeout
参数,如果您构建自己的解析器,您可以对其进行调整。
对于产品代码,您可能应该将其他可能的错误添加到except
子句中;示例性文档精确地向您展示了resolve
可以引发哪些异常。
...
except (dns.resolver.LifetimeTimeout, dns.resolver.NXDOMAIN,
dns.resolver.YXDOMAIN, dns.resolver.NoAnswer,
dns.resolver.NoNameservers) as err:
print("halp, something went wrong:", err)
可能存在一个基异常类,所有这些都继承自它;我懒得回去看看。然后,您只需要在except
语句中列出基类。
提取实际的MX记录并显示它可能更有用,而不仅仅是打印True
,但这是另一个主题。
你的错误信息表明你能够在10.24.0.1连接到你自己的解析器,但在一般情况下,如果你的网络(防火墙等)由于某种原因阻止你访问DNS,也可能发生此错误。