如何用Python从Outlook提取主题部分可变的邮件附件?
解决Outlook邮件CSV附件提取的问题
错误原因
你用glob.glob()匹配邮件主题完全用错了——这个函数是用来查找本地文件系统中符合通配符的文件路径的,根本不是做字符串模糊匹配的工具。它返回的是一个列表,哪怕找到匹配项也是列表格式,和message.Subject这个字符串做==对比永远不会成立,自然不会执行后续的附件保存操作。
修正后的代码方案
方案1:用字符串前缀匹配(简单直接)
直接检查邮件主题是否以固定的"e-mail statement [今日日期]"开头,就能匹配后面带随机数字的目标邮件:
import win32com.client as win32 from datetime import date Date_fmt2 = date.today().strftime("%d/%m/%y") target_subject_prefix = f"e-mail statement {Date_fmt2}" # 替换为你的实际保存路径,用r前缀避免转义字符问题 save_path = r"C:\Your\Actual\Path\Statement " + Date_fmt2 + ".csv" outlook = win32.Dispatch('outlook.application').GetNamespace("MAPI") # 定位到目标文件夹 folder = outlook.Folders.Item(1).Folders.Item("Inbox").Folders.Item("Statements") messages = folder.Items # 遍历邮件并筛选 for message in messages: if message.Subject.startswith(target_subject_prefix): # 遍历附件,确保只保存CSV文件 for attachment in message.Attachments: if attachment.FileName.endswith(".csv"): attachment.SaveAsFile(save_path) print(f"CSV附件已保存到:{save_path}") break # 找到第一个CSV附件就停止,避免重复操作
方案2:用Outlook筛选器(大文件夹更高效)
如果目标文件夹里邮件数量多,用Outlook自带的Restrict方法提前筛选符合条件的邮件,比遍历所有邮件效率更高:
import win32com.client as win32 from datetime import date Date_fmt2 = date.today().strftime("%d/%m/%y") # Outlook的SQL筛选语法,用%匹配任意后缀 filter_str = f"@SQL=\"urn:schemas:httpmail:subject\" LIKE 'e-mail statement {Date_fmt2}%'" save_path = r"C:\Your\Actual\Path\Statement " + Date_fmt2 + ".csv" outlook = win32.Dispatch('outlook.application').GetNamespace("MAPI") folder = outlook.Folders.Item(1).Folders.Item("Inbox").Folders.Item("Statements") # 只保留符合主题条件的邮件 filtered_messages = folder.Items.Restrict(filter_str) for message in filtered_messages: for attachment in message.Attachments: if attachment.FileName.endswith(".csv"): attachment.SaveAsFile(save_path) print(f"CSV附件已保存到:{save_path}") break
额外优化提示
- 务必把代码里的
C:\Your\Actual\Path\替换成你真实的保存路径 - 如果同一天可能有多封符合条件的邮件,可以给保存文件名加序号(比如
Statement 01/01/24_1.csv),避免文件被覆盖 - 可以添加异常处理逻辑,比如检查保存路径是否存在,不存在则自动创建文件夹
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

