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

如何解决Python邮件内嵌图片显示为附件的问题?

解决邮件内嵌图片显示为附件的问题

嘿,我看了你的代码,问题很明确:你只是把图片作为独立的MIME部件添加到了邮件中,但没有在HTML正文中通过Content-ID(CID)关联它,所以邮件客户端会默认把它识别成附件,而不是内嵌内容。

要实现图片内嵌,你需要做两个关键修改:

步骤1:给图片设置Content-ID

给你的MIMEImage对象添加Content-ID头部,这个ID是你自定义的唯一标识,后续HTML会用它来引用图片;同时设置Content-Disposition为inline,明确告诉客户端这是内嵌内容:

# 图片处理
logo = "image1.png"
fp = open(logo, 'rb')
img = MIMEImage(fp.read())
fp.close()
# 添加Content-ID,注意格式要带尖括号
img.add_header('Content-ID', '<family_reunion_logo>')
# 标记为内嵌内容
img.add_header('Content-Disposition', 'inline', filename=logo)
msg.attach(img)

步骤2:在HTML正文中引用这个CID

修改你的HTML内容,添加<img>标签,src属性使用cid:你的Content-ID(注意去掉尖括号):

html = """\
<h1>Read this email header!</h1>
<p>看看我们的聚会标识:</p>
<img src="cid:family_reunion_logo" alt="Family Reunion Logo">
"""

完整修改后的代码

把这些修改整合到你的代码里,最终版本如下:

from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

COMMASPACE = ', '

# 创建容器(外层)邮件消息
msg = MIMEMultipart()
msg['Subject'] = 'Our family reunion'
me = "sender@email.com"
family = ["recipient1@email.com", "recipient2@email.com"]
msg['From'] = me
msg['To'] = COMMASPACE.join(family)
msg.preamble = 'Preamble'

# 修改后的HTML,内嵌图片引用
html = """\
<h1>Read this email header!</h1>
<p>这是我们的聚会标识:</p>
<img src="cid:family_reunion_logo" alt="Family Reunion Logo">
"""

# 图片处理:添加Content-ID和Disposition
logo = "image1.png"
fp = open(logo, 'rb')
img = MIMEImage(fp.read())
fp.close()
img.add_header('Content-ID', '<family_reunion_logo>')
img.add_header('Content-Disposition', 'inline', filename=logo)
msg.attach(img)

# 正文文本:使用HTML格式的内容
bodytext = MIMEText(html, 'html')
msg.attach(bodytext)

额外说明

  • 如果你需要同时保留图片作为附件和内嵌显示,可以添加另一个MIMEImage对象,将其Content-Disposition设置为attachment即可。
  • CID的名称可以自定义,但要确保HTML中的引用和Content-ID的内容(去掉尖括号)完全一致,否则图片无法正常加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:41:11