Python win32com如何提取Outlook邮件指定行内容写入Excel
实现方案
直接修正你现有代码的语法问题,补充指定行文件名提取、导出Excel的完整逻辑。
原有代码待修正点
- API拼写/语法错误:
cliet.Dispaatch修正为client.Dispatch,原代码错误用逗号分隔GetNameSpace调用,改为链式点调用 - 变量未定义问题:调用
Restrict方法前没有定义mailbox变量,实际应该对定位到的文件夹条目对象prod_path执行筛选 - 筛选规则拼写错误:SQL命名空间里的
httmail修正为标准httpmail,主题模糊匹配需要在关键词前后加%通配符
文件名提取逻辑
你的邮件正文中文件名所在行格式固定为[前缀] - [文件名],下一行固定为count统计行,两种实现方式可按需选择:
- 按行分割匹配(推荐,容错性高):将邮件正文按换行符拆为逐行列表,遍历找到带
-分隔符且不属于count行的内容,分割后取后半段即为文件名,可兼容文件名本身带-的场景 - 正则匹配:用正则规则
r'-\s+(.+?)(?=\n.*count|$)'直接捕获分隔符后的文件名内容,代码更简洁
完整可运行代码
import pandas as pd import win32com.client as client import re # 连接本地Outlook应用 outlook = client.Dispatch("Outlook.Application").GetNameSpace("MAPI") # 定位目标邮箱文件夹,将"emailId"替换为你自己的邮箱地址 prod_path = outlook.Folders("emailId").Folders[1].Items # 按主题筛选目标邮件,将'%subject%'中的subject替换为实际要匹配的主题关键词 mailbox = prod_path.Restrict("@SQL=(urn:schemas:httpmail:subject like '%subject%')") result_list = [] for mail in mailbox: mail_body = mail.body file_name = "" # ------------ 文件名提取逻辑 ------------ # 方式1:按行遍历匹配(优先用这个) # 先把正文拆成非空行列表,去掉每行首尾空白 lines = [line.strip() for line in mail_body.split('\n') if line.strip()] for line in lines: if ' - ' in line and 'count' not in line.lower(): # 只按第一个分隔符切割,避免文件名本身带横杠被误切 file_name = line.split(' - ', 1)[1].strip() break # 方式2:正则匹配(行格式完全固定时可替换使用,注释掉上面方式1的代码即可) # match_result = re.search(r'-\s+(.+?)(?=\n.*- count|$)', mail_body, re.S) # if match_result: # file_name = match_result.group(1).strip() # ---------------------------------------- if file_name: result_list.append({ "文件名": file_name, "邮件主题": mail.Subject, "发送时间": mail.SentOn }) # 批量写入Excel文件 df = pd.DataFrame(result_list) df.to_excel("邮件提取文件名结果.xlsx", index=False)
使用说明
- 代码中
emailId、%subject%两个占位符需要替换为你实际的邮箱地址、要筛选的邮件主题关键词 - 如果文件名所在行位置完全固定(永远是正文第6行),可以直接用
lines[5].split(' - ',1)[1].strip()取值,执行效率更高 - 如果邮件正文格式有微调,优先调整按行匹配的判断规则,比正则的适配成本更低
内容的提问来源于stack exchange,提问作者Rohan -
相关产品推荐
相关产品推荐

