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




