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

Python实现HTML邮件内嵌图片时如何避免图片同时成为附件?

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

你的问题根源在于两处不当操作:

  • 手动调用msg.make_mixed()强制邮件转为mixed类型,该类型下直接附加的内容默认会被标记为附件
  • 添加图片时未明确指定资源为内嵌显示,导致邮件客户端将其识别为普通附件

按以下方式修改代码即可解决:

  1. 删除msg.make_mixed()行,EmailMessage会自动根据内容生成合适的多部分结构
  2. 给MIMEImage对象添加Content-Disposition头,明确标记为inline(内嵌),配合Content-ID供HTML引用

修改后的完整代码:

#!/usr/bin/python3

import smtplib
from email.message import EmailMessage
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.audio import MIMEAudio
import mimetypes

strFrom = 'Me@some.com'
strPWord = 'XYZ'
strTo = 'Recipient@GMail.com'

msg = EmailMessage()
msg['Subject'] = 'This is a test at 1:22'
msg['From'] = strFrom 
msg['To'] = strTo 
msg.set_content('''
<!DOCTYPE html>
<html>
    <body>
                    <p><img src="cid:image1"/></p>
                    <p>Python email test</p>
                    <p><img src="cid:image2"/></p>
    </body>
</html>
''', subtype='html')

# Attach Any Images
images = '''/Users/my/Desktop/RKw.jpeg\n/Users/my/Desktop/logo.png'''.splitlines()
i=1
for image in images:
    fp = open(image, 'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
    # 定义图片ID
    msgImage.add_header('Content-ID', f'<image{i}>')
    # 关键:设置为内嵌显示,避免被当成附件
    msgImage.add_header('Content-Disposition', 'inline', filename=f'image{i}.jpeg')
    msg.attach(msgImage)
    i+=1


# Attach any files
files = ''''''.splitlines()
for file in files:
    ctype, encoding = mimetypes.guess_type(file)
    if ctype is None or encoding is not None:
        ctype = 'application/octet-stream'
    maintype, subtype = ctype.split('/', 1)
    with open(file, 'rb') as fp:
        msg.add_attachment(fp.read(),
                           maintype=maintype,
                           subtype=subtype,
                           filename=file.split('/')[-1].replace(' ','%20'))
                               
                                                 
with smtplib.SMTP_SSL('smtpserver.com', 465) as smtp:
    smtp.login(strFrom, strPWord) 
    smtp.send_message(msg)

补充说明:

  • 后续添加普通附件时,直接使用msg.add_attachment()即可,EmailMessage会自动区分内嵌资源和普通附件
  • Content-Disposition中的filename参数为可选,仅用于指定图片文件名,不影响内嵌显示,但能提升不同邮件客户端的兼容性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:31:02