233 lines
7.6 KiB
Python
233 lines
7.6 KiB
Python
import datetime
|
||
import time
|
||
from email.header import decode_header
|
||
from imapclient import IMAPClient
|
||
import email.header
|
||
import ssl # 导入证书模块
|
||
|
||
from bs4 import BeautifulSoup
|
||
import re
|
||
from loguru import logger
|
||
import numpy as np
|
||
from faker import Faker
|
||
|
||
# 创建一个未验证的SSL上下文
|
||
context = ssl._create_unverified_context()
|
||
|
||
|
||
def decode_mime_words(s):
|
||
return u''.join(
|
||
word.decode(encoding or 'utf8') if isinstance(word, bytes) else word
|
||
for word, encoding in email.header.decode_header(s))
|
||
|
||
|
||
class ImapMail(object):
|
||
|
||
def __init__(self, email1): # 初始化数据
|
||
self.email1 = email1
|
||
|
||
self.server_address = None
|
||
self.user = None
|
||
self.passwd = None
|
||
self.prot = None
|
||
self.ssl = None
|
||
self.timeout = None
|
||
self.save_path = None
|
||
self.server = None
|
||
self.re = None
|
||
self.html = False
|
||
self.time_length = 0 # 传入当前时间 取的数据以当前时间以后的 防止取到以前的验证码
|
||
|
||
def client(self): # 链接
|
||
try:
|
||
self.server = IMAPClient(self.server_address, self.prot, self.ssl, timeout=self.timeout,
|
||
ssl_context=context)
|
||
return self.server
|
||
except BaseException as e:
|
||
print(e)
|
||
return "ERROR: >>> " + str(e)
|
||
|
||
def login(self): # 认证
|
||
try:
|
||
self.server.login(self.user, self.passwd)
|
||
except BaseException as e:
|
||
print('login =>', e)
|
||
return "ERROR: >>> " + str(e)
|
||
|
||
def get_all_mail(self, bind_email): # 收取所有邮件
|
||
self.server.select_folder('INBOX', readonly=True) # 选择目录 readonly=True 只读,不修改,这里只选择了 收件箱
|
||
result = self.server.search([u'TO', u'{}'.format(bind_email)])
|
||
result.reverse()
|
||
|
||
mail_list = []
|
||
for uid in result:
|
||
massage_list = self.server.fetch(uid, ['BODY[]'])
|
||
mailBody = massage_list[uid][b'BODY[]']
|
||
# 邮件内容解析最里面那层是按字节来解析邮件主题内容,这个过程生成Message类型
|
||
try:
|
||
# email_content = email.message_from_string(str(email.message_from_bytes(mailBody)))
|
||
email_content = email.message_from_bytes(mailBody)
|
||
# for e in email_content:
|
||
# logger.success([e, email_content[e]])
|
||
except TypeError:
|
||
email_content = email.message_from_string(mailBody)
|
||
# 标题
|
||
# subject = email.header.make_header(email.header.decode_header(email_content['SUBJECT']))
|
||
subject = email_content['SUBJECT']
|
||
# 发件人
|
||
# mail_from = email.header.make_header(email.header.decode_header(email_content['From']))
|
||
mail_from = email_content['From']
|
||
# 收件日期
|
||
envlope = (self.server.fetch(uid, ['ENVELOPE']))[uid][b'ENVELOPE']
|
||
dates = envlope.date
|
||
# 获取内容的type编码方式
|
||
maintype = email_content.get_content_maintype()
|
||
mail_content = ''
|
||
if maintype == 'multipart':
|
||
for part in email_content.get_payload():
|
||
# 获取邮件中的文本
|
||
if part.get_content_maintype() == 'text':
|
||
mail_content = part.get_payload(decode=True).strip()
|
||
elif maintype == 'text':
|
||
mail_content = email_content.get_payload(decode=True).strip()
|
||
|
||
try:
|
||
# 解码显示中文,如果utf-8不行用gbk或者其他
|
||
mail_content = mail_content.decode('gbk')
|
||
except UnicodeDecodeError:
|
||
try:
|
||
mail_content = mail_content.decode('utf-8')
|
||
except UnicodeDecodeError:
|
||
print('decode error')
|
||
|
||
if self.html:
|
||
mail_content = (BeautifulSoup(mail_content, 'html.parser').get_text().strip()).replace('\n\n',
|
||
'').replace('\t',
|
||
'')
|
||
|
||
logger.info(['dates =>', dates, self.time_length - 10, str_to_time_int(dates)])
|
||
if self.time_length - 10 <= str_to_time_int(dates):
|
||
mail_list.append({
|
||
"邮件列表": result,
|
||
"subject": subject,
|
||
"time": dates,
|
||
"body": mail_content,
|
||
"From": mail_from
|
||
})
|
||
|
||
return mail_list[0]
|
||
|
||
if len(mail_list) > 0:
|
||
return mail_list[0]
|
||
return None
|
||
|
||
def logout(self):
|
||
self.server.logout()
|
||
|
||
def run(self, bind_email, server_address='mail.hforest.xyz', user='zx@hforest.xyz', passwd='abcd654321'):
|
||
# def run(self, bind_email, server_address='mail.hashtop.net', passwd='Aa123456'):
|
||
self.server_address = server_address
|
||
# self.user = self.email1
|
||
self.user = user
|
||
self.passwd = passwd
|
||
self.prot = 993
|
||
self.re = ''
|
||
self.client()
|
||
self.login()
|
||
result = self.get_all_mail(bind_email)
|
||
self.logout()
|
||
return result
|
||
|
||
|
||
def str_to_time_int(datetime_str):
|
||
dt_obj = datetime.datetime.strptime(str(datetime_str), '%Y-%m-%d %H:%M:%S')
|
||
# 将datetime对象转换为时间戳
|
||
timestamp = int(time.mktime(dt_obj.timetuple()))
|
||
return timestamp
|
||
|
||
|
||
def get_verify_code(email, time_length, n=5):
|
||
run = ImapMail(email1=email)
|
||
run.time_length = time_length
|
||
result = run.run(email)
|
||
print(result)
|
||
codes = re.findall(r'\d+', result.get('body')) # 验证码可能在subject 也可能在body里面 这里按需修改 正则也按需修改
|
||
aa = []
|
||
for code in codes:
|
||
if len(str(code)) >= n:
|
||
aa.append(code)
|
||
return aa
|
||
|
||
|
||
def get_rand_email(limit=1):
|
||
f = Faker()
|
||
mail = [
|
||
'19980321.xyz',
|
||
'55foundry.vip',
|
||
'altos.live',
|
||
'bitcog.design',
|
||
'blackfin.online',
|
||
'blockcamp.website',
|
||
'compute.wiki',
|
||
'deepcore.info',
|
||
'depone.app',
|
||
'erinaceous.nl',
|
||
'finnimbrun.space',
|
||
'hashhub.one',
|
||
'icetea.biz',
|
||
'jovono.icu',
|
||
'kernel-ventures.gay',
|
||
'kryptos.cc',
|
||
'limerance.host',
|
||
# 'mailgooglo.com',
|
||
'mesonoxian.me',
|
||
'mungo.life',
|
||
'myelin.store',
|
||
'nihilarian.de',
|
||
'node5.bio',
|
||
# 'nudiustertian.world',
|
||
'parataxis.co',
|
||
# 'petrock.club',
|
||
'phenakism.pw',
|
||
'pronk.best',
|
||
'raptorcapital.co',
|
||
'rpmvc.art',
|
||
# 'scb10x.co.uk',
|
||
'scopperloit.in',
|
||
'selcouth.fun',
|
||
'sokudo.site',
|
||
'soulcapital.us',
|
||
'stakely.cloud',
|
||
'team8.tech',
|
||
'thrivecap.shop',
|
||
'tyrotoxism.ca',
|
||
# 'vaneck.pro',
|
||
'widdiful.dev',
|
||
]
|
||
|
||
mails = []
|
||
for i in range(limit):
|
||
name = str(f.name())
|
||
a = name.replace(' ', "_").lower()
|
||
random_num = np.random.randint(1, 1000)
|
||
index = np.random.randint(0, len(mail) - 1)
|
||
mail1 = f'{a}_{random_num}@{mail[index]}'
|
||
mails.append(mail1)
|
||
|
||
if limit <= 1:
|
||
return mails[0]
|
||
return mails
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# # 生成邮箱
|
||
mail = get_rand_email() # 1个 就字符串
|
||
# # # mails = get_rand_email(100) # 100个 数组
|
||
# #
|
||
# print(mail)
|
||
|
||
# # 接收验证码
|
||
# code = get_verify_code('christina_murray_77@sokudo.site', 0)
|
||
# #
|
||
# # print(code)
|