使用Python从Outlook下载附件时同名文件被覆盖仅存单个文件问题求助
解决方案:Outlook附件下载同名覆盖问题
问题原因
保存附件时直接使用原始文件名写入目标目录,同名文件会被后写入的内容直接覆盖,导致仅保留最后一份同名附件。
修改方案
- 新增生成唯一文件名的工具函数,自动为重复文件添加序号后缀
- 修复原代码缺失的模块导入问题
- 保存附件前先生成唯一存储路径,避免覆盖
完整修改后代码
from datetime import date, datetime, timedelta import os import win32com.client # 请自行定义这两个变量的取值 file_location = "你的本地存储根目录" date_file = "你用来分类的日期文件夹名" path = os.path.expanduser(os.path.join(file_location, date_file)) # 目标目录不存在则自动创建 os.makedirs(path, exist_ok=True) outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox = outlook.GetDefaultFolder(6) # 指向收件箱根目录 inbox = inbox.Folders['folder 1'] # 指向收件箱下的子文件夹,可根据实际名称修改 messages = inbox.Items # 生成唯一文件名的工具函数,重复文件自动加序号后缀 def get_unique_path(target_folder, filename): base_name, ext = os.path.splitext(filename) counter = 1 save_path = os.path.join(target_folder, filename) # 路径存在则累加序号 while os.path.exists(save_path): save_path = os.path.join(target_folder, f"{base_name}({counter}){ext}") counter += 1 return save_path def saveattachments(): for message in messages: if message.Unread: # 可根据需求放开日期过滤条件 for attachment in message.Attachments: print(attachment.FileName) # 先生成唯一路径再保存 save_path = get_unique_path(path, attachment.FileName) attachment.SaveAsFile(save_path) # 标记邮件为已读 if message.Unread: message.Unread = False if __name__ == "__main__": saveattachments()
效果说明
同名附件会自动按序号命名,例如第一个a_file.pdf保存为原名,第二个保存为a_file(1).pdf,第三个保存为a_file(2).pdf,所有附件都可完整保留不会被覆盖。
内容的提问来源于stack exchange,提问作者Aps
相关产品推荐
相关产品推荐

