Python 以纯文本或 html 发送电子邮件,但不能同时发送两者

Python sending email with either plain text or html, but not both

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