如何从含嵌套.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
相关产品推荐
相关产品推荐

