使用win32com调用Outlook发pandas DataFrame附件邮件报错如何解决?
问题根因
- 你的代码中
df_merged.to_csv未加括号,传递的是方法对象本身而非执行结果 win32com.client调用Outlook的Attachments.Add方法时,Source参数仅支持传入本地文件的路径字符串,不支持直接传递内存中的DataFrame对象或文件内容
可行方案
方案1:手动保存本地文件(适合需要留存附件备份的场景)
先将DataFrame导出为本地csv/Excel文件,再将文件路径传入附件添加接口,代码示例如下:
import win32com.client import os import pandas as pd # 1. 将DataFrame导出为本地csv,指定编码避免中文乱码 save_path = "merged_data.csv" df_merged.to_csv(save_path, index=False, encoding="utf-8-sig") # 如果需要导出Excel,替换为以下代码即可 # save_path = "merged_data.xlsx" # df_merged.to_excel(save_path, index=False) # 2. 邮件发送逻辑 outlook = win32com.client.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.To = 'abc@abc.com' mail.Subject = 'Sample Email' mail.Body = '''Please find data attached and below.\n Hello! This is the body''' # 传入本地文件绝对路径,避免找不到文件 mail.Attachments.Add(Source=os.path.abspath(save_path)) mail.Send() # 不需要留存本地文件的话,发送完成后可删除 # os.remove(save_path)
方案2:临时文件自动清理(适合不需要留存附件的场景)
使用Python内置的tempfile库生成临时文件,发送完成后自动删除,不会留下冗余本地文件:
import win32com.client import tempfile import os # 生成临时csv文件 with tempfile.NamedTemporaryFile(suffix=".csv", delete=False) as tmp_file: tmp_path = tmp_file.name df_merged.to_csv(tmp_path, index=False, encoding="utf-8-sig") # 邮件发送逻辑 outlook = win32com.client.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.To = 'abc@abc.com' mail.Subject = 'Sample Email' mail.Body = '''Please find data attached and below.\n Hello! This is the body''' mail.Attachments.Add(Source=tmp_path) mail.Send() # 自动删除临时文件 os.unlink(tmp_path)
注意事项
- 导出csv时若包含中文内容,必须指定
encoding="utf-8-sig",否则用Excel打开附件会出现乱码 - 传入文件路径时建议通过
os.path.abspath()转换为绝对路径,避免工作目录变动导致的文件找不到报错 - 若需要发送多Sheet的Excel附件,可通过
pd.ExcelWriter生成多Sheet文件后再传入路径即可
内容的提问来源于stack exchange,提问作者suhabari
相关产品推荐
相关产品推荐

