Python使用纯文本或html发送电子邮件,但不能同时发送

问题描述

我正在尝试使用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()命令是多余的。