Python通过MIME发Gmail邮件时HTML嵌入的txt文件不显示如何解决
原因分析
- 你当前HTML代码中
<object>标签的data属性指向本地路径的hi.txt,收件人接收邮件时本地设备不存在该文件,无法加载对应资源 - 所有主流邮件客户端都默认禁止加载本地文件资源,属于常规安全限制,即便收件人本地存在同名文件也无法正常渲染
解决方案
推荐优先使用第一种方案,兼容性最好:
方案1:直接读取txt内容嵌入HTML
不需要依赖外部资源引用,所有邮件客户端都可以正常显示。
- 先读取本地
hi.txt的文件内容:
# 读取本地txt文件内容 with open("hi.txt", "r", encoding="utf-8") as f: receipt_content = f.read()
- 替换HTML中原有的
<object>标签,用<pre>标签渲染文本内容,保留原有排版:
<pre style="font-family: monospace; background: #ffffff; padding: 15px; width: 500px; height: 300px; overflow-y: auto;"> {receipt_content} </pre>
如果你代码中已经定义了receipt变量存储回执内容,可以直接复用该变量,不需要重复读取文件。
方案2:将txt作为内嵌附件通过cid引用
如果必须保留<object>标签的实现方式,可以将txt设置为邮件内嵌资源,通过cid方式引用:
- 构造txt内嵌附件,添加Content-ID标识:
from email.mime.text import MIMEText # 读取txt文件构造内嵌资源 with open("hi.txt", "r", encoding="utf-8") as f: txt_data = f.read() txt_attachment = MIMEText(txt_data, "plain") # 设置Content-ID,HTML中通过cid引用 txt_attachment.add_header("Content-ID", "<hi_receipt>") txt_attachment.add_header("Content-Disposition", "inline", filename="hi.txt") # 附加到邮件 email.attach(txt_attachment)
- 修改HTML中
<object>标签的data属性:
<object data="cid:hi_receipt" type="text/plain" width="500" style="height: 300px"> <a href="cid:hi_receipt">下载回执</a> </object>
注意事项
- 方案2的
<object>标签在不同邮件客户端的支持度差异较大,部分客户端会直接屏蔽该标签的渲染,无特殊需求优先使用方案1 - 所有邮件的静态资源都不能使用本地路径,必须内嵌到邮件内容中,公网外链资源还会被多数邮件客户端默认拦截,嵌入内容是最稳妥的实现方式
内容的提问来源于stack exchange,提问作者petshop.py
相关产品推荐
相关产品推荐

