Files
to_session/tools123123/email1.py
Administrator a0720d80dc fefdwef
2025-11-12 12:54:37 +08:00

233 lines
7.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)