[Python-de] Mail Content-Transfer-Encoding

"Martin v. Löwis" martin at v.loewis.de
Fr Aug 17 14:51:33 UTC 2007


> Wenn 'Content-Transfer-Encoding: base64' ist geht es nicht mehr. Dann 
> ist ein teil der mail als base64 codiert und der disclaimer ist 
> normaler text. Klar, kann auch nicht gehen. Also habe ich den 
> diclaimer auch in base64 umgewandelt

Das ist (im Prinzip) eine Möglichkeit. Eine andere ist, den Disclaimer
in einen eigenen Part zu speichern, und den Originalpart in einen
multipart-Teil umzuwandeln.

"Im Prinzip" deshalb, weil es so nicht funktioniert, wie Du ja
herausbekommen hast. Du kannst nicht einfach base64-Fragmente
zusammenhängen und erwarten, dass das Ergebnis wieder base64 ist.

> Ich nehme jetzt mal an, dass base64 ein 'endkennzeichen' hat und diese 
> von Kmail ausgewertet wird und der Rest dann ignoriert wird. 

Die Annahme ist (im Prinzip) falsch. In base64 werden Bitfolgen in
Gruppen von 6 bits zu einem Zeichen zusammengefasst; damit ist ein
kodierter Text immer das Vielfache von 6 Bits. Da die Eingabe aber
in 8-er Bitgruppen (bytes) daherkommt, kann es sein, dass es nicht
aufgeht: wenn man 5 Bytes kodieren will (40 Bit), macht das 6 Zeichen,
und man hat am Ende noch 4 Bits übrig.

base64 legt jetzt fest, dass die Eingabe immer ein Vielfaches von 24
Bits sein muss und notfalls mit Nullbits aufgefüllt wird. Wieviele
Nullbits das waren, wird am Ende durch das Zeichen = ausgedrückt:
kein =: 0 padding bits, "=": 8 padding bits, "==": 16 padding bits.

Ein base64-Dekoder kann also anhand der =-Zeichen erkennen, ob die
Eingabe zuende ist - allerdings werden nicht bei jeder Eingabe
auch =-Zeichen ausgegeben:

py> e=base64.encodestring
py> d=base64.decodestring
py> d(e("Hallo")+e("Welt"))
'Hallo'
py> d(e("Hallo ")+e("Welt"))
'Hallo Welt'

Wenn der erste String eine Länge hat, die ein Vielfaches von 3 ist,
dann wird der zweite String als dazugehörig betrachtet, ansonsten
nicht.

Kurz: Du musst erst den Part dekodieren, beide Teile verknüpfen, und
dann den Part wieder kodieren.

Wenn Du dabei bist, solltest Du das auch für die anderen
Content-Transfer-Encodings machen.

> Wie kann ich das lösen? 
> Wie verhält es sich mit quoted-printable und 8bit?

Bei quoted-printable im Prinzip genauso. Bei 8bit kannst Du
die Inhalte direkt verketten (vorausgesetzt, der Content-type
erlaubt eine solche Verkettung).

Außerdem musst Du Content-Length aktualisieren, falls das
in dem Part gesetzt war.

Schließlich musst Du den Disclaimer in den charset von dem
Part konvertieren, in den Du ihn einfügen willst.

> Bin über jeden Tip dankbar. 

Das scheint mir nicht wirklich der Fall zu sein - so, wie
Du auf den ersten Tip reagiert hast.

Ciao,
Martin