一些用户将内容传输编码类型设置为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
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 电子邮件内容编码类型
在 Python(以及任何其他语言!)中手动将 MIME 内容传输编码设置为 7bit、8bit 或 binary 可能而且可能会破坏事情。
更糟糕的是,损坏情况取决于电子邮件的内容、您的 SMTP 服务器软件,甚至收件人的邮件客户端,祝您好运!
对于字符串电子邮件内容,Python 的 set_content(msg, <'str'>, subtype="plain", charset='utf-8', cte=None, ...) 自动检测最紧凑的 safe 编码字符串数据,对其进行编码,并设置匹配的“Content-Transfer-Encoding”标头。我强烈建议您不要在 Python 中为字符串设置 cte=,或者如果必须的话,请选择这些编码之一,它将始终适用于所有数据类型和行长度:
引用-可打印
base64
电子邮件(在本例中具体为 SMTP)是一个非常古老的标准,仅支持具有最大行长度的 7 位 ASCII 文本,并且保留行尾 CR-LF 以表示 SMTP 命令的结束。这些限制意味着您可以在具有几千字节内存的 8 位大型机类型计算机上运行 SMTP 服务器。只需将当前行放入 RAM 中,并有足够的空间来处理它!
因此,对于旧的 7 位编码,不允许字符 >127,对于 8 位编码,允许 >127,但对于 7 位和 8 位,禁止太长的行,除非表示行结束,否则禁止使用 CR-LF。很难保证任意二进制数据不会意外地包含 CR-LF 的 ASCII 代码,或者数据适合行长度。
这些限制至今仍然存在,但大多数 SMTP 服务器都是 8 位干净的,并且没有行长度限制……但有些服务器则不然。此外,大多数服务器和电子邮件客户端都会假设文本/纯文本是 UTF-8 编码的,并尝试发送/解码内容,等等……但有些则不然。所以不要冒险。