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

Python发送邮件无法同时显示纯文本与HTML内容问题求助

嘿,我完全懂你碰到的这个困惑!其实这不是代码bug,而是MIMEMultipart('alternative')这个类型的设计逻辑导致的~

问题原因

alternative类型的多部分邮件,作用是给邮件客户端提供不同格式的备选内容。客户端会自动挑选它能支持的“最高级”格式来显示——通常HTML会被优先选中,所以纯文本版本就被隐藏了,除非收件人手动切换到纯文本视图,或者他们的客户端完全不支持HTML。你的代码本身是正确的,只是这个MIME类型的行为就是这样!

解决方案

分两种情况来看:

1. 想让客户端自动选择合适的格式(推荐的标准做法)

你的原代码其实没问题,只是需要知道:收件人如果用支持HTML的邮箱,只会看到HTML内容;如果用老式客户端或者手动切换视图,才会看到纯文本。另外,你漏了导入smtplib,还有with语句里不需要手动调用server.quit(),修正后的代码如下:

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib  # 补上缺失的导入

username = 'email_address'
password = 'password'

def send_mail(text, subject, from_email, to_emails):
    assert isinstance(to_emails, list)
    msg = MIMEMultipart('alternative')
    msg['From'] = from_email
    msg['To'] = ', '.join(to_emails)
    msg['Subject'] = subject

    txt_part = MIMEText(text, 'plain')
    msg.attach(txt_part)

    html_part = MIMEText("<h1>This is working</h1>", 'html')
    msg.attach(html_part)

    msg_str = msg.as_string()
    with smtplib.SMTP(host='smtp.gmail.com', port=587) as server:
        server.ehlo()
        server.starttls()
        server.login(username, password)
        server.sendmail(from_email, to_emails, msg_str)
        # with上下文会自动关闭连接,无需quit()

2. 想让收件人同时看到纯文本和HTML内容

如果你确实需要两种内容同时出现在邮件里(比如HTML在上,纯文本在下),那把MIMEMultipart的类型改成'mixed'就行:

# 只需要修改这一行
msg = MIMEMultipart('mixed')

这种类型是用来组合不同类型的邮件内容(比如正文+附件,或者不同格式的正文一起显示),客户端会把所有附加的内容依次展示出来。

小提醒

用alternative是行业通用的最佳实践,因为它能适配各种不同的邮件客户端,给收件人最好的体验~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:47:31