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
相关产品推荐
相关产品推荐

