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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:57:02