Python3:发送包含二进制数据的电子邮件?

发布于 2024-11-18 15:56:53 字数 714 浏览 6 评论 0原文

以下失败:

>>> a = email.message.Message()
>>> a.set_payload(b'some data')
>>> a.as_string()
TypeError: string payload expected: <class 'bytes'>

它也失败显式使用生成器,并调用 扁平化。消息正文被转换为 ASCII,应用转义,最后转换为字节进行传输,那么为什么我不能设置字节有效负载呢?

如何获取带有字节有效负载的非 MIME 消息 smtplib.SMTP.send_message 会接受吗?

The following fails:

>>> a = email.message.Message()
>>> a.set_payload(b'some data')
>>> a.as_string()
TypeError: string payload expected: <class 'bytes'>

It also fails using a generator explicitly, and calling flatten. The message body is converted to ASCII, escapes applied and then finally converted to bytes for transmission anyway, so why can I not set a bytes payload?

How do I go about getting a preferably non-MIME message with a bytes payload that smtplib.SMTP.send_message will accept?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别再吹冷风 2024-11-25 15:56:53

请记住:在 Python 3 中,字符串都是全部 unicode。您实际上是给 Python 一个 bytes 对象,然后告诉它您想要一个 unicode 字符串,但没有告诉它使用哪种编码将 bytes 对象转换为字符串。

您需要做的是将编码作为第二个参数提供给 set_payload() 调用,如下所示:

test = email.message.Message()
test.set_payload(b'some example_data', 'latin1') # use latin-1 for no-op translation
test.as_string()

'MIME-Version: 1.0\nContent-Type: text/plain; charset="latin1"\nContent-Transfer-Encoding: base64\n\nc29tZSBleGFtcGxlIGRhdGE=\n'

这确实给出了 MIME 类型消息 - 希望这对您有用。

Remember: in Python 3 strings are all unicode. You are effectively giving Python a bytes object and then telling it you want a unicode string, but not telling it which encoding to use to convert the bytes object to a string.

What you need to do is provide the encoding as the second parameter to the set_payload() call, like so:

test = email.message.Message()
test.set_payload(b'some example_data', 'latin1') # use latin-1 for no-op translation
test.as_string()

'MIME-Version: 1.0\nContent-Type: text/plain; charset="latin1"\nContent-Transfer-Encoding: base64\n\nc29tZSBleGFtcGxlIGRhdGE=\n'

This does give a MIME type message -- hopefully that will work for you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文