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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:26:14