【问题标题】:How to send an email with style in Python3?如何在 Python3 中发送带有样式的电子邮件?
【发布时间】:2014-07-27 10:58:29
【问题描述】:

我正在从 Python3 脚本发送电子邮件(使用 smtplib)。到目前为止,我总是在 Gmail 帐户中接收邮件。但问题是我无法显示 CSS 样式,尽管是内联的。而且,连这么简单的消息都发不出去:

title = 'My title'
msg_content = '<h2>{title}: <font color="green">OK</font></h2>\n'.format(title=title)

但是,如果我删除 {title} 之后的两个点,它会起作用。如果我在最后删除 \n 它将无法再次工作。为什么?如何在 Python3 中发送这样的行?

title = 'My title'
msg_content = '<h2>{title}: <span style="color: green">OK</span></h2>'.format(title=title)

编辑

import smtplib

msg_header = 'From: Sender Name <sender@server>\n' \
             'To: Receiver Name <receiver@server>\n' \
             'Cc: Receiver2 Name <receiver2@server>\n' \
             'MIME-Version: 1.0\n' \
             'Content-type: text/html\n' \
             'Subject: Any subject\n'
title = 'My title'
msg_content = '<h2>{title} > <font color="green">OK</font></h2>\n'.format(
    title=title)
msg_full = (''.join([msg_header, msg_content])).encode()

server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login('sender@server.com', 'senderpassword')
server.sendmail('sender@server.com',
                ['receiver@server.com', 'receiver@server.com'],
                msg_full)
server.quit()

【问题讨论】:

    标签: python python-3.x email mime


    【解决方案1】:

    澄清后编辑

    您的示例的 msg_full 结果如下所示:

    From: Sender Name <sender@server>
    To: Receiver Name <receiver@server>
    Cc: Receiver2 Name <receiver2@server>
    MIME-Version: 1.0
    Content-type: text/html
    Subject: Any subject
    <h2>My title > <font color="green">OK</font></h2>
    

    您的电子邮件格式不符合RFC 2822

    • 您必须使用 CRLF ('\r\n') 作为换行符,只有 LF (\n') 是非法的
    • 标题和正文必须用 CRLF 分隔(即一个空行)。如果您执行''.join([msg_header, msg_body]),则不会插入此行。因此,您希望作为正文传输的内容被视为标题。

    同一电子邮件的正确版本如下所示:

    Content-Type: text/html; charset="us-ascii"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    From: Sender Name <sender@server>
    To: Receiver Name <receiver@server>
    Cc: Receiver2 Name <receiver2@server>
    Subject: Any subject
    
    <h2>My title > <font color="green">OK</font></h2>
    

    我强烈建议您使用 Python 的内置库来构建符合 RFC 的有效负载。

    import smtplib
    from email.mime.text import MIMEText
    
    title = 'My title'
    msg_content = '<h2>{title} > <font color="green">OK</font></h2>\n'.format(title=title)
    message = MIMEText(msg_content, 'html')
    
    message['From'] = 'Sender Name <sender@server>'
    message['To'] = 'Receiver Name <receiver@server>'
    message['Cc'] = 'Receiver2 Name <receiver2@server>'
    message['Subject'] = 'Any subject'
    
    msg_full = message.as_string()
    
    server = smtplib.SMTP('smtp.gmail.com:587')
    server.starttls()
    server.login('sender@server.com', 'senderpassword')
    server.sendmail('sender@server.com',
                    ['receiver@server.com', 'receiver@server.com'],
                    msg_full)
    server.quit()
    

    此外,添加文本/纯文本版本的消息也是一种很好的形式,这样任何收件人都可以在任何地方阅读它(我禁用了 HTML 邮件,在我的客户端上看不到任何内容)。您可以使用 email.mime.text 轻松做到这一点:

    from email.mime.multipart import MIMEMultipart
    
    message = MIMEMultipart('alternative')
    message['From'] = 'Sender Name <sender@server>'
    message['To'] = 'Receiver Name <receiver@server>'
    message['Cc'] = 'Receiver2 Name <receiver2@server>'
    message['Subject'] = 'Any subject'
    
    # Record the MIME types of both parts - text/plain and text/html.
    part1 = MIMEText(text, 'plain')
    part2 = MIMEText(html, 'html')
    
    # Attach parts into message container.
    # According to RFC 2046, the last part of a multipart message, in this case
    # the HTML message, is best and preferred.
    message.attach(part1)
    message.attach(part2)
    

    上一个答案

    您的问题缺少用于发送邮件的代码。我强烈怀疑您将 msg_content 作为消息直接传递给SMTP.sendmail

    SMTP.sendmail,但是按原样传输此字符串,即根据RFC 5321 作为邮件的有效负载。此有效负载数据由电子邮件标头和内容组成,标头位于消息顶部(请参阅RFC 2822)。

    因此,您的消息“我的标题:{title}:后面的冒号去掉,那么接收方显然不会把结果当成header等等。

    对于 HTML 样式的邮件,请查看 https://docs.python.org/2/library/email-examples.html 中的示例 - 基本上,您必须创建正确的 text/html MIME 编码邮件才能发送邮件。

    【讨论】:

    • 我在搜索了许多其他示例后才发现您的答案,它非常详细!谢谢!只需添加一件事。别忘了你在这个区域的try / except
    【解决方案2】:

    迟到的答案,但有 2021,这是我用 python 发送电子邮件的方法:

    import smtplib
    from email.mime.text import MIMEText
    
    sender = 'sender@tld'
    receivers = ['receiver1@tld', 'receiver2@tld']
    body_of_email = 'The body of the email'
    msg = MIMEText(body_of_email, 'plain')
    # html_body_of_email = '<h1>The html body of the email</h1>'
    # msg = MIMEText(html_body_of_email, 'html')
    msg['Subject'] = 'The Subject'
    msg['From'] = sender
    msg['To'] = ','.join(receivers)
    
    s = smtplib.SMTP_SSL(host = 'smtp.gmail.com', port = 465)
    s.login(user = 'username', password = 'password')
    s.sendmail(sender, receivers, msg.as_string())
    s.quit()
    

    在使用 gmail 发送电子邮件之前,请记住在您的 google 帐户上启用less secure apps

    1. 转到您的 (Google Account)。
    2. 在左侧导航面板上,点击Security
    3. 在页面底部的“不太安全的应用访问”面板中, 点击Turn on access
    4. 点击保存按钮。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 2012-06-20
      • 2022-09-27
      相关资源
      最近更新 更多