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

