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

如何使用pypff提取PST文件中邮件的FROM/TO/CC及BCC信息?

解决方案:从PST文件(含日历/Teams消息)中提取收件人信息

针对pypff库提取收件人时遇到的问题,以下是分场景的实用解决方案:

1. 优先使用pypff原生收件人接口

pypff的Message对象内置了recipients属性,这是获取收件人信息的最可靠方式,无需解析transport headers。每个Recipient对象包含以下核心字段:

  • name:收件人名称
  • email_address:收件人邮箱
  • recipient_type:收件人类型(1=直接收件人,2=抄送,3=密送)

示例代码片段:

import pypff

pst = pypff.open("your_large.pst")
root = pst.get_root_folder()

def process_message(message):
    recipients = []
    # 遍历原生收件人集合
    if message.recipients:
        for rcpt in message.recipients:
            recipients.append({
                "name": rcpt.name,
                "email": rcpt.email_address,
                "type": rcpt.recipient_type
            })
    return recipients

# 递归遍历文件夹(适配大型PST的内存友好方式)
def traverse_folder(folder):
    for msg in folder.sub_messages:
        rcpts = process_message(msg)
        print(f"主题: {msg.subject} | 收件人: {rcpts}")
    for sub_folder in folder.sub_folders:
        traverse_folder(sub_folder)

traverse_folder(root)
pst.close()

2. 处理无原生收件人的特殊消息

对于日历项、Teams消息这类无结构化recipients的内容,需根据消息类型针对性提取:

日历会议请求/响应

日历项的message_class通常为IPM.Schedule.Meeting.Request或IPM.Schedule.Meeting.Resp.*,可通过meeting属性获取参会人信息:

if message.message_class.startswith("IPM.Schedule.Meeting"):
    if hasattr(message, "meeting") and message.meeting:
        attendees = []
        for attendee in message.meeting.attendees:
            attendees.append({
                "name": attendee.name,
                "email": attendee.email_address,
                "response_status": attendee.response_status  # 如接受/拒绝/暂定
            })
        print(f"会议参会人: {attendees}")

Teams聊天消息

Teams消息的message_class一般以TeamsChat.Message开头,这类消息的收件人信息通常嵌入在正文或主题中,需做文本解析:

if message.message_class.startswith("TeamsChat.Message"):
    body = message.plain_text_body or message.body
    if body:
        # 示例:提取@提及的用户(需根据实际消息格式调整正则)
        import re
        mentioned_users = re.findall(r"@(\w+[\s\w]*)", body)
        if mentioned_users:
            print(f"Teams消息提及用户: {mentioned_users}")
        # 若为群聊,主题可能包含对话成员,也可从subject字段提取
        if message.subject:
            print(f"对话成员: {message.subject}")

通用 fallback:display_to字段

部分非标准消息(如系统通知)可能没有recipients或meeting属性,但会在display_to字段中显示收件人名称:

if not recipients and hasattr(message, "display_to") and message.display_to:
    recipients.append({"name": message.display_to, "source": "display_to"})

3. 大型PST的性能优化

  • 逐消息处理:避免一次性加载所有消息到内存,采用递归遍历+即时处理的方式。
  • 批量写入:如果需要存储结果,可每处理N条消息就写入一次文件/数据库,减少内存占用。
  • 跳过无效消息:提前过滤掉无内容的空消息,提升处理速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:45:31