求助:如何用Python 3.6复制/同步Outlook 2010默认文件夹下的子文件夹
访问Outlook默认文件夹的子文件夹并同步到外部目录
嘿,Nicholas!很高兴你已经搞定了访问Outlook默认文件夹和复制收件箱邮件的部分——那接下来搞定层级更低的子文件夹就没那么难啦。核心思路是递归遍历Outlook文件夹的层级结构,同时在本地创建对应的目录,再把每个文件夹里的邮件同步过去。
步骤1:获取默认文件夹的子文件夹
Outlook的每个Folder对象都有Folders属性,它包含了当前文件夹下所有的直接子文件夹。比如你已经能获取收件箱(inbox = outlook.GetNamespace("MAPI").GetDefaultFolder(6)),那inbox.Folders就是收件箱下的所有子文件夹集合。
步骤2:递归遍历所有层级的子文件夹
因为子文件夹可能还有自己的子文件夹,所以用递归函数来遍历是最方便的。下面是完整的示例代码,包含连接Outlook、递归遍历、创建本地目录、同步邮件的逻辑:
import os import win32com.client def sync_outlook_folder(outlook_folder, local_root_path): # 创建对应的本地目录 local_folder_path = os.path.join(local_root_path, outlook_folder.Name) if not os.path.exists(local_folder_path): os.makedirs(local_folder_path) # 同步当前文件夹的邮件到本地 for item in outlook_folder.Items: # 只处理邮件类型(避免日历、任务等其他项) if item.Class == 43: # 43是Outlook中MailItem的类编号 # 自定义保存文件名,替换特殊字符避免出错 subject = item.Subject.replace('/', '_').replace('\\', '_').replace(':', '_') received_time = item.ReceivedTime.strftime("%Y%m%d_%H%M%S") save_path = os.path.join(local_folder_path, f"{received_time}_{subject}.msg") item.SaveAs(save_path, 3) # 3表示保存为标准.msg格式 # 递归处理嵌套的子文件夹 for subfolder in outlook_folder.Folders: sync_outlook_folder(subfolder, local_root_path) if __name__ == "__main__": # 连接Outlook应用 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") # 获取目标默认文件夹,这里以收件箱为例,可替换为其他文件夹编号 # 常用编号:收件箱(6)、草稿箱(3)、已发送邮件(5)、垃圾邮件(2) target_default_folder = outlook.GetDefaultFolder(6) # 本地同步根目录,替换成你实际需要的路径 local_root = r"C:\Outlook_Sync_Files" # 启动同步 sync_outlook_folder(target_default_folder, local_root)
关键细节说明
- Outlook默认文件夹编号:你可以根据需求替换
GetDefaultFolder()里的参数,比如已发送邮件用5,草稿箱用3。 - 邮件类型过滤:用
item.Class == 43确保只同步邮件,避免误处理日历、联系人等非邮件项。 - 文件名安全处理:邮件主题常包含
/、:等系统不允许的字符,提前替换成下划线能避免创建文件时出错。 - 递归遍历:函数会自动处理所有嵌套层级的子文件夹,完全复刻Outlook里的文件夹结构到本地。
如果之后需要做增量同步(只同步新增邮件),可以在本地记录已同步邮件的EntryID(Outlook中每个邮件的唯一标识),下次同步时跳过已存在的条目——这属于进阶优化,先搞定基础全量同步后再考虑也不迟。
内容的提问来源于stack exchange,提问作者Nicholas O'Brien
相关产品推荐
相关产品推荐

