如何使用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
相关产品推荐
相关产品推荐

