从 Gmail 到本地:一次关于批量提取附件的探索之旅

  • fennng 

注:本博客也是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()

🚀 运行脚本:简单到不能再简单

  1. 把脚本放到 .eml 文件所在目录
  2. 打开 Terminal
  3. 运行:
python3 extract_attachments.py
  1. 所有附件会自动出现在:
attachments/

整个过程不到 10 秒。


🧭 这次经验给我的启发

  1. AI 在处理结构化任务时非常高效
    我只需要描述需求,AI 就能生成可运行的脚本。
  2. Python 标准库比想象中更强大
    email 模块完全可以胜任 MIME 解析,不需要第三方库。
  3. 自动化永远比手动更可靠
    尤其是处理几十、几百封邮件时。
  4. AI 是一个强大的“代码加速器”
    它不会替代工程师,但能让工程师把时间花在更有价值的地方。

📝 总结

这次从 Gmail 到本地附件提取的过程,看似只是一个小问题,但背后涉及:

  • 邮件格式(EML/MIME)
  • 工具选择(Thunderbird / Takeout / 脚本)
  • 自动化思维
  • 与 AI 协作生成代码

最终我用最轻量的方式解决了问题,也顺便优化了自己的工作流。

如果你也有类似需求,希望这篇文章能帮到你。


发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注