在使用 email/smtplib 发送的邮件中结合纯文本和 HTML

Posted

技术标签:

【中文标题】在使用 email/smtplib 发送的邮件中结合纯文本和 HTML【英文标题】:Combining plain text and HTML in a mail sent with email/smtplib 【发布时间】:2016-06-03 07:47:27 【问题描述】:

使用here 给出的示例,我已经written some code 发送了一封在页脚中带有超链接的大部分纯文本电子邮件:

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 电子邮件的客户端获取文本。 【参考方案1】:

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

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

因此,您也需要将您的消息包含在 HTML 部分中,可能是转义或其他 HTML 格式。

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

【讨论】:

以上是关于在使用 email/smtplib 发送的邮件中结合纯文本和 HTML的主要内容,如果未能解决你的问题,请参考以下文章

在 apache 2.4 中结合子文件夹的 ip 和用户身份验证限制

使用 Java 发送邮件

在Outlook的已发送文件夹中找不到使用javamail发送的邮件

如果使用 symfony 邮件程序在用户设置中更改电子邮件,则发送确认电子邮件

在发送邮件之前选择电子邮件帐户?

Java发送邮件