0

I'm trying to use a script to check if an email exists or not. For that I'm using DNS queries. This is the call that fails:

from dns import resolver
mx_data = resolver.query(hostname, 'MX', source='')

It works if I execute the script standalone with python but it fails when it runs in appengine locally or remotely. The stacktrace:

File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__
  rv = self.handle_exception(request, response, e)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__
  rv = self.router.dispatch(request, response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
  return route.handler_adapter(request, response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__
  return handler.dispatch()
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch
  return self.handle_exception(e, self.app.debug)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch
  return method(*args, **kwargs)
File "/Users/user/dev/gaeapp/request.py", line 5827, in get
  check2 = email_checker.validate_email(email)
File "/Users/user/dev/gaeapp/tools/email_checker.py", line 89, in validate_email
  mx_data = resolver.query(hostname, 'MX')
File "/Users/user/dev/gaeapp/dns/resolver.py", line 974, in query
  raise_on_no_answer, source_port)
File "/Users/user/dev/gaeapp/dns/resolver.py", line 894, in query
  timeout = self._compute_timeout(start)
File "/Users/user/dev/gaeapp/dns/resolver.py", line 734, in _compute_timeout
  raise Timeout

I'm having a similar problem to the question DNS query using Google App Engine socket but I've tried to call query with the parameter source='' with no success.

I'm using dnspython 1.11.1

UPDATE: It works after manually setting the DNS resolvers:

r = resolver.Resolver()
r.nameservers = ['8.8.8.8', '8.8.4.4']
mx_data = r.query(hostname, 'MX')
Community
  • 1
  • 1
dablak
  • 1,376
  • 1
  • 11
  • 21
  • 3
    An obvious question is what resolvers are you using ? Looking at the code resolver.query will call get_default_resolver() have you established what the list of resolvers are, if these make sense from an appengine point of view? – Tim Hoffman Nov 04 '13 at 15:01
  • @TimHoffman That's a good point. I've added the Google DNS servers as resolvers and it works. – dablak Nov 04 '13 at 16:01

1 Answers1

0

As Tim said, you need to set the resolver explicitly.

Example code:

import dns.resolver

resolver = dns.resolver.Resolver()
resolver.nameservers = ['8.8.8.8']
mx_data = resolver.query(hostname, 'MX')

Note that 8.8.8.8 is googles dns server, but could be any other.

Also note that you do not need to set source=''

Gwyn Howell
  • 5,365
  • 2
  • 31
  • 48