使用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
相关产品推荐
相关产品推荐

