Python在线验证邮箱真实性,支持批量验证

作者:Sec-Labs | 发布时间:

本程序只做学习用途,请勿非法用途

verifyemail Python3.6.5

Python在线验证邮箱真实性,支持批量验证,支持全部域名邮箱,支持全部域名邮箱,支持全部域名邮箱,支持全部域名邮箱

final_list = verify_istrue(['190758586@qq.com', '19075858666@qq.com'])
print(final_list) #{'190758586@qq.com': True, '19075858666@qq.com': False}

#2018-09-21 18:42:35,017 - verifyemail.py [line:23] - INFO: 正在查找邮箱服务器
#2018-09-21 18:42:35,030 - verifyemail.py [line:26] - INFO: 查找结果为:['mx3.qq.com', 'mx2.qq.com', 'mx1.qq.com']
#2018-09-21 18:42:35,030 - verifyemail.py [line:52] - INFO: 正在连接服务器...:mx2.qq.com
#2018-09-21 18:42:35,160 - verifyemail.py [line:56] - DEBUG: (250, b'newmx33.qq.com')
#2018-09-21 18:42:35,218 - verifyemail.py [line:59] - DEBUG: (250, b'Ok')
#2018-09-21 18:42:35,317 - verifyemail.py [line:62] - DEBUG: (250, b'Ok')
#2018-09-21 18:42:35,357 - verifyemail.py [line:56] - DEBUG: (250, b'newmx33.qq.com')
#2018-09-21 18:42:35,418 - verifyemail.py [line:59] - DEBUG: (250, b'Ok')
#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')

项目地址

https://github.com/Tzeross/verifyemail

核心代码

verifyemail.py

'''
在线验证邮箱真实性
'''

import random
import smtplib
import logging
import time

import dns.resolver

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s: %(message)s')

logger = logging.getLogger()


def fetch_mx(host):
    '''
    解析服务邮箱
    :param host:
    :return:
    '''
    logger.info('正在查找邮箱服务器')
    answers = dns.resolver.query(host, 'MX')
    res = [str(rdata.exchange)[:-1] for rdata in answers]
    logger.info('查找结果为:%s' % res)
    return res


def verify_istrue(email):
    '''
    :param email:
    :return:
    '''
    email_list = []
    email_obj = {}
    final_res = {}
    if isinstance(email, str) or isinstance(email, bytes):
        email_list.append(email)
    else:
        email_list = email

    for em in email_list:
        name, host = em.split('@')
        if email_obj.get(host):
            email_obj[host].append(em)
        else:
            email_obj[host] = [em]

    for key in email_obj.keys():
        host = random.choice(fetch_mx(key))
        logger.info('正在连接服务器...:%s' % host)
        s = smtplib.SMTP(host, timeout=10)
        for need_verify in email_obj[key]:
            helo = s.docmd('HELO chacuo.net')
            logger.debug(helo)

            send_from = s.docmd('MAIL FROM:<3121113@chacuo.net>')
            logger.debug(send_from)
            send_from = s.docmd('RCPT TO:<%s>' % need_verify)
            logger.debug(send_from)
            if send_from[0] == 250 or send_from[0] == 451:
                final_res[need_verify] = True  # 存在
            elif send_from[0] == 550:
                final_res[need_verify] = False  # 不存在
            else:
                final_res[need_verify] = None  # 未知

        s.close()

    return final_res


if __name__ == '__main__':
    final_list = verify_istrue(['190758586@qq.com',
                                'qwer111111111111995@163.com'
                                ])
    print(final_list)

 

标签:工具分享