You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python脚本读取Outlook新邮件存文件避免覆盖:如何生成不同文件名?

解决Outlook新邮件脚本覆盖文件的问题

我来帮你搞定这个问题!你的脚本现在每次都用同一个固定文件名newEmail.txt,所以新邮件进来时会直接覆盖旧文件。咱们只需要给每封邮件生成唯一的文件名,就能避免这个情况啦。下面是几种实用的方案和修改后的代码:

核心思路

每次收到新邮件时,根据邮件的唯一标识(比如时间戳、邮件ID)或者可读信息(比如主题+时间)生成不重复的文件名,这样每封邮件都会保存为独立的文件。

修改后的代码示例(推荐方案)

这个方案结合了时间戳清理后的邮件主题,既保证文件名唯一,又能通过主题快速识别邮件内容:

import win32com.client
import pythoncom
from datetime import datetime

# 只定义保存目录,不用固定文件名
save_directory = "C:\\Users\\..\\....\\"

class Handler_Class(object):
    def OnNewMailEx(self, receivedItemsIDs):
        for ID in receivedItemsIDs.split(","):
            mailItem = outlook.Session.GetItemFromID(ID)
            
            # 1. 生成当前时间戳,确保文件名唯一
            current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
            
            # 2. 清理邮件主题中的非法文件名字符(Windows文件名不能包含/:*?"<>|)
            cleaned_subject = mailItem.Subject.replace("/", "_").replace("\\", "_")
            cleaned_subject = cleaned_subject.replace(":", "_").replace("*", "_").replace("?", "_")
            cleaned_subject = cleaned_subject.replace('"', "_").replace("<", "_").replace(">", "_").replace("|", "_")
            
            # 3. 组合成最终的文件名
            file_name = f"email_{current_time}_{cleaned_subject}.txt"
            full_file_path = save_directory + file_name
            
            # 4. 写入文件(用with上下文管理器,自动关闭文件更安全)
            with open(full_file_path, "w", encoding="utf-8") as file:
                file.write(mailItem.SenderEmailAddress + "\n")
                file.write(mailItem.Subject + "\n")
                file.write(mailItem.Body + "\n")

outlook = win32com.client.DispatchWithEvents("Outlook.Application", Handler_Class)
pythoncom.PumpMessages()

其他可选方案

如果你更追求绝对的唯一性,或者不想处理主题的清理,可以试试这两种:

方案1:使用邮件的唯一ID

Outlook中每封邮件的ID是全局唯一的,直接用它做文件名的一部分:

# 替换文件名生成部分
file_name = f"email_{ID}.txt"
full_file_path = save_directory + file_name

优点:绝对不会重复;缺点:文件名很长,可读性差。

方案2:仅使用时间戳

如果你的邮件接收频率不会快到同一秒收到多封,直接用时间戳足够;加上微秒后缀还能处理同一秒内收到多封的情况:

file_name = f"email_{datetime.now().strftime('%Y%m%d_%H%M%S_%f')}.txt"

额外注意点

  • 加上encoding="utf-8":避免中文邮件内容出现乱码问题。
  • 检查目录权限:确保脚本有写入save_directory的权限,不然会报错。
  • with open()代替手动close():上下文管理器会自动处理文件关闭,避免资源泄漏。

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

火山引擎 最新活动