如何在python中设置Content-Transfer-Encoding

问题描述 投票:0回答:2

一些用户将内容传输编码类型设置为base64。如何手动设置内容传输编码。

  import smtplib
  from email.message import EmailMessage
  from email.encoders import encode_7or8bit

  msg = EmailMessage()
  msg.set_content(message,subtype='html')
  #msg.set_charset('UTF-8')
  msg['Subject'] ="your order is {} at {}".format(order_id,today_is)
  msg['From'] = '[email protected]'
  msg['To'] = '[email protected]'
  encode_7or8bit(msg)

这是我收到的错误。

 ValueError: There may be at most 1 Content-Transfer-Encoding headers in a message

如果我将

encode_7or8bit(msg)
移至
msg.set_content
上方,它会起作用,但我认为内容尚未设置。我应该发送一些东西到
set_content

python-3.x email
2个回答
2
投票
import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg.set_content(message,subtype='html',charset='utf-8',cte='7bit')
msg['Subject'] ="your order is {} at {}".format(order_id,today_is)
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'

msg.set_content()
我必须发送cte。 Python 3 电子邮件内容编码类型


0
投票

警告!

在 Python(以及任何其他语言!)中手动将 MIME 内容传输编码设置为 7bit8bitbinary 可能而且可能会破坏事情。

更糟糕的是,损坏情况取决于电子邮件的内容、您的 SMTP 服务器软件,甚至收件人的邮件客户端,祝您好运!

对于字符串电子邮件内容,Python 的 set_content(msg, <'str'>, subtype="plain", charset='utf-8', cte=None, ...) 自动检测最紧凑的 safe 编码字符串数据,对其进行编码,并设置匹配的“Content-Transfer-Encoding”标头。我强烈建议您不要在 Python 中为字符串设置 cte=,或者如果必须的话,请选择这些编码之一,它将始终适用于所有数据类型和行长度:

  • 引用-可打印

    • 适合包含奇怪表情符号或外来字符的文本
    • 适用于长线路,透明地软中断它们以实现安全的 SMTP 传输
    • 对于大量二进制数据或大于 127 的字节来说效率非常低。它仅将 >127 个字节转换为以 = 和该字节的 ASCII 十六进制值开头的 3 字节序列。例如 hôpital -> h=C3=B4pital 因为 ô 在 UTF-8 中是两个字节长。如今,除了文件附件之外,大小可能并不重要
    • 如果输入主要是西方 UTF-8/ASCII 文本,则具有一定的人类可读性
  • base64

    • 适用于大多数多字节字符或二进制数据
    • 对于长行,换行符与其他所有内容一起编码,并且编码器限制其输出行长度以确保安全的 SMTP 传输
    • 对于大多数二进制数据来说更有效,但对于简单文本来说则较差。将所有内容分解为 3 字节块并使用 4 字节对其进行编码
    • 透明地断开和重建长线路,以实现安全的 SMTP 传输
    • 人类根本不可读。例如 hôpital -> aMO0cGl0YWw=

背景

电子邮件(在本例中具体为 SMTP)是一个非常古老的标准,仅支持具有最大行长度的 7 位 ASCII 文本,并且保留行尾 CR-LF 以表示 SMTP 命令的结束。这些限制意味着您可以在具有几千字节内存的 8 位大型机类型计算机上运行 SMTP 服务器。只需将当前行放入 RAM 中,并有足够的空间来处理它!

因此,对于旧的 7 位编码,不允许字符 >127,对于 8 位编码,允许 >127,但对于 7 位和 8 位,禁止太长的行,除非表示行结束,否则禁止使用 CR-LF。很难保证任意二进制数据不会意外地包含 CR-LF 的 ASCII 代码,或者数据适合行长度。

这些限制至今仍然存在,但大多数 SMTP 服务器都是 8 位干净的,并且没有行长度限制……但有些服务器则不然。此外,大多数服务器和电子邮件客户端都会假设文本/纯文本是 UTF-8 编码的,并尝试发送/解码内容,等等……但有些则不然。所以不要冒险。

© www.soinside.com 2019 - 2024. All rights reserved.