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

如何让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}")

关键修改点讲解

  1. CSV附件筛选
    加了if attachment.FileName.lower().endswith(".csv")这行判断:

    • .lower():把文件名转成小写,就算附件是.CSV大写后缀也能识别
    • .endswith(".csv"):只保留以.csv结尾的文件,自动排除签名图片、文档等其他附件
  2. 修复路径硬编码问题
    原代码用字符串拼接路径(比如"U:\Downloads..." + attachment.FileName)容易因为转义符出错,改用os.path.join():它会根据系统自动用正确的路径分隔符,不用手动写斜杠,更稳妥。

  3. 动态获取文件名
    原代码硬写了attachmentfilename.csv,如果附件文件名变了,重命名就会失败。现在用os.path.splitext(attachment.FileName)[0]自动提取原文件名的主体部分,不管你的CSV叫什么名字,都能生成原文件名+日期.csv的新名称。

  4. 删除冗余代码
    原代码里的msg = inbox.Items和msgs = msg.GetLast()两行后面没用到,直接删掉就行,减少不必要的代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:05:39