当前位置:首页>python>Python 批量解压 EML 邮件附件!自动按「时间 + 发件人 + 标题」分类归档

Python 批量解压 EML 邮件附件!自动按「时间 + 发件人 + 标题」分类归档

  • 2026-09-08 21:31:05
Python 批量解压 EML 邮件附件!自动按「时间 + 发件人 + 标题」分类归档
邮箱导出的 EML 文件太多?一行代码自动整理,效率提升 100 倍
大家平时工作中,经常会从邮箱 批量导出邮件(.eml 格式) ,但邮件附件散落在各个文件里,手动打开、保存、分类简直是噩梦!
今天给大家分享一个 超实用 Python 小工具 :自动扫描目录下所有 EML 文件 → 解析发送时间、发件人、标题 → 创建规范文件夹 → 一键保存所有附件。
从此告别手动整理,工作效率直接拉满!
PART.01
✨ 工具能做什么?
  • 批量处理:一次搞定目录下所有.eml 邮件
  • 自动命名:文件夹 = 发送时间 + 发件人 + 邮件标题
  • 附件提取:所有附件原样保存,不乱码、不丢失
  • 智能清理:自动过滤文件名非法字符,不报错
  • 稳定兼容:支持 Outlook、Foxmail、网易、QQ 邮箱导出的 EML
  • 无侵入:只读取、不修改原文件
PART.02
3步就能用
  1. 准备工作安装 Python(3.8 + 版本即可)无需额外安装库, 内置模块直接运行(参考我之前的文章安装,或者有长期使用python代码需求的直接下载pychcarm)
  2. 修改代码目录
找到代码中这一行,改成你的 eml 文件所在文件夹:
EML_FOLDER =r"D:\邮件备份\eml文件"
3. 运行代码
直接执行,等待几秒,所有附件自动分类完成!
PART.03
📁 最终效果示例
处理后会自动生成这样的文件夹:
每个文件夹里就是该邮件的
全部附件 ,清爽、规范、可直接归档!
PART.04
📝 代码说明(简洁版)
  • `sanitize_filename`:清理非法字符,保证文件夹能创建
  • `parse_sender`:智能提取发件人名称 / 邮箱
  • `parse_date`:统一时间格式,方便排序
  • `processoneeml`:处理单个邮件,解析 + 存附件
  • `batchprocesseml`:批量扫描并执行
代码轻量、无依赖、安全可靠,办公必备!
PART.05
💡 小贴士
  • 如果邮件 没有附件 ,会自动跳过,不创建空文件夹
  • 文件名含特殊字符会自动清理,避免保存失败
  • 支持中文、日文、英文等各种语言标题
  • 重复附件不会覆盖,可手动处理或自行加重命名逻辑
PART.06
总结
代码 开箱即用 ,无需安装第三方库,安全无风险
适合 行政、财务、人事、文员、工程师 等高频收邮件的人群
几十秒完成几小时人工工作,大幅提升办公效率。
PART.07
完整代码
import osimport reimport emailimport datetimefrom email.policy import defaultfrom pathlib import Path# ===================== 请修改这里为你的 EML 文件所在目录 =====================EML_FOLDER = r"D:\邮件备份\eml文件"# ==========================================================================def sanitize_filename(name: str) -> str:"""清理文件名/文件夹名,移除非法字符,防止创建失败"""invalid_chars = r'[\\/:*?"<>|]'return re.sub(invalid_chars, '', name).strip()def parse_sender(sender_str: str) -> str:"""解析发件人,优先提取名称,无名称则返回邮箱地址"""sender_str = sender_str.strip()    match = re.search(r'(.*?)\s*<([^<>]+)>', sender_str)if match:        name = match.group(1).strip('"').strip()return name if name else match.group(2)return sender_strdef parse_date(msg) -> str:"""解析邮件发送时间,统一格式:2025-12-29 1430"""date_tuple = msg.get('Date')if not date_tuple:return "未知时间"try:        date_obj = email.utils.parsedate_to_datetime(date_tuple)return date_obj.strftime("%Y-%m-%d %H%M")except:return "时间解析失败"def process_one_eml(eml_path: Path):"""处理单个eml文件:解析信息 → 创建文件夹 → 保存附件"""try:with open(eml_path, 'rb') as f:            msg = email.message_from_bytes(f.read(), policy=default)# 1 解析邮件核心信息sender = parse_sender(msg.get('From', '未知发件人'))        date_str = parse_date(msg)        subject = sanitize_filename(msg.get('Subject', '无标题'))# 2 拼接文件夹名称:时间 + 发件人 + 标题folder_name = f"{date_str} {sender} {subject}"save_folder = Path(EML_FOLDER) / folder_name        save_folder.mkdir(exist_ok=True)# 3 提取并保存所有附件attachment_count = 0for part in msg.walk():if part.get_content_disposition() == 'attachment':                filename = part.get_filename()if not filename:continue# 清理附件名,避免非法字符filename = sanitize_filename(filename)                save_path = save_folder / filename# 写入附件with open(save_path, 'wb') as f:                    f.write(part.get_payload(decode=True))                attachment_count += 1print(f"✅ 处理完成:{eml_path.name} | 附件数:{attachment_count} | 保存至:{folder_name}")except Exception as e:        print(f"❌ 处理失败:{eml_path.name},错误:{str(e)}")def batch_process_eml():"""批量处理目录下所有eml文件"""folder = Path(EML_FOLDER)if not folder.exists():        print(f"目录不存在:{EML_FOLDER}")returneml_files = list(folder.glob("*.eml"))if not eml_files:        print("未找到任何 .eml 文件")returnprint(f"共找到 {len(eml_files)} 个eml文件,开始处理...\n")for eml in eml_files:        process_one_eml(eml)    print("\n🎉 全部处理完成!")if __name__ == "__main__":    batch_process_eml()

最新文章

随机文章