Python遍历Outlook多文件夹删除30天前旧邮件实现方法
Python实现Outlook多文件夹30天以上旧邮件批量删除
核心调整思路
原有代码仅硬编码了单个目标文件夹路径,无法批量处理多目录。调整时将单文件夹的筛选、删除逻辑抽为通用可复用逻辑,配合目标文件夹列表遍历即可实现多文件夹批量清理,同时修复原代码存在的冗余初始化、正序删除漏删等问题。
可直接运行的完整代码
import datetime as dt import win32com.client as win32 # 初始化Outlook会话,移除原代码重复创建的冗余对象 outlook = win32.dynamic.Dispatch('Outlook.Application').GetNamespace('MAPI') mail_root = outlook.Folders['sally_smith@gmail.com'].Folders['Inbox'].Folders['New'] # 配置项:在此处增删需要处理的目标文件夹名即可 target_folders = ['Clients', 'Reports'] # 配置项:邮件保留天数,当前设置为30天 retain_days = 30 cutoff_time = dt.datetime.now() - dt.timedelta(days=retain_days) # 适配Outlook查询规则的时间格式 filter_str = "[ReceivedTime] < '" + cutoff_time.strftime('%d/%m/%Y') + "'" for folder_name in target_folders: # 校验文件夹是否存在,避免单个文件夹不存在时整个任务中断 if folder_name not in [f.Name for f in mail_root.Folders]: print(f"警告:未找到文件夹 {folder_name},跳过处理") continue current_folder = mail_root.Folders[folder_name] # 筛选符合删除条件的旧邮件 to_delete_mails = current_folder.Items.Restrict(filter_str) # 倒序遍历删除,避免正序删除时集合索引偏移导致漏删 for idx in range(to_delete_mails.Count, 0, -1): mail = to_delete_mails.Item(idx) mail.Delete() print(f"文件夹 {folder_name} 旧邮件清理完成")
关键修改说明
- 清理原代码重复导入
datetime、重复创建Outlook实例的冗余逻辑,执行效率更高 - 所有可配置项(目标文件夹列表、邮件保留天数)统一放在代码开头,后续调整规则不需要改动核心处理逻辑
- 新增文件夹存在性校验,单个文件夹路径异常不会中断整个清理任务
- 修复原代码正序遍历删除邮件的索引偏移bug,不会出现漏删情况
- 如果目标文件夹分布在不同父目录下,只需把每个文件夹的完整获取路径写入遍历列表,替换当前同根目录遍历逻辑即可适配
内容的提问来源于stack exchange,提问作者Sally
相关产品推荐
相关产品推荐

