获取邮件中的表格并保存本地
刚用到的,获取所有未读邮件中的表格并分别保存本地。
源码展示
import imapclient
# 这个包导不进来,先导入 pyzmail36,下载好后再改回 pyzmail 即可
import pyzmail
from bs4 import BeautifulSoup
import pandas as pd
import sys
# 提取邮件里面的表格
class my_eamil():
"""
构造函数,创建一个类的入口
self指的是类实例对象本身
后面传入三个参数,即:邮箱地址、密码、邮件服务
"""
def __init__(self, user, password, email_server):
self.user = user
# 此处密码是授权码,用于登录第三方邮件客户端
self.password = password
self.pop3_server = email_server
# 获取邮件中的表格
def get_taleStr(self, file_path):
# 腾讯企业邮箱
imapObj = imapclient.IMAPClient(email_server, ssl=True)
# 邮箱和密码
imapObj.login(user, password)
# 默认收件箱
imapObj.select_folder('INBOX', readonly=True)
# 搜索未读邮件,打印未读邮件的UID
UIDS = imapObj.search('UNSEEN')
# print(UIDS)
# UIDS = imapObj.search('ALL')#搜索全部的邮件
if len(UIDS) >= 1: # 存在未读邮件
for UID in UIDS:
# 获得邮件内容
rawMessage = imapObj.fetch(UID, [b'BODY[]'])
# 选择第一封未读邮件
messageObj = pyzmail.PyzMessage.factory(rawMessage[UID][b'BODY[]'])
# 打印邮件信息,可以根据这些信息进行筛选
mail_title = messageObj.get_subject()
for i in ["/", "\\", ":", "*", '"', "<", ">", "|", "?"]:
mail_title = mail_title.replace(i, "")
print('邮件主题', messageObj.get_subject())
# print('发件人', messageObj.get_addresses('from'))
# print('收件人', messageObj.get_addresses('to'))
# 邮件内容不为空时
if messageObj.html_part != None:
messageContent = messageObj.html_part.get_payload().decode(messageObj.html_part.charset)
# 设置邮件已读
# imapObj.set_flags(rawMessage, b'\\Seen', silent=False)
# 是指定Beautiful的解析器为“html.parser”
soup = BeautifulSoup(messageContent, 'html.parser')
# 寻找所有的表格
tables = soup.find_all('table')
# excel 写入器
# 如果邮件中有表格存在
if len(tables) > 0:
writer = pd.ExcelWriter(file_path+str(UID)+mail_title+".xlsx", engine='xlsxwriter')
workbook = writer.book
# 可遍历的数据对象
for idx, table in enumerate(tables):
# 定义sheet 名称
sheet_name = 'Table-' + str(idx)
# 获取 table 数据
df_table = pd.read_html(str(table), header=0, flavor='bs4')[0]
# table 数据 写入 Excel
df_table.to_excel(writer, index=False, sheet_name=sheet_name)
# 获取 sheet 对象
worksheet = writer.sheets[sheet_name]
# 设置表头样式
header_fmt = workbook.add_format(
{'font_size': 14, 'bold': True, 'fg_color': '#D7E4BC', 'border': 1})
# 写入表头
for col_num, value in enumerate(df_table.columns.values):
worksheet.write(0, col_num, value, header_fmt)
# 调整列宽
worksheet.set_column('A:Z', 25)
# 保存文件
writer.save()
else:
pass
# 退出邮件
imapObj.logout()
# 如果邮件内容存在链接则返回链接,若不存在则直接下载邮件附件
# return messageContent
if __name__ == '__main__':
# 开始执行
# 邮箱账号
user = '邮箱账号'
# 密码,若是163邮箱则使用客户端密码
password = '邮箱密码'
email_server = '邮箱pop服务器'
# 调用类
myEmail = my_eamil(user=user, password=password, email_server=email_server)
myEmail.get_taleStr("E:\\")
回帖内容已被屏蔽。
666