python 收发邮件 学习笔记
导包并进行连接收信箱服务:
class IMAP: def __init__(self, user_id, password, imap_server): self.user_id = user_id # 邮箱地址 self.password = password self.imap_server = imap_server try: serv = imaplib.IMAP4_SSL(self.imap_server) # SSL加密 print('imap4 服务器连接成功') try: serv.login(self.user_id, self.password) print('imap4 登录成功') except Exception as e: print('imap4 登录失败:', e) except Exception as e: print('imap4 服务器连接失败:', e) self.serv = serv
收取邮件,可选多种条件('ALL','UNSEEN','(SINCE"15-jun-2022")')
def get_content(self): # select 可以选择收信或者发信箱 self.serv.select() ret, data = self.serv.search(None, 'UNSEEN') # 未读邮件 # 邮件列表 email_list = data[0].split()
if len(email_list) == 0:
pass
# exit(1)
# 获取最后一封邮件的序号
item = email_list # [len(email_list) - 1]
data_list = []
txt_data_List = []
for item in item:
data_dic = {}
# 获取最后一封邮件内容
ret, data = self.serv.fetch(item, '(RFC822)')
msg = email.message_from_string(data[0][1].decode('utf-8'))
sub = msg.get('subject')
email_from = msg.get('from')
email_to = msg.get('to')
sub_text = email.header.decode_header(sub)
email_from_text = email.header.decode_header(email_from)
email_to_text = email.header.decode_header(email_to)
date = email.header.decode_header(msg.get('date'))
format_time = time_format(date[0][0], '%a, %d %b %Y %H:%M:%S +0800', '%Y-%m-%d %H:%M:%S')
# print(type(date[0][0]), '时间:', format_time)
# 如果是特殊字符,元组的第二位会给出编码格式,需要转码
if sub_text[0]:
sub_detail = self.tuple_to_str(sub_text[0])
email_from_detail = ''
for i in range(len(email_from_text)):
email_from_detail = email_from_detail + self.tuple_to_str(email_from_text[i])
email_to_detail = ''
for i in range(len(email_to_text)):
email_to_detail = email_to_detail + self.tuple_to_str(email_to_text[i])
data1 = ''
for i in range(len(date)):
data1 = data1 + self.tuple_to_str(date[i])
data_dic['主题'] = sub_detail
data_dic['发件人'] = email_from_detail
data_dic['收件人'] = email_to_detail
data_dic['时间'] = format_time
attach = []
count = 0
for part in msg.walk():
if not part.is_multipart():
content_type = part.get_content_type()
name = part.get_filename()
if name:
trans_name = email.header.decode_header(name)
if trans_name[0][1]:
file_name = trans_name[0][0].decode(trans_name[0][1])
else:
file_name = trans_name[0][0]
print('开始下载附件:', file_name)
attach_data = part.get_payload(decode=True)
try:
f = open('donwload/' + file_name, 'wb')
except Exception as e:
print(e)
f = open('tmp', 'wb')
f.write(attach_data)
f.close()
print('附件下载成功:', file_name)
attach.append(file_name)
else:
# 文本内容
txt = part.get_payload(decode=True)
# print(BeautifulSoup(decode_byte(txt), 'lxml'))
# html_sup = BeautifulSoup(decode_byte(txt), 'lxml').find_all('div')
# 使用bs4解析 返回resultset 首先注意邮件本身发回的decode_byte(txt)是字符串,所以resultset和字符串本身可以相互转换 所以可以先将字符串进行裁剪在通过lxml解析 以解决部分不规则内容
# 使用css 选择器可以解决大部分选择器
#resultset 有clear() 函数 用于清理某些不需要的内容
if content_type == 'text/html':
sup = BeautifulSoup(decode_byte(txt), 'lxml')
发送邮件: 首先在flask的config中加载配置
# 服务器 MAIL_SERVER = '' #用户名 # MAIL_USERNAME ='' #密码 MAIL_PASSWORD = '' # 发信人信息 MAIL_DEFAULT_SENDER = ('徐健发', '421803497@qq.com')
app = Flask(__name__, template_folder='templates') mail = Mail(app) def send_mail(subject, to, html, body, attach):
# 创建message 对象 message = Message(subject, recipients=[to], html=body + '<br><br><br>' + html) for att in attach: with app.open_resource(f'../{att}') as fp: message.attach(f"{att}", 'file/xls', fp.read()) with app.app_context(): mail.send(message) print('发送成功')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix