Faizan
Faizan

Reputation: 31

Why does dnspython module give LifetimeTimeout error?

I am trying to check if a domain name has MX records resolved using dnspython module. I am getting the following error while connecting to the mx record server. Can anyone explain why I am facing this issue?

Traceback (most recent call last):
  File "c:\Users\iamfa\OneDrive\Desktop\test\email_mx.py", line 26, in <module>
    dns.resolver.resolve("cmrit.ac.in", 'MX')
  File "c:\Users\iamfa\OneDrive\Desktop\test\env1\lib\site-packages\dns\resolver.py", line 1193, in resolve
    return get_default_resolver().resolve(qname, rdtype, rdclass, tcp, source,
  File "c:\Users\iamfa\OneDrive\Desktop\test\env1\lib\site-packages\dns\resolver.py", line 1066, in resolve
    timeout = self._compute_timeout(start, lifetime,
  File "c:\Users\iamfa\OneDrive\Desktop\test\env1\lib\site-packages\dns\resolver.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.

This is my code:

 import dns.resolver
 if dns.resolver.resolve("cmrit.ac.in", 'MX'):
    print(True)
 else:
    print(False)

However it was working fine till yesterday but when I try to run the same code today I am facing this issue.

Upvotes: 3

Views: 2925

Answers (1)

tripleee
tripleee

Reputation: 189317

If the remote DNS server takes a long time to respond, or accepts the connection but does not respond at all, the only thing you can really do is move along. Perhaps try again later. You can catch the error with 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?")

If you want to apply a longer timeout, the resolve method accepts a lifetime keyword argument which is documented in the Resolver.resolve documentation. The Resolver class (documented at the top of the same page) also has a timeout parameter you can tweak if you build your own resolver.

For production code, you should probably add the other possible errors to the except clause; the exemplary documentation shows you precisely which exceptions resolve can raise.

...
except (dns.resolver.LifetimeTimeout, dns.resolver.NXDOMAIN,
        dns.resolver.YXDOMAIN, dns.resolver.NoAnswer,
        dns.resolver.NoNameservers) as err:
  print("halp, something went wrong:", err)

Probably there is a base exception class which all of these inherit from; I was too lazy to go back and check. Then you only have to list the base class in the except statement.

It's probably more useful to extract the actual MX record and display it, rather than just print True, but that's a separate topic.

Your error message indicates that you were able to connect to your own resolver at 10.24.0.1 but in the general case, this error could also happen if your network (firewall etc) prevents you from accessing DNS for some reason.

Upvotes: 3

Related Questions