使用Python SMTPlib发送含文本与Excel表格邮件时文本不显示求助
问题:Python发送多格式邮件时纯文本内容不显示
我尝试用Python发送一封正文包含纯文本与Excel表格(以HTML形式嵌入)的邮件,代码如下。目前邮件能正常显示Excel表格,但设置的纯文本内容并未显示在邮件中,求解决办法。
import pandas as pd import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText msg = MIMEMultipart('alternative') msg['Subject'] = "Lists" msg['From'] = sender_email msg['To'] = receiver_email html = html_file text = "Hi, Please find attached the relevant data " msg.attach(MIMEText(text, 'plain')) msg.attach(MIMEText(html, 'html')) s = smtplib.SMTP('smtp.gmail.com',587) s.connect('smtp.gmail.com',587) s.ehlo() s.starttls() s.ehlo() s.login(sender_email, password) print("login success") s.sendmail(sender_email, receiver_email, msg.as_string()) print("email has been sent") s.quit()
解决方案
问题根源
使用MIMEMultipart('alternative')时,邮件客户端会优先加载最后附加的内容格式。你先附加了纯文本,再附加HTML,所以客户端默认显示HTML内容,纯文本被隐藏(并非丢失,客户端可切换到纯文本视图查看)。若要让两种内容同时显示,需调整邮件结构。
方法1:让纯文本与HTML同时显示(改用mixed类型)
将MIMEMultipart的类型改为mixed,并把纯文本和HTML放在一个alternative子容器中,确保两种格式都能被客户端识别:
import pandas as pd import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText msg = MIMEMultipart('mixed') msg['Subject'] = "Lists" msg['From'] = sender_email msg['To'] = receiver_email # 修正多行字符串写法,避免语法错误 text = """Hi, Please find attached the relevant data """ html = html_file # 创建子容器存放纯文本和HTML作为正文 body = MIMEMultipart('alternative') body.attach(MIMEText(text, 'plain')) body.attach(MIMEText(html, 'html')) msg.attach(body) # 发送逻辑不变 s = smtplib.SMTP('smtp.gmail.com',587) s.connect('smtp.gmail.com',587) s.ehlo() s.starttls() s.ehlo() s.login(sender_email, password) print("login success") s.sendmail(sender_email, receiver_email, msg.as_string()) print("email has been sent") s.quit()
方法2:将纯文本整合到HTML中
如果希望只显示HTML内容但保留提示文字,直接把纯文本内容嵌入HTML代码:
import pandas as pd import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText msg = MIMEMultipart('alternative') msg['Subject'] = "Lists" msg['From'] = sender_email msg['To'] = receiver_email # 把纯文本提示整合到HTML前 html = f""" <p>Hi,</p> <p>Please find attached the relevant data</p> {html_file} """ text = """Hi, Please find attached the relevant data """ msg.attach(MIMEText(text, 'plain')) msg.attach(MIMEText(html, 'html')) # 发送逻辑不变 s = smtplib.SMTP('smtp.gmail.com',587) s.connect('smtp.gmail.com',587) s.ehlo() s.starttls() s.ehlo() s.login(sender_email, password) print("login success") s.sendmail(sender_email, receiver_email, msg.as_string()) print("email has been sent") s.quit()
额外提示
alternative类型是提供内容的备选格式,客户端会选择最优格式(通常是HTML),因此两种内容不会同时显示,只能切换视图。- 原代码中的多行字符串写法有误(未用三引号),上述修正中已统一改为三引号包裹多行文本,避免语法错误。
内容的提问来源于stack exchange,提问作者Clay Burnett
相关产品推荐
相关产品推荐

