2010-06-21 10 views
5

Ich muss eine multipart/mime Nachricht generieren, die als Antwort auf eine HTTP-Anfrage gesendet wird, aber entweder einen Fehler oder eine Einschränkung im Paket Python email. * Trifft.Wie generiere ich eine multipart/mime Nachricht mit korrekter CRLF in Python?

Das Problem ist, dass 2.6 mit Python, der message.as_string() Anruf unter einem String erzeugt mit \ n vielmehr, dass CRLF als Zeilenende:

message = MIMEMultipart() 
for image in images: 
    f = image.open('rb') 
    img = MIMEImage(f.read(), _encoder=encode_7or8bit) 
    message.attach(img) 


message.as_string() 

Es scheint keinen Weg, um es dazu zu bringen, Verwenden Sie den (MIME-Standard) CRLF. Die Generator-Klasse, die dazu in der Lage zu sein scheint, tut dies nicht.

Was haben andere Leute getan, um dies zu umgehen?

Antwort

3

Das war ein Fehler in Python, die jetzt behoben wurde: http://hg.python.org/lookup/r85811

Es soll nun möglich sein, die MIME-Bibliotheken über Transporte Nicht-E-Mail zu nutzen und haben vernünftige Dinge passieren.

+3

Leider ist dies in Python 2.7 nicht vorhanden. Ich versuche immer noch, eine Problemumgehung zu finden - ich habe eine mehrteilige Nachricht mit einem Binärteil und sende es als eine Web-Anfrage. – Nils

+0

@CantucciHQ sieht aus wie es in Python 3.2 ging. AIUI, Bibliotheks-Fixes von 3.2 bis 2.7 werden akzeptiert, es lohnt sich also, einen Fehler zu stellen, in dem Sie nach Kompatibilität gefragt werden? –

+0

danke dafür. Es ist ein kleines Skript, also habe ich es stattdessen in Python 3 konvertiert. Aber ich habe immer noch Probleme damit. Hier ist meine Frage - irgendwelche Gedanken? http://stackoverflow.com/questions/19010306/newline-characters-being-interpreted-when-coding-binary-mimeapplication-in-pyt – Nils

2

Was ist mit einem einfachen Hack

message.as_string().replace('\n', '\r\n') 

? Inelegant, sollte aber funktionieren (und ein Fehlerbericht sollte am Python-Tracker eingegeben werden).

+0

Dachte darüber, aber wenn es \ n Zeichen im Körper (das ist eine PNG-Datei, so gerade binär) dann wird dies vermasseln. AFAICT, die encode_7_or_8bit macht nichts schlau zu Byte-stuff \ n Zeichen. –

+1

Oh, es gibt schon einen Fehler hier: http://bugs.python.org/issue1349106 Es ist seit 2005 geöffnet und aus Gründen, die ich nicht verstehe, scheint widerstanden werden. –

+1

@Malcolm, wenn Sie Zeilenumbrüche ersetzen, ist der Text bereits in einer Mail-akzeptablen Art und Weise codiert, was "gerade binär" definitiv ist ** nicht ** - es würde viele RFCs verletzen. Eine Codierung, die nicht wirklich und sorgfältig die Payload "modifiziert", um sie RFC-konform zu machen, ist inakzeptabel, und es ist _your_bug, nicht Python - benutze 'encode_base64' für binäre Payloads! –