刚用到的,获取所有未读邮件中的表格并分别保存本地。
源码展示
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): = user # 此处密码是授权码,用于登录第三方邮件客户端 = password = email_server # 获取邮件中的表格 def get_taleStr(self, file_path): # 腾讯企业邮箱 imapObj = ima(email_server, ssl=True) # 邮箱和密码 ima(user, password) # 默认收件箱 ima('INBOX', readonly=True) # 搜索未读邮件,打印未读邮件的UID UIDS = ima('UNSEEN') # print(UIDS) # UIDS = ima('ALL')#搜索全部的邮件 if len(UIDS) >= 1: # 存在未读邮件 for UID in UIDS: # 获得邮件内容 rawMessage = ima(UID, [b'BODY[]']) # 选择第一封未读邮件 messageObj = (rawMessage[UID][b'BODY[]']) # 打印邮件信息,可以根据这些信息进行筛选 mail_title = me() for i in ["/", "\\", ":", "*", '"', "<", ">", "|", "?"]: mail_title = mail_(i, "") print('邮件主题', me()) # print('发件人', me('from')) # print('收件人', me('to')) # 邮件内容不为空时 if me != None: messageContent = me.get_payload().decode(me.charset) # 设置邮件已读 # ima(rawMessage, b'\\Seen', silent=False) # 是指定Beautiful的解析器为“” soup = BeautifulSoup(messageContent, '') # 寻找所有的表格 tables = ('table') # excel 写入器 # 如果邮件中有表格存在 if len(tables) > 0: writer = (file_path+str(UID)+mail_title+".xlsx", engine='xlsxwriter') workbook = wri # 可遍历的数据对象 for idx, table in enumerate(tables): # 定义sheet 名称 sheet_name = 'Table-' + str(idx) # 获取 table 数据 df_table = (str(table), header=0, flavor='bs4')[0] # table 数据 写入 Excel d(writer, index=False, sheet_name=sheet_name) # 获取 sheet 对象 worksheet = wri[sheet_name] # 设置表头样式 header_fmt = workbook.add_format( {'font_size': 14, 'bold': True, 'fg_color': '#D7E4BC', 'border': 1}) # 写入表头 for col_num, value in enumerate): work(0, col_num, value, header_fmt) # 调整列宽 work('A:Z', 25) # 保存文件 wri() else: pass # 退出邮件 ima() # 如果邮件内容存在链接则返回链接,若不存在则直接下载邮件附件 # 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:\\")