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

Python使用纯文本或html发送电子邮件,但不能同时使用两者,python,email,smtplib,mimemultipart,Python,Email,Smtplib,Mimemultipart,我正在尝试使用Python发送电子邮件。我遇到了一个问题,无法在正文中发送纯文本和html,只能发送其中一个。如果我附加这两个部分,则只显示HTML,如果我注释掉HTML部分,则显示纯文本 我不知道为什么电子邮件不能同时包含这两个内容。代码如下所示: from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart username = 'email_address' password = '

我正在尝试使用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()
从email.mime.text导入MIMEText
从email.mime.multipart导入MIMEMultipart
用户名='电子邮件地址'
密码='password'
def发送电子邮件(文本、主题、从电子邮件到电子邮件):
断言isinstance(发送电子邮件、列表)
msg=MIMEMultipart('alternative')
msg['From']=来自您的电子邮件
msg['To']=','。加入(发送电子邮件)
msg['Subject']=主语
txt_part=MIMEText(文本“普通”)
附加信息(txt\U部分)
html_part=MIMEText(“这正在工作”,“html”)
msg.attach(html_部分)
msg_str=msg.as_string()
使用smtplib.SMTP(host='SMTP.gmail.com',port=587)作为服务器:
server.ehlo()
server.starttls()
server.login(用户名、密码)
sendmail(from_email,to_email,msg_str)
server.quit()

事实上,根据您编写的代码,我相信这是正确的,电子邮件客户端根据其功能选择它认为“最好”的,通常是HTML版本。使用“混合”会导致两个版本连续显示(假设该功能存在)。我在Microsoft Outlook中观察到,文本版本将成为附件

要连续查看这两个项目,请执行以下操作:

而不是:

msg = MIMEMultipart('alternative')
使用:


server.ehlo()
命令是多余的。

谢谢,这让它工作起来了!您知道为什么替代子类型不起作用吗?从我读到的内容来看,它用来表示内容相同,但格式不同,因此有两种不同的格式是合理的。事实上,
multipart/alternative
应该是正确的解决方案,而不是
multipart/mixed
。我可以推测你在接收端使用的是脑死的东西(Outlook?@tripleee是的,我用更好的解释更新了我的答案。好的,我读了你更新的解释,这很有意义。我使用的是Gmail客户端,我想它更喜欢HTML而不是纯文本。
msg = MIMEMultipart('mixed')