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

Python使用email.message模块无法在邮件正文插入图片问题咨询

Python email模块嵌入图片到邮件正文的解决方案

你当前代码的问题在于HTML中直接引用了本地路径的图片文件,收件人的邮件客户端无法访问你本地设备上的图片资源,因此只会加载alt提示文本。要实现图片内嵌到正文,需要通过CID(Content-ID)关联内嵌的图片资源,改用MIME多部分结构来构造邮件即可,具体实现代码如下:

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

def send_email(From, to_email, passw, img_path="image_name.jpg"):  
    # 构造多部分消息容器,subtype设为related来关联HTML和内嵌资源
    msg = MIMEMultipart('related')
    msg['Subject'] = "subject"
    msg['From'] = From
    msg['To'] = to_email
    password = passw

    # HTML正文中img的src用cid: + 自定义的资源ID来引用
    body = """
    <p>Text blabla </p>
    <img src="cid:embedded_img" alt="loading problem" width=400 height=560>
    """
    # 添加HTML正文部分
    msg.attach(MIMEText(body, 'html', 'utf-8'))

    # 读取本地图片并构造MIMEImage对象
    with open(img_path, 'rb') as f:
        img = MIMEImage(f.read())
    # 给图片设置Content-ID,和HTML中的cid对应,注意需要包裹尖括号
    img.add_header('Content-ID', '<embedded_img>')
    # 设置为内联资源,不会被识别为附件
    img.add_header('Content-Disposition', 'inline', filename=img_path.split('/')[-1])
    msg.attach(img)

    s = smtplib.SMTP('smtp.gmail.com: 587')
    s.starttls()
    s.login(msg['From'], password)
    s.sendmail(msg['From'], [msg['To']], msg.as_string())
    s.quit()
    print('Email sent')

关键说明

  • 必须使用multipart/related类型的消息容器,才能同时承载HTML内容和内嵌的关联资源
  • 图片的Content-ID取值需要和HTML中cid:后面的标识严格对应,设置Content-ID时必须包裹尖括号
  • 图片路径建议使用绝对路径,避免相对路径读取文件失败
  • 若使用Gmail发信,需要先开启账号的两步验证,再生成专用的应用密码用于登录,无法直接使用账号原密码登录SMTP服务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:45:03