[Python-de] Mail Content-Transfer-Encoding

Roland M. Kruggel rk.liste at bbf7.de
Fr Aug 17 15:44:20 UTC 2007


Am Freitag, 17. August 2007 16:51 schrieb Martin v. Löwis:
> > 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.

Ok. so habe ich es nun auch gemacht. Geht super.
Der kern sieht nun so aus:

-->
text = part.get_payload(decode = True)  # wird autom. decodiert
cte = part.get('content-transfer-encoding', '').lower()
text = self.setTextPayload(text, txt_txt)

if cte == 'base64':
    text = base64.encodestring(text)
elif cte == 'quoted-printable':
    text = quopri.encodestring(text)

part.set_payload(text)
--<


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

ok

> > 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).

Ok.

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

Oh. Wieder was dazugelernt. Danke für den Tip. Reicht da ein 
lenght(text)?

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

Ok. 


> > Bin über jeden Tip dankbar.
>
> Das scheint mir nicht wirklich der Fall zu sein - so, wie
> Du auf den ersten Tip reagiert hast.

Jo. *schäm*
Die Entschuldigung ist schon raus.

Ok Martin. Super Beschreibung und Erklährung. Herzlichen Dank. 

Ich bin an dieses Project zu anfang etwas blauäugig herrangegangen. 
Habe aber schnell gemerkt: 'Sooo einfach ist es doch nicht'. Aber ich 
habe viel dabei gelernt. Nicht zuletzt von solchen wie dir. :)

Danke nochmal. Natürlich auch an Martin.

-- 
cu

Roland Kruggel  mailto: rk.liste at bbf7.de
System: Intel, Debian etch, 2.6.16.16, xfce4 KDE 3.5


-- 
cu
 Roland M. Kruggel


System: Intel, Debian etch, 2.6.16.16, xfce4 KDE 3.5