HTML邮件图片无法显示,如何通过Python代码正确嵌入图片发送?
解决HTML邮件中图片无法显示的问题
问题原因
你当前HTML里用的是相对路径mysite/logo.svg,邮件客户端无法解析该路径;即使换成绝对URL,部分邮件服务商(比如Gmail)会自动代理图片,若图片权限受限或加载不稳定,仍可能显示异常。更可靠的解决方式是内联嵌入图片,或者使用可公开访问的完整绝对URL。
方案1:内联嵌入图片(推荐)
将图片作为邮件附件嵌入,通过cid标识在HTML中引用,步骤如下:
- 修改Python发送代码,添加图片附件并设置Content-ID:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() try: server.login(EMAIL_BOT, PASSWORD_BOT) msg = MIMEMultipart('related') # 需使用related类型关联HTML与内联资源 msg['From'] = EMAIL_BOT msg['To'] = email msg["Subject"] = name # 编写HTML内容,用cid引用图片 html_content = """ <div class="header__container "> <img src="cid:logo_image" alt="logo" class="header_img"> </div> """ part1 = MIMEText(html_content, 'html') msg.attach(part1) # 读取本地图片文件,创建MIMEImage对象并绑定cid with open("logo.svg", "rb") as img_file: img = MIMEImage(img_file.read()) img.add_header('Content-ID', '<logo_image>') # cid需与HTML中的标识对应 msg.attach(img) server.sendmail(EMAIL_BOT, email, msg.as_string()) except Exception as ex: print(ex)
- 注意事项:
- 确保图片文件路径正确,可使用绝对路径避免目录问题。
MIMEMultipart的类型必须设为related,才能让HTML与内联图片建立关联。- HTML中
src的cid:logo_image需与Content-ID的<logo_image>对应(去掉尖括号)。
方案2:使用公开可访问的绝对URL
若图片存放在公开服务器上,直接使用完整HTTPS路径:
<div class="header__container "> <img src="https://sherf201.pythonanywhere.com/logo.svg" alt="logo" class="header_img"> </div>
需注意:
- 确保该URL无权限限制,可被公开访问。
- 部分邮件客户端默认屏蔽外部图片,需收件人手动开启显示。
内容的提问来源于stack exchange,提问作者Sherlock_201
相关产品推荐
相关产品推荐

