Guest User

Untitled

a guest
Jan 22nd, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. import re
  2. import smtplib
  3. import logging
  4. import socket
  5. import dns.resolver
  6. from datetime import datetime
  7. import multiprocessing
  8.  
  9.  
  10. MX_DNS_CACHE = {}
  11. MX_CHECK_CACHE = {}
  12. smtp = smtplib.SMTP(timeout=0.4)
  13.  
  14.  
  15. def get_mx_ip(hostname):
  16. if hostname not in MX_DNS_CACHE:
  17. try:
  18. MX_DNS_CACHE[hostname] = dns.resolver.query(hostname, 'MX')
  19. except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
  20. MX_DNS_CACHE[hostname] = None
  21.  
  22. return MX_DNS_CACHE[hostname]
  23.  
  24.  
  25.  
  26. def validate_email(email, check_mx=False, verify=False, debug=False, smtp_timeout=10):
  27. """This will check valid email syntax by django validators and check hostname and local name
  28. by using the updated library dns.resolver and verify the email by smtp library.
  29. Caching the result in MX_DNS_CACHE to iprove performance.
  30. """
  31. try:
  32. check_mx |= verify
  33. if check_mx:
  34. hostname = email[email.find('@') + 1:]
  35. # try:
  36. # mx_hosts = dns.resolver.query(hostname, 'MX')
  37. # except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
  38. # return False
  39. # mx_hosts = get_mx_ip(hostname)
  40. if hostname in MX_DNS_CACHE:
  41. mx_hosts = MX_DNS_CACHE[hostname]
  42. else:
  43. mx_hosts = get_mx_ip(hostname)
  44. if mx_hosts is None:
  45. return False
  46. for mx in mx_hosts:
  47. try:
  48. if not verify and mx in MX_CHECK_CACHE:
  49. return MX_CHECK_CACHE[mx]
  50.  
  51. smtp.connect(mx.exchange.to_text())
  52. # b = datetime.now() - a
  53. # print "After connecting... ", b
  54. MX_CHECK_CACHE[mx] = True
  55. if not verify:
  56. try:
  57. smtp.quit()
  58. except smtplib.SMTPServerDisconnected:
  59. pass
  60. return True
  61. # a = datetime.now()
  62. status, _ = smtp.helo()
  63. # b = datetime.now() -a
  64. # print "after sending email...", b
  65. if status != 250:
  66. smtp.quit()
  67. if debug:
  68. logger.debug(u'%s answer: %s - %s', mx, status, _)
  69. continue
  70. smtp.mail('')
  71. status, _ = smtp.rcpt(email)
  72. if status == 250:
  73. smtp.quit()
  74. return True
  75. if debug:
  76. logger.debug(u'%s answer: %s - %s', mx, status, _)
  77. smtp.quit()
  78. except smtplib.SMTPServerDisconnected: # Server not permits verify user
  79. if debug:
  80. logger.debug(u'%s disconected.', mx)
  81. except smtplib.SMTPConnectError:
  82. if debug:
  83. logger.debug(u'Unable to connect to %s.', mx)
  84. return None
  85. except AssertionError:
  86. return False
  87. except (socket.error) as e:
  88. if debug:
  89. logger.debug('ServerError or socket.error exception raised (%s).', e)
  90. return None
  91. return True
  92.  
  93.  
  94. if __name__ == '__main__':
  95.  
  96. emails = [] # add emails
  97.  
  98. b = datetime.now()
  99.  
  100.  
  101. def validate(email):
  102. a = datetime.now()
  103. value = validate_email(email, verify=True)
  104. delta = datetime.now() - a
  105. print value, email, (delta.microseconds + delta.microseconds/1E6)
  106.  
  107. def lookup(email):
  108. hostname = email[email.find('@') + 1:]
  109. max_hosts = get_mx_ip(hostname)
  110. return max_hosts
  111.  
  112. pool = multiprocessing.Pool()
  113. result = pool.map(lookup, emails)
  114. finalresult = pool.map(validate, emails)
  115. delta = datetime.now() - b
  116. print delta.seconds + delta.microseconds/1E6
Add Comment
Please, Sign In to add comment