问题描述
我正在尝试使用Python发送电子邮件。我遇到了一个问题,我无法在正文中发送纯文本和html,只能发送其中一个。如果同时附加了这两个部分,则仅显示HTML,而如果注释掉HTML部分,则将显示纯文本。
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
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)
server.quit()
解决方法
我实际上相信根据7.2 The Multipart Content-Type,您所编码的是正确的,并且电子邮件客户端会根据其功能(通常是HTML版本)选择它认为“最佳”的那个。使用“ mixed”会导致两个版本依次显示(假设存在该功能)。我在Microsoft Outlook中观察到文本版本成为附件。
要依次查看两者:
代替:
msg = MIMEMultipart('alternative')
使用:
msg = MIMEMultipart('mixed')
server.ehlo()
命令是多余的。