如何让Python代码仅选取Outlook邮件中的.csv附件而非图片?
解决Outlook邮件仅筛选CSV附件的问题
问题根源
你的代码会遍历邮件里的所有附件,包括链式邮件签名里的图片(比如.png、.jpg),所以才会出现只识别到图片的情况。核心要做的就是:只处理后缀为.csv的附件。
修改后的完整代码
import win32com.client import os import time # 连接到Outlook邮箱 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") folder = outlook.Folders.Item("myemail@gmail.com") inbox = folder.Folders.Item("Inbox") # 过滤条件:指定主题 + 带附件的邮件 Filter = ("@SQL=" + chr(34) + "urn:schemas:httpmail:subject" + chr(34) + " Like 'subjectofemail' AND " + chr(34) + "urn:schemas:httpmail:hasattachment" + chr(34) + "=1") Items = inbox.Items.Restrict(Filter) # 附件保存路径(用r开头的raw字符串,避免路径里的转义符出错) save_path = r"U:\Downloads\Foldername\Otherfolder" for Item in Items: for attachment in Item.Attachments: # 关键判断:只处理后缀为.csv的附件(兼容大写CSV) if attachment.FileName.lower().endswith(".csv"): print(f"找到目标CSV附件:{attachment.FileName}") # 拼接完整保存路径(自动处理Windows的斜杠问题) full_save_path = os.path.join(save_path, attachment.FileName) attachment.SaveAsFile(full_save_path) # 生成带日期的新文件名 timestr = time.strftime("%Y%m%d") # 提取不带后缀的原文件名(比如把"report.csv"变成"report") name_without_ext = os.path.splitext(attachment.FileName)[0] new_file_name = f"{name_without_ext} {timestr}.csv" new_full_path = os.path.join(save_path, new_file_name) # 避免重名覆盖,如果文件已存在就跳过 if os.path.exists(new_full_path): print(f"文件 {new_file_name} 已存在,跳过重命名") else: os.rename(full_save_path, new_full_path) print(f"已重命名为:{new_file_name}")
关键修改点讲解
CSV附件筛选
加了if attachment.FileName.lower().endswith(".csv")这行判断:.lower():把文件名转成小写,就算附件是.CSV大写后缀也能识别.endswith(".csv"):只保留以.csv结尾的文件,自动排除签名图片、文档等其他附件
修复路径硬编码问题
原代码用字符串拼接路径(比如"U:\Downloads..." + attachment.FileName)容易因为转义符出错,改用os.path.join():它会根据系统自动用正确的路径分隔符,不用手动写斜杠,更稳妥。动态获取文件名
原代码硬写了attachmentfilename.csv,如果附件文件名变了,重命名就会失败。现在用os.path.splitext(attachment.FileName)[0]自动提取原文件名的主体部分,不管你的CSV叫什么名字,都能生成原文件名+日期.csv的新名称。删除冗余代码
原代码里的msg = inbox.Items和msgs = msg.GetLast()两行后面没用到,直接删掉就行,减少不必要的代码。
内容的提问来源于stack exchange,提问作者Pete Cole
相关产品推荐
相关产品推荐

