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!