├── README.md └── verifyemail.py /README.md: -------------------------------------------------------------------------------- 1 | # 本程序只做学习用途,请勿非法用途 2 | # verifyemail Python3.6.5 3 | 4 | Python在线验证邮箱真实性,支持批量验证,支持全部域名邮箱,支持全部域名邮箱,支持全部域名邮箱,支持全部域名邮箱 5 | 6 | 7 | final_list = verify_istrue(['190758586@qq.com', '19075858666@qq.com']) 8 | print(final_list) #{'190758586@qq.com': True, '19075858666@qq.com': False} 9 | 10 | 11 | #2018-09-21 18:42:35,017 - verifyemail.py [line:23] - INFO: 正在查找邮箱服务器 12 | #2018-09-21 18:42:35,030 - verifyemail.py [line:26] - INFO: 查找结果为:['mx3.qq.com', 'mx2.qq.com', 'mx1.qq.com'] 13 | #2018-09-21 18:42:35,030 - verifyemail.py [line:52] - INFO: 正在连接服务器...:mx2.qq.com 14 | #2018-09-21 18:42:35,160 - verifyemail.py [line:56] - DEBUG: (250, b'newmx33.qq.com') 15 | #2018-09-21 18:42:35,218 - verifyemail.py [line:59] - DEBUG: (250, b'Ok') 16 | #2018-09-21 18:42:35,317 - verifyemail.py [line:62] - DEBUG: (250, b'Ok') 17 | #2018-09-21 18:42:35,357 - verifyemail.py [line:56] - DEBUG: (250, b'newmx33.qq.com') 18 | #2018-09-21 18:42:35,418 - verifyemail.py [line:59] - DEBUG: (250, b'Ok') 19 | #2018-09-21 18:42:35,460 - verifyemail.py [line:62] - DEBUG: (550, b'Mailbox not found. http://service.mail.qq.com/cgi-#bin/help?subtype=1&&id=20022&&no=1000728') 20 | -------------------------------------------------------------------------------- /verifyemail.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 在线验证邮箱真实性 3 | ''' 4 | 5 | import random 6 | import smtplib 7 | import logging 8 | import time 9 | 10 | import dns.resolver 11 | 12 | logging.basicConfig(level=logging.DEBUG, 13 | format='%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s: %(message)s') 14 | 15 | logger = logging.getLogger() 16 | 17 | 18 | def fetch_mx(host): 19 | ''' 20 | 解析服务邮箱 21 | :param host: 22 | :return: 23 | ''' 24 | logger.info('正在查找邮箱服务器') 25 | answers = dns.resolver.query(host, 'MX') 26 | res = [str(rdata.exchange)[:-1] for rdata in answers] 27 | logger.info('查找结果为:%s' % res) 28 | return res 29 | 30 | 31 | def verify_istrue(email): 32 | ''' 33 | :param email: 34 | :return: 35 | ''' 36 | email_list = [] 37 | email_obj = {} 38 | final_res = {} 39 | if isinstance(email, str) or isinstance(email, bytes): 40 | email_list.append(email) 41 | else: 42 | email_list = email 43 | 44 | for em in email_list: 45 | name, host = em.split('@') 46 | if email_obj.get(host): 47 | email_obj[host].append(em) 48 | else: 49 | email_obj[host] = [em] 50 | 51 | for key in email_obj.keys(): 52 | host = random.choice(fetch_mx(key)) 53 | logger.info('正在连接服务器...:%s' % host) 54 | s = smtplib.SMTP(host, timeout=10) 55 | for need_verify in email_obj[key]: 56 | helo = s.docmd('HELO chacuo.net') 57 | logger.debug(helo) 58 | 59 | send_from = s.docmd('MAIL FROM:<3121113@sds.net.ddas.cc>') #声明自己的邮箱,自己改 60 | logger.debug(send_from) 61 | send_from = s.docmd('RCPT TO:<%s>' % need_verify) 62 | logger.debug(send_from) 63 | if send_from[0] == 250 or send_from[0] == 451: 64 | final_res[need_verify] = True # 存在 65 | elif send_from[0] == 550: 66 | final_res[need_verify] = False # 不存在 67 | else: 68 | final_res[need_verify] = None # 未知 69 | 70 | s.close() 71 | 72 | return final_res 73 | 74 | 75 | if __name__ == '__main__': 76 | final_list = verify_istrue(['190758586@qq.com', 77 | 'qwer111111111111995@163.com' 78 | ]) 79 | print(final_list) 80 | --------------------------------------------------------------------------------