获取邮件中的表格并保存本地

刚用到的,获取所有未读邮件中的表格并分别保存本地。

源码展示

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:\\")