hotti: eMail senden mit mail(), Codierungsprobleme

Beitrag lesen

hi, Dein Code ist grausig. Vielleicht kriegst Du den etwas besser hin mit ein bischen Grundlagenverständnis.

Content-Transfer-Encoding: 8bit
  ist gleich
Content-Transfer-Encoding: binary

Unsicher, daher nicht empfehlenswert. Besser

Content-Transfer-Encoding: quoted-printable
  oder
Content-Transfer-Encoding: base64

und hier reden wir nur von den Texten. Quoted-printable ist zu bevorzugen, weil die Mail dann immer noch einigermaßen lesbar, was mit base64 nicht der Fall ist.

Texte haben eine bestimmte Zeichen-Kodierung, guck:
Content-Type: text/plain; Charset=UTF-8
  oder
Content-Type: text/plain; Charset=ISO-8859-1
  o.a.

Nun, quoted-printable oder base64 (Content-Transfer-Encoding), das wiederum hat mit der Zeichenkodierung überhaupt nichts zu tun, das sind reine Byte-Geschichten. Die Zeichenkodierung kommt erst dann ins Spiel, wenn der MailClient, nach der Übertragung mit einem bestimmten Content-Transfer-Encoding, aus den ankommenden Bytes wieder lesbare Zeichen machen soll.

Header: Nur Ascii, wurde schon gesagt, Beispiel in Perl
subject => sprintf("=?%s?Q?%s?=", $in{charset}, $self->quotePrint($in{subject})),

Heißt: Im Header selbst stehen Charset UND Content-Transfer-Encoding UND nur 7bit-Bytes (ASCII). Wobei das Q für quoted-printable steht, für base64 stünde da ein B

Spätestens hier sollte Dir klar sein, was Charset und Content-Transfer-Encoding für eine Rolle und wie die zusammenspielen.

Noch ein Wort zum Code: Mach ein Template, da verlierst Du auch nicht die Übersicht. Übergebe Deinem Konstruktor nicht eine Liste von $from, $to, $subject usw., sondern besser ein assoziatives Array, das macht den Code ungemein lesbarer. Gerade für multipart/mixed und Attachments eignet sich ein Template hervorragend. Baue so die Maildatei zusammen und Pipe auf mta => '/usr/sbin/sendmail -t', das geht auch mit PHP vorzüglich.

Viel Erfolg!