如何在Python3中发送具有风格的电子邮件?

2024-04-20 04:30:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我从Python3脚本发送电子邮件(使用smtplib)。到现在为止,我一直在接收Gmail账户上的信息。但问题是我不能显示CSS样式,尽管是内联的。此外,即使是这个简单的消息也无法发送:

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

但是,如果我删除{title}后面的两点,它就会工作。如果我在结束时移除它,它将不再工作。为什么?在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()

Tags: namecomformatservertitlemyokmsg
1条回答
网友
1楼 · 发布于 2024-04-20 04:30:14

澄清后编辑

示例的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_内容作为消息传递给SMTP.sendmail

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

      你的信息“我的标题:我的标题:”并没有显示在接收端。如果删除{title}:之后的冒号,那么接收者显然不会将结果视为标题等

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

相关问题 更多 >