Python邮件正文嵌入图片 内联图片教程
用Python smtplib在邮件正文里内嵌显示图片,不是附件,而是直接出现在HTML正文中,使用CID引用,附完整代码与图片路径处理。
场景痛点
邮件里要放一张公司Logo、一张数据图表,直接当附件对方要下载才能看,体验差。想要图片直接出现在正文中间,像网页邮件那样——图片不单独显示为附件,而是嵌在文字段落里。
用到的库
# smtplib/email标准库,无需安装
完整代码
# -*- coding: utf-8 -*-
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.header import Header
SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465
SENDER = "your_account@qq.com"
AUTH_CODE = "your_smtp_auth_code"
RECEIVER = "receiver@example.com"
def send_inline_image(image_path):
# 1. 用related容器:正文+内嵌资源在同一封邮件里关联
msg = MIMEMultipart("related")
msg["From"] = Header(f"数据组 <{SENDER}>", "utf-8")
msg["To"] = Header(RECEIVER, "utf-8")
msg["Subject"] = Header("本周趋势图(内联图片)", "utf-8")
# 2. HTML正文,图片用cid:xxxx引用,cid值自己起一个
html = """
<html><body>
<p>你好,本周趋势图如下:</p>
<p><img src="cid:trend_chart" width="600"></p>
<p>如需原始数据请回复邮件。</p>
</body></html>
"""
msg.attach(MIMEText(html, "html", "utf-8"))
# 3. 读取图片,用Content-ID跟HTML里的cid对应
with open(image_path, "rb") as f:
img = MIMEImage(f.read())
img.add_header("Content-ID", "<trend_chart>")
# inline表示在正文内展示,不是下载附件
img.add_header("Content-Disposition", "inline",
filename=os.path.basename(image_path))
msg.attach(img)
# 4. 发送
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(SENDER, AUTH_CODE)
server.sendmail(SENDER, [RECEIVER], msg.as_string())
server.quit()
print("内联图片邮件发送成功")
if __name__ == "__main__":
send_inline_image("/data/chart/trend_week.png")
代码讲解
MIMEMultipart("related"):这是邮件MIME结构里专门用来把HTML正文和它依赖的图片/资源绑在一起的容器。- HTML里
<img src="cid:trend_chart">:这里的trend_chart必须和后面Content-ID头里的值一致(不带尖括号),邮件客户端才知道去内嵌资源里找这张图。 MIMEImage(f.read()):专门处理图片类型,自动设置Content-Type为image/png/jpeg,不用手动base64。Content-Disposition: inline:图片在正文里直接显示;如果写成attachment,就变成附件下载了。
运行结果
收件人打开邮件,正文中间直接看到趋势图,邮件附件区不会单独列出这张图片(部分邮箱会显示为内嵌资源,但用户不需要手动下载)。
注意事项
- 内联图片会被打包进邮件本身,每张图都会增加邮件体积,建议把图片压到200KB以内,单封邮件图片总量别超过2MB。
- 手机端Outlook对cid内联图支持还行,但有些老邮箱会把内嵌图显示成附件,要在多个客户端测一下。
- 另一种做法是把图片上传到公网服务器,HTML里直接写
https://xxx.com/a.png外链,邮件更小,但图片必须公网可访问,且会被邮件客户端默认拦截(对方要点"显示图片"才加载)。 - PNG、JPG都支持,GIF动图一般也能显示。

更新时间:2026-09-14 21:11:11