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

Python发送邮件:内嵌图片被识别为附件的问题求助

解决邮件内嵌图片被当作附件发送的问题

你的代码里有两个核心问题导致图片变成附件:

  • 使用了MIMEMultipart('alternative')类型,这种类型是用来提供纯文本和HTML版本的备选内容,不适合承载内嵌资源;
  • 没有添加引用该图片的HTML正文,邮件客户端不知道这张图是要内嵌到正文里的。

修正步骤:

  1. 将邮件容器改为MIMEMultipart('related'),这个类型专门用于包含HTML正文及其关联的内嵌资源(比如图片、样式);
  2. 添加HTML正文部分,在HTML中通过cid:image1引用图片的Content-ID(要和图片的Content-ID值一致);
  3. (可选)添加纯文本版本的正文,适配不支持HTML的邮件客户端;
  4. 移除代码中多余的]符号(msgImage.add_header那行末尾的错误符号)。

修正后的完整代码:

def send_email(recipients):
    # 使用related类型的多部分邮件容器
    msg = MIMEMultipart('related')
    msg['Subject'] = 'subject'
    msg['From'] = 'myemail@gmail.com'
    msg['To'] = ', '.join(recipients)

    # 创建HTML正文,通过cid引用内嵌图片
    html_body = """
    <html>
        <body>
            <p>这是内嵌图片:</p>
            <img src="cid:image1" alt="内嵌图片">
        </body>
    </html>
    """
    msg_html = MIMEText(html_body, 'html')
    msg.attach(msg_html)

    # (可选)添加纯文本备选内容
    text_body = "这是纯文本版本,你的邮件客户端不支持HTML显示"
    msg_text = MIMEText(text_body, 'plain')
    msg.attach(msg_text)

    # 处理内嵌图片
    with open('myimage.webp', 'rb') as fp:
        msgImage = MIMEImage(fp.read())
    # 设置Content-ID,供HTML引用
    msgImage.add_header('Content-ID', '<image1>')
    # 设置为inline,明确是内嵌而非附件
    msgImage.add_header('Content-Disposition', 'inline', filename='myimage.webp')
    msg.attach(msgImage)

    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp_server:
        smtp_server.login(config.EMAIL_USERNAME, config.EMAIL_PASSWORD)
        smtp_server.sendmail(config.EMAIL_USERNAME, recipients, msg.as_string())

函数调用不变:

send_email(['someone@somewhere.com'])

关键说明:

  • MIMEMultipart('related')会把HTML正文和内嵌资源绑定在一起,让邮件客户端识别它们的关联关系;
  • HTML里的cid:image1必须和图片的Content-ID完全一致(包括尖括号);
  • Content-Disposition: inline明确告诉客户端这是内嵌资源,不要当成附件处理。

内容的提问来源于stack exchange,提问作者Arshia Haeri-Mehrizi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:37:17