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

