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

如何提取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("未找到符合条件的邮件")

说明

  1. 所有可修改的配置都统一放在了代码开头的配置区域,后续需要新增提取的水果品类,直接往SEARCH_FRUITS列表加元素即可
  2. 代码会遍历收件箱里所有主题匹配的历史邮件,不会只处理最新的一封,适合回溯历史数据
  3. 全程无本地文件IO操作,不需要生成大量txt文件,运行效率更高
  4. 日期直接从邮件正文的报告日期提取,不会出现和实际数据日期不匹配的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:15:04