注:本博客也是AI生成的,当然,我审核过。
在处理邮件归档时,我遇到一个看似简单却意外麻烦的问题:如何从一批 .eml 文件中批量提取所有附件?
这篇文章记录了我的思考过程、尝试过的方案,以及最终如何借助 AI 生成脚本并成功解决问题。
🧩 问题是怎么出现的?
我需要从 Gmail 中下载一系列账单邮件的附件。
然而 Gmail 本身有几个限制:
- 不能一次选多个邮件并批量下载附件
- “下载所有附件”只适用于单个线程
- Forward as attachment 虽然能生成
.eml,但附件仍然嵌在里面
最终我得到了一堆 .eml 文件,例如:
Statement - 01_02_2024.eml
Statement - 01_03_2024.eml
Statement - 01_05_2023.eml
...
这些 .eml 文件里都包含 PDF 附件,但 Gmail 没有提供批量提取的功能。
我需要一个自动化、可重复、可靠的方式把所有附件提取出来。
🧠 我的思考过程:有哪些可能的方案?
方案 1:Thunderbird 导入 + Save All Attachments
Thunderbird 是处理 MBOX 和 EML 的经典工具,AI说可以做到:
- 导入
.eml - 全选 → 右键 → Save All Attachments
但我试了, 都没能成功导入MBOX和 EML
方案 2:Google Takeout
Takeout 可以导出 Gmail (我只导出特定LABEL的) 成 MBOX,然后再用工具解析。我试了Thunderbird, 没成功导入 MBOX
方案 3:写脚本解析 .eml
.eml 本质上是 MIME 格式的纯文本文件,理论上可以用 Python 的 email 标准库解析。
但我不想从零开始写 MIME 解析器,也不想踩编码坑。
方案 4:让 AI 帮我写脚本
既然 Python 有标准库能处理邮件,那我只需要一个干净、健壮、可直接运行的脚本。
于是我决定让 AI 帮我生成一个。
🤖 使用 AI 生成脚本:一次非常高效的协作
我把需求告诉 AI:
- 我有一批
.eml文件 - 我需要提取所有附件
- 自动处理重复文件名
- 最好不依赖第三方库
AI 给了我一个非常简洁的 Python 脚本,直接可用。
下面是最终版本(我已在 macOS 上验证可用):
import os
import email
from email import policy
from email.parser import BytesParser
# Folder containing your .eml files
SOURCE_DIR = "."
# Output folder for attachments
OUTPUT_DIR = "attachments"
os.makedirs(OUTPUT_DIR, exist_ok=True)
def save_attachment(part, output_dir):
filename = part.get_filename()
if not filename:
return
# Avoid overwriting files with the same name
base, ext = os.path.splitext(filename)
counter = 1
save_path = os.path.join(output_dir, filename)
while os.path.exists(save_path):
save_path = os.path.join(output_dir, f"{base}_{counter}{ext}")
counter += 1
with open(save_path, "wb") as f:
f.write(part.get_payload(decode=True))
print(f"Saved: {save_path}")
def process_eml_file(filepath):
with open(filepath, "rb") as f:
msg = BytesParser(policy=policy.default).parse(f)
for part in msg.walk():
if part.get_content_disposition() == "attachment":
save_attachment(part, OUTPUT_DIR)
def main():
for filename in os.listdir(SOURCE_DIR):
if filename.lower().endswith(".eml"):
filepath = os.path.join(SOURCE_DIR, filename)
print(f"Processing: {filepath}")
process_eml_file(filepath)
if __name__ == "__main__":
main()
🚀 运行脚本:简单到不能再简单
- 把脚本放到
.eml文件所在目录 - 打开 Terminal
- 运行:
python3 extract_attachments.py
- 所有附件会自动出现在:
attachments/
整个过程不到 10 秒。
🧭 这次经验给我的启发
- AI 在处理结构化任务时非常高效
我只需要描述需求,AI 就能生成可运行的脚本。 - Python 标准库比想象中更强大
email模块完全可以胜任 MIME 解析,不需要第三方库。 - 自动化永远比手动更可靠
尤其是处理几十、几百封邮件时。 - AI 是一个强大的“代码加速器”
它不会替代工程师,但能让工程师把时间花在更有价值的地方。
📝 总结
这次从 Gmail 到本地附件提取的过程,看似只是一个小问题,但背后涉及:
- 邮件格式(EML/MIME)
- 工具选择(Thunderbird / Takeout / 脚本)
- 自动化思维
- 与 AI 协作生成代码
最终我用最轻量的方式解决了问题,也顺便优化了自己的工作流。
如果你也有类似需求,希望这篇文章能帮到你。
