Python 在通过email/smtplib发送的邮件中结合纯文本和HTML

Python 在通过email/smtplib发送的邮件中结合纯文本和HTML,python,python-2.7,mime-types,mime,smtplib,Python,Python 2.7,Mime Types,Mime,Smtplib,使用给出的示例,我必须发送一封大部分为纯文本的电子邮件,邮件页脚处有一个超链接: def send_mail(subject, removed_ids, added_ids): parser = ConfigParser() parser.read('config.ini') from_address = parser.get('smtp', 'from') to_address = parser.get('smtp', 'to') subject =

使用给出的示例,我必须发送一封大部分为纯文本的电子邮件,邮件页脚处有一个超链接:

def send_mail(subject, removed_ids, added_ids):
    parser = ConfigParser()
    parser.read('config.ini')
    from_address = parser.get('smtp', 'from')
    to_address  = parser.get('smtp', 'to')
    subject = subject
    host = parser.get('smtp', 'host')
    port = parser.get('smtp', 'port')
    password = parser.get('smtp', 'password')

    msg = MIMEMultipart('alternative')
    msg['From'] = from_address
    msg['To'] = to_address
    msg['Subject'] = subject

    body = 'The following Instruction IDs have been removed:\n'
    for id in removed_ids:
        body = body + id + '\n'
    for id in added_ids:
        body = body + id + '\n'
    body = body + '\n'
    body = body + 'The following Instruction IDs have been added:\n'
    msg.attach(MIMEText(body, 'plain'))
    msg.attach(MIMEText(EMAIL_BODY_FOOTER_HYPERLINK_TO, 'html'))

    server = smtplib.SMTP(host, port)
    server.starttls()
    server.login(from_address, password)
    text = msg.as_string()
    server.sendmail(from_address, to_address, text)
    server.quit()
在我添加HTML部分之前,纯文本看起来很好。现在,在添加以下内容之后:

msg = MIMEMultipart('alternative')
msg.attach(MIMEText(body, 'plain'))
msg.attach(MIMEText(EMAIL_BODY_FOOTER_HYPERLINK_TO, 'html'))

HTML页脚现在已收到,但电子邮件完全缺少应在其前面的纯文本。我哪里出错了?

您误解了多部分消息的工作原理

客户端不会以任何方式“连接”明文和HTML部分两部分都应包含整个消息。HTML客户端将显示HTML部分。无法显示HTML的文本客户端将显示文本部分并忽略HTML部分

所以,您也需要将消息包含到HTML部分,可能是转义的,或者是HTML格式的


当然,也可以将您的URL包含到纯文本部分,只是不要将其包装到
标记中。大多数客户端都非常擅长检测明文电子邮件中的URL并突出显示它们,这样,收件人就不会因为使用纯文本电子邮件客户端而丢失任何内容。

您误解了多部分邮件的工作原理

客户端不会以任何方式“连接”明文和HTML部分两部分都应包含整个消息。HTML客户端将显示HTML部分。无法显示HTML的文本客户端将显示文本部分并忽略HTML部分

所以,您也需要将消息包含到HTML部分,可能是转义的,或者是HTML格式的


当然,也可以将您的URL包含到纯文本部分,只是不要将其包装到
标记中。大多数客户端都非常擅长检测明文电子邮件中的URL并突出显示它们,这样,收件人就不会因为使用纯文本电子邮件客户端而丢失任何内容。

也许我误解了该示例的意图。我猜它会发送两种不同类型的电子邮件。。因此,我的电子邮件客户端(配置为以HTML形式接收电子邮件)只接收页脚,而为计划文本配置的客户端只接收纯文本?是的,“替代纯文本版本”意味着不支持HTML电子邮件的客户端获取文本。也许我误解了该示例的意图。我猜它会发送两种不同类型的电子邮件。。因此,配置为以HTML形式接收电子邮件的电子邮件客户端只接收页脚,而配置为计划文本的客户端只接收纯文本?是的,“替代纯文本版本”表示不支持HTML电子邮件的客户端获取文本。