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

如何搜索Outlook邮件正文文本并提取对应FX数据赋值给新变量

解决方案

首先你现有代码存在2个逻辑问题需要先修正:

  1. 存在性判断写法错误:if FX_volume1 and FX_volume2 in message.body的实际逻辑是「判断FX_volume1非空,且FX_volume2在正文里」,无法校验两个品种同时存在
  2. 循环跳出逻辑错误:只要遇到第一封主题不符合的邮件就直接终止遍历,会漏掉符合要求的历史邮件

接下来提取数值可以用「按行拆分匹配」的方案,适配你给出的逗号分隔每行格式,实现逻辑如下:

  • 把邮件正文按换行符拆分为独立行
  • 每行按逗号切割为「品种标识」和「数值」两部分
  • 匹配到目标品种后,把对应数值赋值给新变量
  • 匹配到两个变量后直接终止遍历,提高效率

也可以用正则匹配的方案,兼容行内有多余空格、品种后缀的场景。

下面是修改后的完整可运行代码:

import win32com.client
import re

# 配置要查找的品种
FX_volume1 = "BWP/USD"
FX_volume2 = "CHF/AMD"

# 初始化存储结果的变量
bwp_value = None
chf_value = None

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
messages.Sort("[ReceivedTime]", True)

# 最多遍历最近20封邮件,避免遍历全部邮箱浪费时间
max_check_count = 20
checked_count = 0

for message in messages:
    checked_count += 1
    if checked_count > max_check_count:
        break
    # 匹配主题
    if not message.subject.startswith("FX SPOT FIGURES"):
        continue
    # 校验两个品种都在正文里
    if FX_volume1 not in message.body or FX_volume2 not in message.body:
        continue
    # 提取正文开始处理
    data = message.body
    # 方案1:按行拆分匹配(格式固定时使用)
    for line in data.splitlines():
        line = line.strip()
        if not line or "," not in line:
            continue
        ticker, val = line.split(",", 1) # 只切第一个逗号,避免数值里带逗号出错
        ticker = ticker.strip()
        # 匹配品种赋值
        if ticker == FX_volume1:
            bwp_value = val.strip()
        # 如果品种可能带后缀比如示例里的CHF/AMD T,就改成startswith匹配
        elif ticker.startswith(FX_volume2):
            chf_value = val.strip()
    # 两个值都取到就跳出循环
    if bwp_value is not None and chf_value is not None:
        break

# 输出结果或后续调用
if bwp_value and chf_value:
    print(f"{FX_volume1}的数值:{bwp_value}")
    print(f"{FX_volume2}的数值:{chf_value}")
    # 后续直接使用bwp_value和chf_value变量即可
else:
    print(f"未找到{FX_volume1}或{FX_volume2}的对应数据")

如果需要更灵活的匹配,可以把提取部分替换为正则方案:

# 方案2:正则匹配(格式有波动时使用)
pattern1 = re.compile(rf"{re.escape(FX_volume1)}.*?,(\d+)")
pattern2 = re.compile(rf"{re.escape(FX_volume2)}.*?,(\d+)")
match1 = pattern1.search(data)
match2 = pattern2.search(data)
if match1:
    bwp_value = match1.group(1)
if match2:
    chf_value = match2.group(1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:36:06