如何用Python提取.pst文件中的邮件?能否不依赖第三方库?
从Outlook PST文件提取邮件的Python实现方案
一、推荐的实现方式(依赖第三方库)
PST是微软的专有二进制格式,结构复杂,用成熟的第三方库是最高效的选择,目前常用的有两个方向:
1. 使用pfflib(跨平台开源库)
这是libpff的Python绑定,libpff是专门处理PST/OST文件的开源工具,能直接解析PST的内部结构,提取邮件的主题、发件人、正文、附件等全量信息,支持Windows、Linux、macOS多平台。
示例代码:
import pff # 打开目标PST文件 pst = pff.file() pst.open("your_file.pst") # 获取根文件夹并递归遍历 def walk_folder(folder): for item in folder.sub_items: if item.is_folder(): walk_folder(item) elif item.is_message(): msg = item.get_message() # 提取核心邮件信息 print(f"主题: {msg.get_subject()}") print(f"发件人: {msg.get_sender_name()}") print(f"收件人: {msg.get_recipients()}") print(f"纯文本正文: {msg.get_plain_text_body()}") # 保存附件 for att in msg.get_attachments(): att_name = att.get_name() with open(att_name, "wb") as f: f.write(att.get_data()) print(f"已保存附件: {att_name}") walk_folder(pst.get_root_folder()) pst.close()
注意:安装前可能需要先安装系统级的libpff依赖(比如Ubuntu用apt install libpff-dev),再通过pip install pfflib安装Python包。
2. 使用pywin32(仅Windows平台)
如果你的代码只在Windows环境运行,且本地安装了Outlook客户端,可以用pywin32调用Outlook的COM接口来读取PST。这种方式依赖Outlook的解析能力,能完美兼容所有PST特性,不需要单独处理格式细节。
示例代码:
import win32com.client # 初始化Outlook MAPI会话 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") pst_path = r"C:\your_path\file.pst" # 将PST添加到会话中 outlook.AddStore(pst_path) # 定位到目标PST的根文件夹 target_store = None for store in outlook.Stores: if store.FilePath == pst_path: target_store = store.GetRootFolder() break # 遍历文件夹和邮件 def traverse_folder(folder): # 处理当前文件夹的邮件 for item in folder.Items: if item.Class == 43: # 43是Outlook中邮件项的标识 print(f"主题: {item.Subject}") print(f"发件人: {item.SenderName}") print(f"收件人: {item.To}") print(f"正文: {item.Body}") # 保存附件 for att in item.Attachments: save_path = fr"C:\save_dir\{att.FileName}" att.SaveAsFile(save_path) print(f"附件已保存至: {save_path}") # 递归处理子文件夹 for subfolder in folder.Folders: traverse_folder(subfolder) traverse_folder(target_store) # 移除PST会话(可选) outlook.RemoveStore(target_store)
二、不使用第三方库是否可行?
几乎没有实际可行性,原因如下:
- PST是微软未完全公开的专有格式,内部包含复杂的索引、压缩、加密(如果启用)机制,还有不同版本的格式差异,逆向解析的难度极大。
- 即便能找到部分公开的PST结构文档,要实现完整的解析逻辑,需要处理各种边界情况(比如损坏的文件、特殊邮件格式、嵌套文件夹等),工作量相当于从零开发一个专业的PST解析库,完全不划算。
- 硬要尝试的话,只能用Python的
struct模块手动读取二进制数据,但这只适合研究学习,绝对不适合实际项目需求。
内容的提问来源于stack exchange,提问作者Sushant Singh Negi
相关产品推荐
相关产品推荐

