解决邮件HTML以附件呈现问题:实现HTML与纯文本同时渲染
解决邮件HTML变附件、实现双格式渲染的问题
- 核心问题:你用的
MIMEMultipart("mixed")是用来包含附件+邮件内容的多部分类型,会把HTML/纯文本当成独立附件处理,这就是达不到预期的原因。 - 正确方案:改用
MIMEMultipart("alternative"),这个类型专门用于提供同一内容的不同格式版本(纯文本、HTML),邮件客户端会自动选择合适的版本渲染,不会把HTML当成附件。
修正步骤
- 把创建多部分容器的代码从
MIMEMultipart("mixed")改成MIMEMultipart("alternative") - 分别创建纯文本和HTML的
MIMEText对象,对应类型设为'plain'和'html' - 把这两个文本部分按纯文本在前、HTML在后的顺序添加到容器里(这是邮件协议的约定,别搞反)
示例代码
from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart # 创建正确类型的邮件容器 msg = MIMEMultipart("alternative") msg['Subject'] = "双格式测试邮件" msg['From'] = "发件人@example.com" msg['To'] = "收件人@example.com" # 纯文本内容 plain_content = "这是纯文本版本的邮件内容" plain_part = MIMEText(plain_content, 'plain') # HTML内容 html_content = """ <html> <body> <p>这是<b>加粗的HTML版本</b>邮件内容</p> </body> </html> """ html_part = MIMEText(html_content, 'html') # 按顺序添加到容器 msg.attach(plain_part) msg.attach(html_part) # 后续发送逻辑正常写就行
额外说明
如果之后需要加附件,得套两层:外层用MIMEMultipart("mixed"),内层用MIMEMultipart("alternative")放纯文本和HTML,再把附件添加到外层的mixed容器里,这样就不会影响双格式渲染了。
内容的提问来源于stack exchange,提问作者Satyam Gupta
相关产品推荐
相关产品推荐

