2013-09-25 35 views
0

我試圖編碼具有MIMEApplication二進制文件在Python 3.3,作爲多部分MIME HTTP POST的一部分的HTTP請求。我有一個問題0X0D被重新解釋爲一個換行符是0xA這個角色,儘管一切都被設置爲二進制字節。創建具有二元組分的多部分MIME消息在Python 3

這裏有一個最小的測試場景中,與二進制字符串中有一個0X0D,越來越誤解:

from email.encoders import encode_noop 
from email.generator import BytesGenerator 
from email.mime.application import MIMEApplication 
import io 

app = MIMEApplication(b'Q\x0dQ', _encoder=encode_noop) 
b = io.BytesIO() 
g = BytesGenerator(b) 
g.flatten(app) 
for i in b.getvalue()[-3:]: 
    print("%02x " % i, end="") 
print() 

輸出是:51 0a 51當它應該是51 0d 51

注意,這是生成多部分http POST消息的二進制部分。

回答

0

我能夠把一個虛擬的「標記」在爲MIMEApplication內容,然後代入真正的二進制來解決我的問題生成MIME消息後的文本:

from email.encoders import encode_noop 
from email.generator import BytesGenerator 
from email.mime.application import MIMEApplication 
import io 

# Actual binary "file" I want to encode (in real life, this is a file read from disk) 
bytesToEncode = b'Q\x0dQ' 

# unique marker that we can find and replace after message generation 
binarymarker = b'GuadsfjfDaadtjhqadsfqerasdfiojBDSFGgg' 

app = MIMEApplication(binarymarker, _encoder=encode_noop) 
b = io.BytesIO() 
g = BytesGenerator(b) 
g.flatten(app, linesep='\r\n') # linesep for HTTP-compliant header line endings 

# replace the marker with the actual binary data, then you have the output you want! 
body = b.getvalue().replace(binarymarker, bytesToEncode) 

在此之後,body有我想要的價值,不會弄亂二進制字節:

b'Content-Type: application/octet-stream\r\nMIME-Version: 1.0\r\n\r\nQ\rQ' 

對於多部分消息,你只是組裝多消息第一,然後做替換()結尾。

1

嘗試以下(不指定編碼器,使用默認的base64編碼器):

import email 
from email.encoders import encode_noop 
from email.generator import BytesGenerator 
from email.mime.application import MIMEApplication 
import io 

app = MIMEApplication(b'Q\x0dQ') 
b = io.BytesIO() 
g = BytesGenerator(b) 
g.flatten(app) 
msg = email.message_from_bytes(b.getvalue()) 
assert msg.get_payload(decode=True) == b'Q\x0dQ' 
+0

謝謝!你是對的,這回答了問題。但是,你知道我怎麼可以用這個作爲一個MIME多部分消息的一部分?這就是我真正需要使用它的方式。 – Nils