关于本地.eml格式文件(转发邮件)附件的下载

#本地 #.eml #转发邮件 #附件 #下载 #保存 #代码 #python

本地.eml格式转发邮件附件下载,遍历目标文件夹目录下所有.eml文件并保存附件到所在文件夹,文件名相同不会覆盖。

部分代码借用GitHub作者Li-Jiajie关于批量下载网上邮箱邮件附件的程序代码,附链接:GitHub - Li-Jiajie/BatchAttachmentDownloader: 邮箱邮件附件批量下载 v1.3 多种保存模式、支持筛选 支持IMAP与POP3

import os
import email
from email.header import decode_header

dir_path = r'E:\目标文件夹路径'

#读取eml邮件信息
def parse_eml(file_path):
	with open(file_path, 'rb') as file:
		message = email.message_from_bytes(file.read())
		file.close()
	return message

#查找eml是否有附件有则返回附件内容
def find_attachments(message):
	attachments = []
	for part in message.walk():
		if part.get_content_maintype() == 'multipart':
			continue
		if part.get('Content-Disposition') is None:
			continue
		attachments.append(part)
	return attachments

# 将邮件中的bytes数据转为字符串
def decode_mail_info_str(content):
	result_content = []
	for value, charset in decode_header(content):
		if type(value) != str:
			if charset is None:
				value = value.decode(errors='replace')
			elif charset.lower() in ['gbk', 'gb2312', 'gb18030']:
				# 一些特殊符号标着gbk,但编码可能是gb18030中的。gb18030向下兼容gbk、gb2312,所以一律用gb18030。
				value = value.decode(encoding='gb18030', errors='replace')
			else:
				value = value.decode(charset, errors='replace')
		result_content.append(value)
	return ' '.join(result_content)

# 检查文件名,如果相同则自动递增编号。返回文件名,不包含路径。
def file_name_check_and_update(path, file_name):
	file_number = 2
	exist_file_list = os.listdir(path)
	pure_name, extension = os.path.splitext(file_name)
	while file_name in exist_file_list:
	    file_name = pure_name + '_' + str(file_number) + extension
	    file_number += 1
	return file_name

#保存附件内容
def save_attachments(attachments, save_dir):
	for part in  attachments:
		attachment_name = part.get_filename()
		if attachment_name:
			attachment_name = decode_mail_info_str(attachment_name)
			attachment_name = file_name_check_and_update(save_dir, attachment_name)
			attachment_path = os.path.join(save_dir, attachment_name)
##			print(attachment_path)
			with open(attachment_path, 'wb') as file:
				file.write(part.get_payload(decode=True))
				file.close()
				
for dirpath,dirnames,filenames in os.walk(dir_path):#遍历目录下文件文件夹
	for filename in filenames:#遍历该目录下文件
		if os.path.splitext(filename)[1] == '.eml':#判断文件扩展名
			file_path = os.path.join(dirpath,filename)
			message = parse_eml(file_path)
			attachments = find_attachments(message)
			save_attachments(attachments, dirpath)

 以上希望对各位有所帮助,同时感谢GitHub作者Li-Jiajie 批量下载邮件附件的帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值