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

Python使用Win32com读取Outlook邮件提取案件号时列表索引报错如何解决

问题原因分析
  • 变量作用域错误:你将c = []定义在邮件遍历的for循环内部,每遍历一封新邮件,c都会被重置为空列表。当遍历到最后一封不包含案件编号的邮件时,re.findall返回空列表,内层追加逻辑不执行,循环结束后c就是空列表,调用c[1]自然会报索引越界错误。
  • 遍历对象未定义:你代码中写的是for x in message.items,但前文并没有给message变量赋值,你实际要遍历的是ap文件夹下的所有邮件,应该替换为ap.Items,如果message变量实际为None,就会触发你遇到的NoneType不可下标访问的错误。
  • 冗余逻辑:内层遍历匹配结果的循环完全没有必要,re.findall本身就返回匹配结果的列表,直接用extend方法追加到存储列表即可。
修复后的完整代码
import win32com.client as client
import re

outlook = client.Dispatch('Outlook.Application')
namespace = outlook.GetNameSpace('MAPI')
account = namespace.Folders['name@company.com']
inbox = account.Folders['Inbox']
ap = inbox.Folders['Dean Brown']

pattern = re.compile(r'CASE# \d{7}') # 优化正则写法,7个数字用\d{7}更简洁
# 把存储列表定义在循环外部,避免每次遍历被重置
case_numbers = []
mail_info = []

# 遍历ap文件夹下的所有邮件,注意Items首字母大写,win32com属性统一为驼峰命名
for mail in ap.Items:
    # 匹配主题中的案件编号
    matched = re.findall(pattern, mail.Subject)
    if matched:
        case_numbers.extend(matched)
        # 提取邮件正文,纯文本正文用Body,HTML格式正文用HTMLBody
        mail_info.append({
            "case_number": matched,
            "subject": mail.Subject,
            "body": mail.Body,
            "send_time": mail.ReceivedTime,
            "sender": mail.SenderName
        })

# 打印所有匹配到的案件编号
print(case_numbers)
# 访问指定编号直接用下标即可,比如第二个编号用case_numbers[1]
补充说明
  • 如果你需要同时存储案件编号和对应邮件的其他属性(发件人、发送时间等),直接操作mail_info列表即可,里面的每个字典对应一封匹配到的邮件的全部信息。
  • 不需要额外安装其他依赖,原有win32com库即可支持所有属性读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:04