Hallo,
Wäre natürlich Klasse, wenn du mir auch dabei helfen könntest.
ich gebe mir Mühe.
Es geht immer noch um den Attachment. Dieser wird im großen erfolgreich mit der Mail verschickt. Es handelt sich dabei wie ich schon durchblicken lies um eine vcard. Diese wird sogar von meinem Thunderbird erkannt *YEAH!*. Dass doofe ist, dass die VCard Text enthält und dieser Text kann unter Umständen aus Umlauten bestehen.
Gut. Im Kontext e-Mail haben wir zwei Codierungen, die wir beachten müssen. Da wäre zum einen die Zeichencodierung (character encoding oder auch charset), die uns auch im Web-Kontext auf Schritt und Tritt begleitet. Dazu kommt aber noch die Transfercodierung (Transfer encoding), die aus historischen Gründen den Einschränkungen der übermittelnden Stationen Rechnung tragen soll. Ich weiß nicht, ob das heute wirklich noch relevant ist, aber es gab Systeme im Mail-Verkehr, die nur 7bit-Codes übertragen konnten.
Deswegen wurden Codierungen eingeführt, die die auftretenden 8bit-Werte so umcodieren, dass nur noch Bytewerte im Bereich 0..0x7F vorkommen, also 7bit. Das entspricht dem ASCII-Zeichensatz.
Das hat zur Folge das die vCard-Notiz (wo die Umlaute vornehmlich sind) ua. so aussieht:
"tats=C3=A4chlich" (tatsächlich)
Der Text ist also zunächst in UTF-8 codiert, das ä wird durch die Bytes 0xC3, 0xA4 dargestellt. Danach wurde die Transfercodierung Quoted-Printable angewendet. Die macht nichts anders, als diejenigen Bytewerte, die nicht direkt verarbeitet werden dürfen (also 0x80 und höher) als zweistellige Hex-Zahl in den Text zu schreiben und ein '=' davorzusetzen. Es gibt nur zwei Sonderregeln: a) Damit auch ein echtes '=' dargestellt werden kann, muss dieses Zeichen als =3D geschrieben werden; b) ein '=' am Zeilenende zeigt an, dass der folgende Zeilenumbruch *nicht* Teil der Nutzdaten ist.
Die andere populäre Transfercodierung ist base64, das immer päckchenweise drei Bytes auf vier ASCII-Zeichen abbildet.
Der PHP Code sieht an der Stelle so aus ($fileContent ist ein utf8 String):
$strAttachment .= chunk_split(base64_encode($fileContent)).PHP_EOL;
Huch - da wird base64 verwendet, eine ganz andere Transfercodierung. Dann muss die Quoted-Printable-Codierung schon vorher irgendwo passiert sein. Beides zusammen ergibt natürlich wenig Sinn.
und hat folgenden Header:
Content-Type: text/x-vcard; name="vcard.vcf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="vcard.vcf"
Deshalb wird vom Mailclient (T-Bird) die base64-Codierung erkannt und decodiert, vom zusätzlichen Quoted-Printable weiß er nichts und hält das daher für Klartext.
> Hab auch schon versucht den Header auf iso zu stellen - ohne Erfolg. Eventuell hat Thunderbird auch einen Fehler. Hab schon mal ein Thema überflogen wo stand, das Thunderbird ohne ein Plugin keine vcard könnte.
Da bin ich mir im Moment nicht sicher, aber selbst wenn er vCard nicht kennt, müsste er die Daten immer noch als XML-ähnlichen Code mit normal lesbarem Textinhalt darstellen.
> Hoffe ich hab das Problem ausführlich beschrieben!?
Ja. Nur führt deine Beschreibung auf die Schlussfolgerung, dass "irgendwo" die zu übermittelnden Daten noch Quoted-Printable codiert werden, bevor die Anweisung im oben zitierten Codeauszug zum Zuge kommt. Mach mal 'ne Kontrollausgabe von $fileContent vor dieser Anweisung - ich fürchte, dass da schon "tats=C3=A4chlich" drinsteht. Dann müsstest du in der Verarbeitungskette Schritt für Schritt zurückgehen, um das Schweinerle zu finden.
> Gruß
> wieder langsam rotierender
> Gummibär ähhh... T-Rex
Ruhig, Brauner! Gaaanz ruhig ...
Ciao,
Martin
--
Nein, es ist nicht wahr, dass bei der Post Beamte schneller befördert werden als Pakete.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(