[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