#本地 #.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 批量下载邮件附件的帮助。