python3电子邮件消息以禁用base64并删除MIMEVersion

2024-09-27 17:39:09 发布

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

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编码的电子邮件。如何禁用它?如何删除MIME版本的字段

收件人是否正确解释了“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==

Tags: fromimportlecom编码addressexampleemail
1条回答
网友
1楼 · 发布于 2024-09-27 17:39:09

绝对不能删除MIME-Version:头;它将此标识为MIME消息

From:头确实应该是RFC2047编码的,文档建议它将是“当消息序列化时”。当您print(msg)时,您没有正确地序列化它;您需要显示所需序列化的print(msg.as_string())

当谈到传输编码时,Python的email库对使用base64作为可引用的可打印内容的倾向并不吸引人。您无法真正可靠地发送完全未编码的内容(尽管如果您愿意,MIME 8bitbinary编码将能够适应这种情况;但为了向后兼容,SMTP要求所有内容都编码为7位表示)

在旧的email库中,需要各种各样的诡计来实现这一点,但是在Python3.6中引入的新的EmailMessageAPI中,您实际上只需要将cte='quoted-printable'添加到set_content调用中

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

不幸的是,从文档中找出这一点几乎是不可能的The documentation for ^{}基本上只是遵从^{},它模糊地指向^{}(如果你注意到链接的话)。。。最后,您希望注意到cte关键字参数的存在

演示:https://ideone.com/eLAt11

(顺便说一句,你可能也想

replace('\n   ', '\n')

在正文中。)

如果您选择8bitbinary内容传输编码,它们之间的区别在于前者有一个行长度限制(最多900个字符),而后者则完全不受限制。但是您需要确保整个SMTP传输路径是8位干净的(在这一点上,您可以完全转向Unicode email/ESMTPSMTPUTF8

为了让你娱乐一下,这里有一些关于crazy{a7}{a8}的老问题

相关问题 更多 >

    热门问题