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

Python嵌入邮件的图表显示空白问题求助

问题分析与解决方案

核心问题排查

你的代码存在几个关键问题导致图片仅显示轮廓:

  • HTML结构错误(开头错误的</html>标签、VML标签嵌套混乱)
  • Matplotlib保存图片后未释放资源,可能导致图片文件不完整
  • HTML中CID引用格式错误(多余的引号)
  • 重复使用相同的id和o:spid属性,引发渲染冲突

修正后的完整代码

import win32com.client as win32
import seaborn as sns
import matplotlib.pyplot as plt

# 生成并保存图表,保存后关闭plt释放资源
sns.lineplot(x='Date', y='Total', hue="Company", data=df1)
plt.savefig('C:/MyDocs/Plot1.jpg')
plt.close()  # 释放图表资源,确保图片完整写入

sns.lineplot(x='Date', y='Total', hue="City", data=df2)
plt.savefig('C:/MyDocs/Plot2.jpg')
plt.close()

sns.lineplot(x='Date', y='Total', hue="Name", data=df3)
plt.savefig('C:/MyDocs/Plot3.jpg')
plt.close()

plot1 = 'C:/MyDocs/Plot1.jpg'
plot2 = 'C:/MyDocs/Plot2.jpg'
plot3 = 'C:/MyDocs/Plot3.jpg'

outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = myemail
mail.Subject = "Testing"  # 修复字符串缺失引号的语法错误

# 添加内嵌附件并设置Content-ID
attachment = mail.Attachments.Add(plot1, 0x5, 0, "display name1")
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "MyId")

attachment = mail.Attachments.Add(plot2, 0x5, 0, "display name2")
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "MyId2")

attachment = mail.Attachments.Add(plot3, 0x5, 0, "display name3")
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "MyId3")

# 修正后的HTML结构,使用标准img标签保证兼容性
html = """
<html>
<body>
<p class=MsoNormal><span lang=ES style='mso-ansi-language:ES'>Hello,<o:p></o:p></span></p>
Testing plots
<p class=MsoNormal><span lang=ES style='mso-ansi-language:ES'><o:p>&nbsp;</o:p></span></p>

<img src='cid:MyId' style='height:4.468in;width:6.697in;' alt="Plot 1">
<p></p>

<img src='cid:MyId2' style='height:4.468in;width:6.697in;' alt="Plot 2">
<p></p>

<img src='cid:MyId3' style='height:4.468in;width:6.697in;' alt="Plot 3">
</body>
</html>
"""

mail.HTMLBody = html
mail.Send()

关键修正点说明

  1. 修复HTML结构:移除开头错误的</html>标签,删除冗余的VML代码(多数邮件客户端支持标准<img>标签,VML仅针对旧版Outlook,反而易引发兼容问题)
  2. 释放Matplotlib资源:每次plt.savefig()后调用plt.close(),确保图片文件完整写入磁盘
  3. 修正CID引用格式:HTML中cid:后直接跟Content-ID值,不需要额外引号
  4. 修复语法错误:补充mail.Subject的字符串引号
  5. 避免元素冲突:移除重复的VML属性,防止DOM渲染异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:03:13