使用Python给多用户发不同内容Outlook邮件时遇KeyError问题
问题排查:Python发送Outlook邮件时的KeyError错误
错误核心原因
KeyError本质是pandas读取CSV后,找不到代码中引用的Name/Email_id列,具体触发场景包括:
- CSV文件的列名拼写与代码不匹配(比如实际是
name/EmailID,而非Name/Email_id) - CSV分隔符设置错误:代码指定
sep=';',但实际文件用逗号/制表符分隔 - CSV开头存在空行,导致列名被误读为数据行
- 编码不匹配导致列名读取乱码
解决步骤
1. 验证CSV文件的实际格式
直接打开content.csv,检查:
- 第一行列名是否准确为
Name、Email_id、Content - 列之间的分隔符是否为分号,与代码
sep=';'一致
2. 调试查看DataFrame实际列名
在代码的print(df)后添加一行,打印pandas实际读取到的列名:
print("当前DataFrame列名:", df.columns.tolist())
运行后对比输出结果与代码中使用的列名,就能快速定位是否存在拼写/大小写差异。
3. 修正列名或代码引用
如果CSV列名与代码不一致,要么修改CSV的列名,要么调整代码中的引用。比如CSV列名是姓名,则把df['Name']改为df['姓名']。
4. 修正分隔符设置
若CSV实际用逗号分隔,修改pd.read_csv的参数:
df = pd.read_csv(path, sep=',', encoding='cp1252')
不确定分隔符时,可使用sep='\s*,\s*'匹配带空格的逗号,或添加engine='python'让pandas自动检测分隔符。
5. 代码优化建议
- 将
outlook = win32com.client.Dispatch('outlook.application')移到循环外,避免重复创建Outlook实例 - 修正HTML语法错误:原代码中的
</>应为</font>,<t1>是无效标签,多余的</style>需删除,避免邮件显示异常
修正后的示例代码:
import pandas as pd import win32com.client import time path = r'c:\Users\Abc\Desktop\content.csv' df = pd.read_csv(path, sep=';', encoding='cp1252') print(df) print("当前DataFrame列名:", df.columns.tolist()) # 仅创建一次Outlook实例 outlook = win32com.client.Dispatch('outlook.application') for i in df.index: mail = outlook.CreateItem(0) mail.Subject = 'Test Mail' print(df['Name'][i], df['Email_id'][i]) mail.To = df['Email_id'][i] # 使用f-string简化HTML拼接,同时修正语法错误 mail.HTMLBody = f'''\ <html> <head></head> <body> <p>Hello {df['Name'][i]},<br> <p>Please refer to your score.<br> <div>{str(df['Content'][i])}</div> <font color='blue'><br>Thanks</font> <br><br> <font color='red'>Kindly do not reply to this email.</font> </p> </body> </html> ''' mail.Send() time.sleep(1) # 添加延迟避免发送过快触发限制
内容的提问来源于stack exchange,提问作者Peritchi
相关产品推荐
相关产品推荐

