【问题标题】:Python3: Send email message containing binary data?Python3:发送包含二进制数据的电子邮件?
【发布时间】:2011-09-29 07:52:16
【问题描述】:

following 失败:

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

显式使用生成器并调用flatten 也会失败。消息体转换为 ASCII,应用转义,然后最终转换为字节进行传输,那么为什么我不能设置字节有效负载?

我如何才能获得带有 smtplib.SMTP.send_message 将接受的字节有效负载的非 MIME 消息?

【问题讨论】:

  • 您可能必须将其编码为字符串。我不知道 Python 中有什么,但通常是 Base-64。
  • 不管你怎么做,如果你能做到的话,非 ASCII、非 MIME 类型的邮件在接收方和任何中间邮件传输代理上都会出现问题。其中“麻烦”的意思是“难以解释”或“被退回”或“被丢弃”。
  • @msw - 仍然只有 ASCII 的邮件代理死了! :)
  • @msw:相反,无论发送方如何,Message都会先转换为ASCII。我只是没有看到为我的字节选择随机字符串编码的意义,只是为了稍后再编码为 ASCII(然后当然回到字节-.-)。
  • 为什么不填充两个字节并将其转换为 Unicode(或选择您最喜欢的深奥编码)?然后在另一端,您可以将 Unicode 字符串转换为字节。我仍然会推荐 MIME 解决方案,如果只是因为库可以帮助您并且它是标准的,但转换为字符串可能会起作用。

标签: email python-3.x smtp message mime


【解决方案1】:

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

您需要做的是将编码作为第二个参数提供给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 类型的消息——希望这对你有用。

【讨论】:

  • 你能解释一下你选择的 latin1 吗?
  • latin1 和 unicode 对于前 256 个字符是相同的,因此在“解码”过程中字节不会改变。
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多