在 Python 中用二进制数据编码 MIME 多部分?

Posted

技术标签:

【中文标题】在 Python 中用二进制数据编码 MIME 多部分?【英文标题】:Encode MIME multipart with binary data in Python? 【发布时间】:2014-04-08 00:02:45 【问题描述】:

如何在 Python 中构造 MIME 多部分消息?我已经尝试过 Python 的 email 包,但它似乎坏了——它没有正确执行二进制部分(将它们的 Content-Transfer-Encoding 设置为 base64 并将数据保留为二进制)。请注意,对于我的应用程序,实际数据是二进制编码的,而不是 base64 编码,这一点非常重要。我需要最小化尺寸。

这是我试过的代码。

from email import message, mime, generator, encoders
from email.mime import multipart, text, image
from cStringIO import StringIO
import os

m = multipart.MIMEMultipart( "related" )

part = text.MIMEText( "text", "plain" )
part.set_payload( "hello" )
part.add_header( 'Content-Disposition', 'asset', name='abc' )
m.attach( part )

part = image.MIMEImage( "image", "x-other" )
part.set_payload( os.urandom(200) )
m.attach( part )

fp = StringIO()
g = generator.Generator( fp, mangle_from_ = False, maxheaderlen = 1000 )
g.flatten(m)
print( fp.getvalue() )

【问题讨论】:

【参考方案1】:

你可以像这样强制Content-Transfer-Encoding

part = image.MIMEImage( "image", "x-other", encoders.encode_noop )
part.set_payload( os.urandom(200) )
part.add_header( 'Content-Transfer-Encoding', 'binary' )
m.attach( part )

【讨论】:

这不起作用。它只是添加了第二个标题并将损坏的base64 留在原处。 @edA-qamort-ora-y 它在 Python 2.7.3 上对我有用。你注意到encoders.encode_noop了吗? 对不起,我没看到那部分。是的,这样做我可以获得二进制编码。不过我很担心,因为“二进制”不是标准编码器,它可能无法解码这些消息。 好的,这行得通。 Python 并不真正支持这种编码,它只是默默地不解码它。 @edA-qamort-ora-y “不解码”是什么意思?根据定义,binary 编码不需要任何解码即可获得原始八位位组。

以上是关于在 Python 中用二进制数据编码 MIME 多部分?的主要内容,如果未能解决你的问题,请参考以下文章

MIME Base64编码

如何在 C# 中编码二进制 MIME 附件?

像图像或 PDF 文件这样的 MIME 类型不需要 base64 或以其他方式编码吗?

[HTTP-3]-HTTP报文内的HTTP信息(下)

Base-64编码介绍

base64原理,使用场景