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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:45:02