You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从含嵌套.eml附件的.eml文件中提取PDF附件?

提取嵌套EML附件中的所有PDF文件

你需要递归解析每一层EML附件,从嵌套的邮件中提取PDF。以下是实现代码,以及关键步骤说明:

完整代码

import email
from email.policy import default
import os

def extract_pdfs_from_msg(msg, output_dir="extracted_pdfs"):
    # 创建输出目录(如果不存在)
    os.makedirs(output_dir, exist_ok=True)
    
    for att in msg.iter_attachments():
        # 跳过内嵌资源(比如邮件签名里的图片)
        if att.is_inline():
            continue
        
        filename = att.get_filename()
        if not filename:
            continue
        
        # 处理嵌套的EML附件
        if filename.lower().endswith(".eml"):
            # 解码EML附件内容并解析为新的邮件对象
            eml_content = att.get_payload(decode=True)
            nested_msg = email.message_from_bytes(eml_content, policy=default)
            # 递归处理嵌套邮件
            extract_pdfs_from_msg(nested_msg, output_dir)
        
        # 处理PDF附件
        elif filename.lower().endswith(".pdf"):
            # 解码PDF内容
            pdf_content = att.get_payload(decode=True)
            if pdf_content:
                # 保存PDF文件,避免文件名重复
                save_path = os.path.join(output_dir, filename)
                counter = 1
                while os.path.exists(save_path):
                    name, ext = os.path.splitext(filename)
                    save_path = os.path.join(output_dir, f"{name}_{counter}{ext}")
                    counter += 1
                with open(save_path, "wb") as f:
                    f.write(pdf_content)
                print(f"已保存PDF: {save_path}")

# 解析外层EML文件
with open("AWEX WMR.eml", "rb") as f:
    msg = email.message_from_bytes(f.read(), policy=default)

# 开始提取PDF
extract_pdfs_from_msg(msg)

关键说明

  • 递归解析嵌套EML:当遇到.eml后缀的附件时,解码其内容并重新解析为邮件对象,再递归调用提取函数处理嵌套内容
  • 解码附件内容:使用get_payload(decode=True)获取解码后的二进制内容,这是保存文件的核心(你之前的代码仅打印了附件元数据,未读取实际内容)
  • 过滤内嵌资源:通过is_inline()跳过邮件正文里的内嵌图片等非独立附件内容
  • 避免文件名冲突:如果存在同名PDF,自动添加数字后缀防止文件被覆盖

内容的提问来源于stack exchange,提问作者Vishu Bandari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:31:05