[英]python3 email message to disable base64 and remove MIME-Version
from email.message import EmailMessage
from email.headerregistry import Address
msg = EmailMessage()
msg['From'] = Address("Pepé Le Pew", "pepe", "example.com")
msg['To'] = (
Address("Penelope Pussycat", "penelope", "example.com")
, Address("Fabrette Pussycat", "fabrette", "example.com")
)
msg['Subject'] = 'This email sent from Python code'
msg.set_content("""\
Salut!
Cela ressemble à un excellent recipie[1] déjeuner.
[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718
--Pepé
""")
print(msg)
上面的代码产生一个使用 base64 编码的 email 消息。 如何禁用它? 如何删除 MIME-Version 字段?
接收者会正确解释“Pepé”的编码吗? 如果不是,那么确保接收者正确解释其编码的正确方法是什么?
From: Pepé Le Pew <pepe@example.com>
To: Penelope Pussycat <penelope@example.com>,
Fabrette Pussycat <fabrette@example.com>
Subject: This email sent from Python code
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
MIME-Version: 1.0
CQlTYWx1dCEKCgkJQ2VsYSByZXNzZW1ibGUgw6AgdW4gZXhjZWxsZW50IHJlY2lwaWVbMV0gZMOp
amV1bmVyLgoKCQlbMV0gaHR0cDovL3d3dy55dW1tbHkuY29tL3JlY2lwZS9Sb2FzdGVkLUFzcGFy
YWd1cy1FcGljdXJpb3VzLTIwMzcxOAoKCQktLVBlcMOpCgkJCg==
您绝对不能删除MIME-Version:
header; 这就是将其标识为 MIME 消息的原因。
From:
header 确实应该是 RFC2047 编码的,并且文档表明它将是“当消息被序列化时”。 当您print(msg)
时,您没有正确序列化它; 你想要print(msg.as_string())
确实表现出所需的序列化。
当涉及到传输编码时,Python 的email
库对使用base64
的内容很有吸引力,而这些内容很可能被编码为可引用打印。 您不能真正可靠地发送完全未编码的内容(尽管如果您愿意,MIME 8bit
或binary
编码将能够适应这种情况;但为了向后兼容,SMTP 要求将所有内容编码为 7 位表示)。
在旧的email
库中,需要各种恶作剧来执行此操作,但在 Python 3.6 中引入的新EmailMessage
API 中,您真的只有添加set_content
cte='quoted-printable'
。
from email.message import EmailMessage
from email.headerregistry import Address
msg = EmailMessage()
msg['From'] = Address("Pepé Le Pew", "pepe", "example.com")
msg['To'] = (
Address("Penelope Pussycat", "penelope", "example.com")
, Address("Fabrette Pussycat", "fabrette", "example.com")
)
msg['Subject'] = 'This email sent from Python code'
msg.set_content("""\
Salut!
Cela ressemble à un excellent recipie[1] déjeuner.
[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718
--Pepé
""", cte="quoted-printable") # <-- notice added parameter
print(msg.as_string()) # <-- properly serialize
不幸的是,从文档中弄清楚这一点几乎是不可能的。 set_content
的文档基本上只是遵循模糊指向raw_data_manager
的policy
(如果您甚至注意到链接)......最后您希望注意到cte
关键字参数的存在。
(顺便说一句,您可能还想
replace('\n ', '\n')
在正文中。)
如果您使用 go 进行8bit
或binary
内容传输编码,它们之间的区别在于前者有行长限制(最多 900 个字符),而后者完全不受限制。 But you need to be sure that the entire SMTP transfer path is 8-bit clean (at which point you might as well pivot to Unicode email / ESMTP SMTPUTF8
entirely).
为了您的娱乐,这里有一些关于 Python 3.5 及更早版本的疯狂黑客的老问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.