You need to enable JavaScript to run this app. 如何用Python搜索整个Outlook邮箱提取指定主题的邮件
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python搜索整个Outlook邮箱提取指定主题的邮件

Outlook全邮箱任意层级文件夹搜索提取特定主题邮件实现方案

核心思路是通过递归函数遍历所有层级的文件夹,无需提前指定各级文件夹名称,可覆盖任意深度的子文件夹,同时兼容仅遍历收件箱或遍历整个邮箱两种需求。

完整实现代码

import win32com.client
import os
import re

# 配置项
save_path = 'C:/working path'
target_subject_prefix = 'Report on X'
# 设为True则遍历整个邮箱,设为False仅遍历收件箱下所有文件夹
scan_entire_mailbox = False

os.chdir(save_path)
# 初始化Outlook客户端
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
user_mail = outlook.Application.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress

# 处理文件名非法字符的工具函数
def sanitize_filename(filename):
    return re.sub(r'[\\/*?:"<>|]', "_", filename)

# 递归遍历文件夹的核心函数
def traverse_folder(folder):
    # 第一步:处理当前文件夹内的所有邮件
    print(f"正在扫描文件夹:{folder.Name}")
    for message in folder.Items:
        # 跳过非邮件类对象(比如日历邀请、任务等)
        if message.Class != 43:
            continue
        if message.Subject and message.Subject.startswith(target_subject_prefix):
            print(f"找到匹配邮件:{message.Subject}")
            safe_title = sanitize_filename(str(message.Subject))
            save_full_path = os.path.join(os.getcwd(), f"{safe_title}.msg")
            message.SaveAs(save_full_path)
        # 不需要的话可以注释掉跳过的打印,减少日志输出
        else:
            print("跳过非匹配邮件")
    # 第二步:递归遍历当前文件夹下的所有子文件夹
    for sub_folder in folder.Folders:
        traverse_folder(sub_folder)

# 确定遍历的根节点
if scan_entire_mailbox:
    root_folder = outlook.Folders[user_mail]
else:
    root_folder = outlook.Folders[user_mail].Folders["Inbox"]

# 启动遍历
traverse_folder(root_folder)

关键改动说明

  • 新增递归函数traverse_folder,每进入一个文件夹优先处理当前层级邮件,再自动遍历所有子文件夹,可支持无限层级的目录结构
  • 新增了非邮件对象过滤、文件名非法字符替换逻辑,避免运行时报错
  • 保留了遍历范围配置开关,可根据需求选择仅扫描收件箱或扫描整个邮箱所有文件夹(包括已发送、已删除、自定义文件夹等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 18:48:02