如何提取Outlook特定主题邮件正文数据并格式化存入DataFrame
优化实现方案
核心优化点:
- 去掉txt中转步骤,直接处理邮件正文字符串,无需生成本地文件
- 支持批量遍历所有符合主题的历史邮件,一次性回溯所有历史数据
- 统一配置水果搜索列表,新增品类直接往列表添加即可,无需修改其他逻辑
- 修复原代码的逻辑bug:包括判断关键词存在的错误写法、未定义变量问题,同时直接从邮件正文提取报告日期,避免和实际数据日期不一致
完整可运行代码
import win32com.client import pandas as pd # -------------------------- 配置项 可按需修改 -------------------------- # 需要提取的水果列表,新增品类直接往这里加元素即可 SEARCH_FRUITS = ["Apples", "Pears", "Lemons", "Oranges", "Tomatoes"] # 匹配的邮件主题 TARGET_SUBJECT = "FRUIT QUANTITIES" # ---------------------------------------------------------------------- def get_vals(mail_body: str, searches: list) -> dict: """直接从邮件正文字符串提取目标字段,无需读写本地文件""" dct = {} # 拆分邮件正文为逐行处理 for line in mail_body.strip().split('\n'): line = line.strip() if not line: continue term, *value = line.split(',') term = term.strip() # 提取并转换报告日期 if term == "Date of report:": raw_date = value[0].strip() dct['date'] = pd.to_datetime(raw_date, format='%d-%b-%Y').strftime('%m-%d-%Y') # 匹配水果销量 if term in searches: dct[term] = float(value[0].strip()) if value else None # 补全未找到的水果字段,统一设为None for fruit in searches: if fruit not in dct: dct[fruit] = None return dct # 初始化Outlook outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox = outlook.GetDefaultFolder(6) messages = inbox.Items messages.Sort("[ReceivedTime]", True) all_results = [] # 遍历所有邮件处理 for message in messages: if message.subject != TARGET_SUBJECT: continue # 可选校验:如果不需要校验所有水果都存在,可删掉这部分判断,缺失值会自动设为None if not all(fruit in message.body for fruit in SEARCH_FRUITS): print(f"邮件(接收时间:{message.ReceivedTime.strftime('%Y-%m-%d %H:%M')})缺失目标水果数据,已跳过") continue # 提取数据 mail_data = get_vals(str(message.body), SEARCH_FRUITS) all_results.append(mail_data) # 生成最终DataFrame if all_results: fruit_vals = pd.DataFrame(all_results) # 列名转大写(和原代码逻辑保持一致,不需要可删掉) fruit_vals = fruit_vals.rename(columns=lambda z: z.upper()) print(fruit_vals) # 可按需导出为csv或存入数据库 # fruit_vals.to_csv("fruit_sales_history.csv", index=False) else: print("未找到符合条件的邮件")
说明
- 所有可修改的配置都统一放在了代码开头的配置区域,后续需要新增提取的水果品类,直接往
SEARCH_FRUITS列表加元素即可 - 代码会遍历收件箱里所有主题匹配的历史邮件,不会只处理最新的一封,适合回溯历史数据
- 全程无本地文件IO操作,不需要生成大量txt文件,运行效率更高
- 日期直接从邮件正文的报告日期提取,不会出现和实际数据日期不匹配的问题
内容的提问来源于stack exchange,提问作者alec22
相关产品推荐
相关产品推荐

