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

使用MAPI与pywin32提取Outlook已发送文件夹指定邮件数据求助

解决方案

你可以通过自定义主题匹配规则+内置属性提取实现需求,优先推荐用Restrict方法预先过滤邮件,避免遍历全量已发送邮件提升运行效率,完整可运行代码如下:

import win32com.client
from datetime import datetime, timedelta

# 初始化Outlook客户端
outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace("MAPI")
sent_folder = mapi.GetDefaultFolder(5)
messages = sent_folder.Items

# 按发送时间倒序排序,优先匹配最新发送的同主题邮件(可选)
messages.Sort("[SentOn]", True)

# --------------------------
# 配置你的筛选条件
# --------------------------
# 要匹配的目标邮件主题
TARGET_SUBJECT = "替换为你要查找的特定邮件主题"
# 可选:添加时间范围筛选,比如只查最近30天的邮件,进一步缩小范围
# DATE_FILTER = (datetime.now() - timedelta(days=30)).strftime('%m/%d/%Y')
# messages = messages.Restrict(f"[SentOn] >= '{DATE_FILTER}'")

found = False
for msg in messages:
    # 跳过非邮件类型的项(比如会议邀请、任务等,避免属性调用报错)
    if msg.Class != 43:
        continue
    # 匹配规则可按需调整,以下3种二选一即可
    # 1. 精确匹配主题
    if msg.Subject.strip() == TARGET_SUBJECT.strip():
    # 2. 模糊匹配:只要主题包含目标字符串就匹配
    # if TARGET_SUBJECT.strip() in msg.Subject.strip():
    # 3. 正则匹配:调用你引入的regex库实现自定义规则匹配
    # if re.search(r'你的正则表达式', msg.Subject):
        print("找到匹配的已发送邮件:")
        print(f"* 主题:{msg.Subject}")
        # SentOn返回原生datetime类型,可直接按需求格式化输出
        sent_time = msg.SentOn.strftime("%Y-%m-%d %H:%M:%S")
        print(f"* 发送时间:{sent_time}")
        found = True
        # 如果只需要找第一个匹配的邮件,找到后直接跳出循环
        break

if not found:
    print("已发送文件夹中未找到符合条件的邮件")

核心逻辑说明

  • 类型过滤:通过msg.Class == 43过滤掉已发送文件夹里非邮件类的内容,避免调用邮件专属属性时报错
  • 规则灵活:可以根据自己的需求替换匹配逻辑,也可以叠加发件人、收件人、正文关键字等其他筛选条件
  • 性能优化:如果已发送邮件数量非常多,可打开代码中的时间范围筛选注释,预先过滤历史邮件,大幅提升查询速度
  • 拓展性强:除了主题和发送时间,还可以直接调用msg.To(收件人)、msg.Body(正文)、msg.Attachments(附件)等属性提取其他需要的内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:15:03