如何读取Outlook收件箱的Excel邮件附件?优化代码适配全收件箱
解决Outlook邮件附件遍历与共享邮箱适配问题
原代码只在目标邮件位于收件箱顶部时有效,核心问题是找到第一个匹配项就用break终止了循环,导致后续邮件不会被检查。下面是调整后的代码,可遍历所有收件箱邮件,按指定主题或附件文件名筛选目标邮件,同时支持共享邮箱适配:
from win32com.client import Dispatch import os import pandas as pd import datetime as dt # 初始化Outlook outlook = Dispatch("Outlook.Application").GetNamespace("MAPI") # --- 切换共享邮箱(可选,注释掉则用默认收件箱)--- # shared_email = "shared_mailbox@example.com" # recipient = outlook.CreateRecipient(shared_email) # recipient.Resolve() # inbox = outlook.GetSharedDefaultFolder(recipient, 6) # 6代表收件箱 # --- 默认收件箱 --- inbox = outlook.GetDefaultFolder(6) all_inbox = inbox.Items all_inbox.Sort("[ReceivedTime]", True) # 按接收时间倒序,最新的先处理 # 配置筛选条件 target_subject = "目标邮件主题" target_attachment = "目标文件名.xlsx" save_path = os.getcwd() # 附件保存路径 # 遍历所有邮件 for msg in all_inbox: try: # 检查主题是否匹配(忽略ASCII编码问题) subject_clean = msg.Subject.encode('ascii', 'ignore').decode('ascii') if target_subject in subject_clean: print(f"找到匹配主题的邮件: {subject_clean}") # 遍历附件 for att in msg.Attachments: if att.FileName == target_attachment: # 生成保存路径,避免重名可加时间戳 save_file = os.path.join(save_path, f"{dt.datetime.now().strftime('%Y%m%d_%H%M%S')}_{target_attachment}") att.SaveAsFile(save_file) print(f"附件已保存: {save_file}") # 读取Excel文件 df = pd.read_excel(save_file) # 这里可以添加后续处理逻辑,比如数据清洗、分析等 print("Excel文件读取完成") # 也可以直接按附件文件名筛选(不管主题) # for att in msg.Attachments: # if att.FileName == target_attachment: # # 处理逻辑同上 except Exception as e: print(f"处理邮件时出错: {str(e)}")
关键改动说明
- 移除循环终止的
break:确保遍历完所有收件箱邮件,不会漏掉符合条件的邮件 - 主题匹配逻辑优化:用
in替代find,更直观判断主题是否包含目标关键词 - 附件处理增强:添加时间戳避免重名覆盖,同时加入异常捕获,防止个别邮件处理失败导致程序崩溃
- 共享邮箱适配:通过
CreateRecipient和GetSharedDefaultFolder方法获取共享邮箱的收件箱,只需替换共享邮箱地址即可 - 邮件排序:按接收时间倒序排列,优先处理最新邮件(可根据需求调整)
注意事项
- 运行前需确保Outlook已登录,且有对应邮箱的访问权限
- 若共享邮箱无法访问,需确认Outlook中已添加该共享邮箱,且账号有读写权限
- 大附件或大量邮件可能会增加处理时间,可根据需求添加日期筛选(比如只处理近7天的邮件)
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

