@@ -438,8 +438,20 @@ def validate_email_deliverability(domain, domain_i18n, timeout=DEFAULT_TIMEOUT):
438
438
# Check that the domain resolves to an MX record. If there is no MX record,
439
439
# try an A or AAAA record which is a deprecated fallback for deliverability.
440
440
441
- # Add a trailing period to ensure the domain name is treated as fully qualified.
442
- domain += '.'
441
+ def dns_resolver_resolve_shim (resolver , domain , record ):
442
+ try :
443
+ # dns.resolver.Resolver.resolve is new to dnspython 2.x.
444
+ # https://dnspython.readthedocs.io/en/latest/resolver-class.html#dns.resolver.Resolver.resolve
445
+ return resolver .resolve (domain , record )
446
+ except AttributeError :
447
+ # dnspython 2.x is only available in Python 3.6 and later. For earlier versions
448
+ # of Python, we maintain compatibility with dnspython 1.x which has a
449
+ # dnspython.resolver.Resolver.query method instead. The only difference is that
450
+ # query may treat the domain as relative and use the system's search domains,
451
+ # which we prevent by adding a "." to the domain name to make it absolute.
452
+ # dns.resolver.Resolver.query is deprecated in dnspython version 2.x.
453
+ # https://dnspython.readthedocs.io/en/latest/resolver-class.html#dns.resolver.Resolver.query
454
+ return resolver .query (domain + "." , record )
443
455
444
456
try :
445
457
# We need a way to check how timeouts are handled in the tests. So we
@@ -455,21 +467,21 @@ def validate_email_deliverability(domain, domain_i18n, timeout=DEFAULT_TIMEOUT):
455
467
456
468
try :
457
469
# Try resolving for MX records and get them in sorted priority order.
458
- response = dns . resolver . query ( domain , "MX" )
470
+ response = dns_resolver_resolve_shim ( resolver , domain , "MX" )
459
471
mtas = sorted ([(r .preference , str (r .exchange ).rstrip ('.' )) for r in response ])
460
472
mx_fallback = None
461
473
except (dns .resolver .NoNameservers , dns .resolver .NXDOMAIN , dns .resolver .NoAnswer ):
462
474
463
475
# If there was no MX record, fall back to an A record.
464
476
try :
465
- response = dns . resolver . query ( domain , "A" )
477
+ response = dns_resolver_resolve_shim ( resolver , domain , "A" )
466
478
mtas = [(0 , str (r )) for r in response ]
467
479
mx_fallback = "A"
468
480
except (dns .resolver .NoNameservers , dns .resolver .NXDOMAIN , dns .resolver .NoAnswer ):
469
481
470
482
# If there was no A record, fall back to an AAAA record.
471
483
try :
472
- response = dns . resolver . query ( domain , "AAAA" )
484
+ response = dns_resolver_resolve_shim ( resolver , domain , "AAAA" )
473
485
mtas = [(0 , str (r )) for r in response ]
474
486
mx_fallback = "AAAA"
475
487
except (dns .resolver .NoNameservers , dns .resolver .NXDOMAIN , dns .resolver .NoAnswer ):
0 commit comments