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

使用Python发送带富文本与内嵌图片邮件的异常问题求解

问题根因及修复方案

核心问题点

  • 多HTML片段独立挂载异常:你将两段文本、图片引用分为3个独立的MIMEText对象挂载,邮件客户端没有统一的多HTML块渲染规则,拼接时会出现布局错位、图片遮挡文字的问题。正确做法是将所有HTML内容合并为一个完整的字符串,仅挂载一个HTML类型的MIMEText对象。
  • 多部件类型配置错误:默认生成的MIMEMultipart类型为mixed,仅适合普通带附件的邮件,内嵌图片的HTML邮件需要指定类型为related,才能保证客户端正确关联CID对应的图片资源。
  • 文件编码缺失:读取Google Docs导出的HTML文件时未指定utf-8编码,系统默认编码和文件编码不一致会直接引发文字乱码。
  • 导出HTML冗余样式干扰:Google Docs导出的HTML自带大量全局样式规则,部分规则会误匹配普通文本,导致无意义的下划线出现。

修正后可运行代码

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

me = "myemail@gmail.com"
you = "youremail@gmail.com"

# 指定多部件类型为related,适配内嵌资源的HTML邮件
msg = MIMEMultipart('related')
msg['From'] = me
msg['To'] = you
msg['Subject'] = 'This is a test'

# 读取两段HTML内容,指定UTF-8编码避免乱码
with open('test_doc_part1.html', encoding='utf-8') as f:
    html1 = f.read()
with open('test_doc_part2.html', encoding='utf-8') as f:
    html2 = f.read()

# 合并所有HTML内容为一个整体,给图片增加自适应样式避免溢出
full_html = f"""
{html1}
<img src="cid:image1" style="max-width: 100%; display: block; margin: 10px 0;">
{html2}
"""
# 仅挂载一个合并后的HTML部分
msg.attach(MIMEText(full_html, 'html', 'utf-8'))

# 挂载内嵌图片,逻辑保持不变
with open('test_image.jpg', 'rb') as fp:
    image = MIMEImage(fp.read())
image.add_header('Content-ID', '<image1>')
msg.attach(image)

# 发件逻辑,注意Gmail现在需要使用应用密码而非账号明文密码
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(me, "你的Gmail应用密码")
server.sendmail(from_addr=me, to_addrs=you, msg=msg.as_string())
server.quit()

额外优化建议

你可以在导出Google Docs的HTML后,删除文件<head>标签内冗余的全局样式规则,仅保留正文内容的行内样式,可完全避免异常下划线的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 04:18:03