charset=UTF-8 oder charset iso-8859-1 für mySQL und mail() mit deutschen Umlauten ****

christiande

Grünschnabel
Hallo

Nach mehreren Tagen googeln und probieren gebe ich mich geschlagen und bekenne, daß ich es nicht selber finde wie man wo die Zeichensätze für die deutschen Umlaute anwendet - denn es will einfach nicht funktionieren.

Ich hoffe hier einige Tips zu bekommen. Wo ist mein Denkfehler?

Kurz zur Situation:

- Ich will Daten von einem Formular übertragen
- diese sollen in mySQL DB gespeichert werden und teilweise anschließend per html mail()
versendet werden
- die Umlaute sollen immer korrekt sein

Hier Scriptauszüge vom aktuellen Stand:

Die Datei wo das Formular drin ist beginnt mit:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>login.inc.php</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-EQUIV="pragma" content="no-cache">
<meta name="Content-Language" content="De">


Die Umlaute auf der Seite werden korrekt angezeigt.

Das Formular ist so konfiguriert:

<form id="FormName" action="index.php" method="get" name="Formneuregister" accept-charset="UTF-8" >


Die Seite an die der script gesendet wird, ist so formatiert:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>index.php</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-EQUIV="pragma" content="no-cache">
<meta name="Content-Language" content="De">


Die Umlaute auf dieser Seite werden auch korrekt dargestellt.


Der Eintrag in der Datenbank sieht so aus:

Anstelle; Wändöß wurde das gespeichert: Wändöß

und anstelle von Tümöß wurde das hier gespeichert: Tümöß


Anmerkung: Das soll natürlich nicht so sein.


Dann paar Zeilen weiter unten wird eine Mailfunktion ausgeführt wo auch Variablen vom <form> verwendet werden.


mail() ist wie folgt konfiguriert:


PHP:
function send_MIME_email( $email ){
    /*

    Parameter:    [Array]
                "recip":    Email Empf?nger (String)
                "sender":    Email Absender (String)
                "subject":    Betreff (String)
                "content":    [Array]
                            "plain":    Nachricht im Plaintextformat (String)
                            "html":        Nachricht im HTML-Format (String)
                "attachment":    Pfad der anzuh?ngenden Datei (String)
    Ausgabe:     Boolean (TRUE/FALSE)
                TRUE: Email wurde versendet
                FALSE: Email wurde nicht versendet
    */

    if( empty($email["recip"]) || empty($email["sender"]) || empty($email["subject"]) ) {
        // recip, sender oder subject wurden nicht angegeben
        return false;
    }

    if( !validate_email($email["recip"]) || !validate_email($email["sender"]) ) {
        // der Aufruf der Hilfsfunction oben ("validate_email") gab FALSE zur?ck,
        // die Email Adresse von Sender und/oder Empf?nger ist also ung?ltig
        return false;
    }

    if( empty($email["content"]["plain"]) && empty($email["content"]["html"]) ) {
        // es wurde weder Plaintext-Inhalt noch HTML-Inhalt angegeben,
        // die Nachricht ist also leer
        return false;
    }

    // Anders als bei einer "normalen" Mail wird bei einer MIME Mail
    // alles, was versendet werden soll, in den "Header" gepackt.
    // Die einzelnen MIME-Types werden durch eine feste Textzeile
    // eine voneinander getrennt, die "boundary". Diese wird hier
    // erst einmal aus dem Zeitstempel erzeugt:
    $boundary = strtoupper(md5(uniqid(time())));

    // Dann wird der Header gef?llt:
    $mail_header = "From: ".$email["sender"];

    // Hier erh?lt der Mail Client die Information,
    // dass es sich um eine MIME Mail handelt...
    $mail_header .= "\nMIME-Version: 1.0";

    // ...und die Trennkennung - die "boundary" wird mitgeteilt, damit
    // die einzelnen Teile nicht als ein Brei verstanden werden
    $mail_header .= "\nContent-Type: multipart/alternative; boundary=".$boundary;
    $mail_header .= "\n\nThis is a multi-part message in MIME format";

    // wenn Plaintext Inhalt angegeben wurde...  
    if( !empty($email["content"]["plain"]) ){  
        // ...wird erstmal die "boundary" in den Header geschrieben,  
        // ein neuer MIME-type beginnt...  
        $mail_header .= "\n--".$boundary;  
        // der MIME-type wird angegeben  
        $mail_header .= "\nContent-Type: text/plain";  
        // ebenso die Codierung  
        $mail_header .= "\nContent-Transfer-Encoding: 8bit";  
        // und dann der eigentliche Inhalt  
        $mail_header .= "\n\n".$email["content"]["plain"];  
    }  
      
    // wenn HTML-Inhalt angegeben wurde...  
    if( !empty($email["content"]["html"]) ){  
        // ...wird erstmal die "boundary" in den Header geschrieben,  
        // ein neuer MIME-type beginnt...  
        $mail_header .= "\n--".$boundary;  
        // MIME-type und Codierung werden angegeben  
        $mail_header .= "\nContent-Type: text/html";  
        $mail_header .= "\nContent-Transfer-Encoding: 8bit";  
        // dann folgt wieder der eigentliche Inhalt  
        $mail_header .= "\n\n".$email["content"]["html"];  
    } 

    // wenn eine Datei zum anh?ngen angegeben wurde...
    if( !empty($email["attachment"]) ){
        $file = $email["attachment"];
        $filename = basename( $file );

        // ...existiert die Datei ?berhaupt und ist sie lesbar?
        if( @is_file($file) && @is_readable($file) ){
            // ja, also wird sie ge?ffnet...
            $fp = @fopen( $file, "rb" );
            if( $fp ){
                // ...und in eine Variable ($buffer) eingelesen,
                $buffer = fread( $fp, filesize($file) );
                // dann BASE64 codiert, weil es sich bin?re Daten handelt
                $buffer = base64_encode( $buffer );
                // und auf 72 Zeichen pro Zeile gestutzt.
                $buffer = chunk_split( $buffer, 72 );
                // Die Datei wird wieder geschlossen, wir sind ja ordentlich.
                fclose($fp);

                // Jetzt kommt wieder die "boundary" in den Header,
                $mail_header .= "\n--".$boundary;
                // der MIME-type und hier zus?tzlich der Dateiname werden angegeben.
                $mail_header .= "\nContent-Type: application/octet-stream; name=\"".$filename."\"";
                // die Codierung ist hier BASE64
                $mail_header .= "\nContent-Transfer-Encoding: base64";
                // und dem Mail Client wird mitgeteilt, dass es sich um einen Anhang handelt.
                $mail_header .= "\nContent-Disposition: attachment; filename=\"".$filename."\"";
                // Jetzt folgt die BASE64-codierte Datei
                $mail_header .= "\n\n".$buffer;
            } else {
                // Die Datei konnte nicht ge?ffnet werden
            }
        }
    }

    // Jetzt muss die erzeugte Mail nur noch versendet werden.
    // der PHP Befehl "mail" wird mit den Parametern
    // mail( recipient, subject, body, header ) aufgerufen und
    // gibt TRUE oder FALSE zur?ck, dieser R?ckgabewert wird
    // einfach weitergeleitet
    if( !mail($email["recip"],$email["subject"],"",$mail_header) )
       {
       return false;
       }
       else
       {
       return true;
       }
}//Ende function  send_MIME_email



Dieser Funktion werden folgende Daten übergeben:


PHP:
$email["recip"] =$email1;
    $email["sender"] = 'info@yyyyyy.de';
    $email["subject"] ='Deine Anmeldung ';
    $email["header"] ='MIME-Version: 1.0 \r\n';
    $email["header"] .='Content-Type: text/html; charset=utf-8 \r\n';
$email["content"]["html"] ='Hallo '.$vorname.' !<br><br><br>wir freuen uns, dass Du dich für eine Anmeldung .....<br><br>';

send_MIME_email( $email );


In der Variable $vorname steht ja Tümöß was ja so in der db gespeichert wurde: Tümöß


In der Email sieht das so aus:


Hallo TÌmö� !


wir freuen uns, dass Du dich fÃŒr eine Anmeldung .....


So- Ich hoffe ich habe an alles gedacht und Ihr seht hier durch und könnt mir einen Tip geben.
 
Du hast an zwei Sachen nicht gedacht: einerseits kannst du für deine MySQL-Tabellen und -Datenbanken den Zeichensatz einsetzen, andererseits solltest du (musst du?) vor der ersten richtigen Abfrage an die Datenbank, den Zeichensatz festlegen mit dem die Daten übertragen werden sollen. Das geht wie folgt:
PHP:
mysql_query('SET NAMES "utf8"');
Außerdem solltest du bei deinen Skripts darauf achten, dass dein Editor diese auch mit dem Zeichensatz UTF-8 oder UNICODE (ist das Gleiche, wird aber beides als Bezeichner verwendet) speichert.
 
Hallo "einfach nur crack"

Vielen Dank für Deine Tips, die ich auch gleich ausprobiert habe und an die ich ehrlich gesagt tatsächlich noch nicht gedacht habe.

Meine erste Verbindung zur Datenbank sieht nun so aus:


PHP:
$FD=mysql_connect($host,$user,$password) or die ('kein connect moeglich');
mysql_query('SET NAMES "utf8"');
$DBsel=mysql_select_db($datenbank,$FD)or die('Datenbank konnte nicht selektiert werden.');


.... und damit stimmen jetzt die Umlaute, die aus dem Formular kommen in der Datenbank. Super !!

Nur beim versenden der Mail stimmen die Umlaute noch nicht. Der Email Content wird immer noch falsch übertragen.

PHP:
$email["content"]["html"] ='Hallo '.$vorname.' !<br><br><br>wir freuen uns, dass Du dich für eine Anmeldung .....<br><br>';

ergibt in der ankommenden Email:

Hallo TÌmö� !


wir freuen uns, dass Du dich fÃŒr eine Anmeldung .....



Der Header der Email sieht so aus:


MIME-Version: 1.0
Content-Type: multipart/alternative;
This is a multi-part message in MIME format
--9FCBAE5D442A7682242C492963834480
Content-Type: text/html
Content-Transfer-Encoding: 8bit

Hallo TÌmö� !<br><br><br>wir freuen uns, dass Du dich fÌr eine Anmeldung...


Deshalb habe ich mir Deinen 2. Tip nochmal genauer angeschaut. Ich nutze als Editor das Adobe GoLive CS2. Da habe ich überprüft welche Einstellungen dort gemacht sind. Standard ist UTF-8.
Bei Kodierung steht Unicode Mehrsprachig UTF-8 (als Standard gesetzt)
und bei der Link Codierung ist auch UTF-8 eingestellt.

Dort war im Programm auch die Möglichkeit die Seiten in Standardkodierung zu konvertieren. Das habe ich gemacht um allem aus dem Weg zu gehen. Alles blieb gleich. An der falschen Mailübertragung hat sich nichts geändert.

Wie konfiguriere ich nun aber meine Mailfunktion damit die Umlaute richtig übertragen werden? Wo habe ich da einen Fehler?


Über eine weitere Hilfe wäre ich sehr dankbar.
 
Bisher nutze ich dieses SET NAMES nur bei der ersten Verbindung zur DB.
Einmal richtig eingetragenen Daten in der DB wurden bisher auch immer richtig dargestellt bei der Ausgabe.
Soll ich denn diesen Befehl auch immer vor jeder Ausgabe verwenden?

War die Frage bezogen auf mein Emailproblem, dann muss ich sagen, daß der Content für die mail nicht aus der DB kommt sondern statisch als html code in der Datei steht... also ...

PHP:
 $email["content"]["html"] ='Hallo '.$vorname.' !<br><br><br>wir freuen uns, dass Du dich für eine Anmeldung ..usw...<br><br>';


... und eben dieser Text kommt mit falschen Umlauten an obwohl es im Quelltext richtig geschrieben ist. Die Frage ist nur warum********

Die Variable $vorname , welche direkt aus dem <form> kommt, wird wenn umlaute drin sind auch falsch verschickt.

Hast Du dafür eine Idee woran das liegen kann?
 
Mh, also du solltest das SET NAMES utf8 als erste Abfrage absetzen, nachdem du dich mit der Datenbank verbunden hast. Danach musst du es nicht mehr verwenden, da es für die ganze Verbindung gilt.

Was jetzt dein E-Mail-Problem betrifft.. mh, da bin ich mir jetzt auch nicht sicher. Hast du vielleicht einen E-Mail-Klienten mit dem du mal in den Quelltext einer deiner E-Mails schauen könntest? Mozilla Thunderbird kann so was beispielsweise.
 
Der Header der Email in Thunderbird sieht so aus:

PHP:
MIME-Version: 1.0
Content-Type: multipart/alternative; 
This is a multi-part message in MIME format
--9FCBAE5D442A7682242C492963834480
Content-Type: text/html
Content-Transfer-Encoding: 8bit

Hallo TÌmö� !<br><br><br>wir freuen uns, dass Du dich fÌr eine Anmeldung...


Da steht jedenfalls nichts mit UTF-8 drin. Müsste es denn?


Ich habe mal vergleichsweise bei einer anderen Mail geguckt, einem HTML Internetflyer. Dort wurde das anscheinend anders gelöst.
Siehe hier:

PHP:
MIME-Version: 1.0
Content-Type: text/html
X-GMX-Antivirus: 0 (no virus found)
X-GMX-Antispam: 0 (eXpurgate);
 ......
X-Brightmail-Tracker: AAAAAA==
X-Brightmail-Tracker: AAAAAA==

<html>
<head>
<title>..:: Dresden-Nightlife ::..</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
.......


Dort steht im Header nur der Content-Type: text/html und das Charset wurde im Content untergebracht indem der Inhalt eine komplette HTML Seite ist richtig mit <html><head><body> usw. und dort im META Tag, aber nicht UTF-8 sondern iso-8859-1.

Sollte ich beim Email Header auch den iso-8859-1 nehmen?
 
Ähm, du verschickst eine E-Mail mit dem MIME-Type text/html, obwohl dieser eigentlich text/plain ist? Wenn du sie wirklich als HTML-Version verschicken willst, dann sollte deine E-Mail aber auch eine HTML-Seite sein!
 
Ich habe nun mein Email Content in eine vollständige HTML Seite umgeschrieben von <html> über <header>, <body> bis </html>

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><title>mail</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-EQUIV="pragma" content="no-cache"> <meta name="Content-Language" content="De"><link rel="stylesheet" type="text/css" href="main.css" title="CSS"></head><body><p>Hallo '.$vorname.' !<br><br><br>wir freuen uns, dass Du dich für eine Anmeldung..... usw...</p></body></html>


der Email Header der Funktion ist auch mit UTF-8 gefüllt.


PHP:
$email["header"] ='MIME-Version: 1.0 \r\n';
$email["header"] .='Content-Type: text/html; charset=utf-8 \r\n';


... dennoch kommt es falsch an!

Hallo TömÌ� !


wir freuen uns, dass Du dich fÃŒr eine ........



Im Header der Email von Thunderbird steht...



MIME-Version: 1.0
Content-Type: multipart/alternative;

This is a multi-part message in MIME format
--D7DBC2B6DF2DDA07499E8DFB9B93346F
Content-Type: text/html
Content-Transfer-Encoding: 8bit


Hierbei ist mir aufgefallen, daß dort kein: Content-Type" content="text/html; charset=UTF-8" steht obwohl ich es in den Header des Scriptes eingetragen habe.

Ich habe daher nochmal in der eigentlichen Funktion geguckt und habe dort den Eintrag testweise hinzugefügt.

also von: (wie die Funktion original ist)

PHP:
// wenn HTML-Inhalt angegeben wurde...  
    if( !empty($email["content"]["html"]) ){  
        // ...wird erstmal die "boundary" in den Header geschrieben,  
        // ein neuer MIME-type beginnt...  
        $mail_header .= "\n--".$boundary;  
        // MIME-type und Codierung werden angegeben  
        $mail_header .= "\nContent-Type: text/html";  
        $mail_header .= "\nContent-Transfer-Encoding: 8bit"; 
        // dann folgt wieder der eigentliche Inhalt  
        $mail_header .= "\n\n".$email["content"]["html"];  
    }


zu:


PHP:
// wenn HTML-Inhalt angegeben wurde...  
    if( !empty($email["content"]["html"]) ){  
        // ...wird erstmal die "boundary" in den Header geschrieben,  
        // ein neuer MIME-type beginnt...  
        $mail_header .= "\n--".$boundary;  
        // MIME-type und Codierung werden angegeben  
        $mail_header .= "\nContent-Type: text/html; charset=utf-8";  
        $mail_header .= "\nContent-Transfer-Encoding: 8bit"; 
        // dann folgt wieder der eigentliche Inhalt  
        $mail_header .= "\n\n".$email["content"]["html"];  
    }


Ansonsten alles gelassen wie gehabt.
Und siehe da nun waren die Umlaute in der Email korrekt und auch im Email Header stand das charset=utf-8 drin.


Erkenntnis:


Die Header Zuweisungen vor dem Funkltionsaufruf haben überhaupt nichts verändert. Auch die Zuweisung des Charsets innerhalb der html Email hat nichts geändert.

Nur Änderungen direkt in der Funktion im oben genannten Bereich haben eine Auswirkung auf das Verhalten beim Senden.

Sollte sich das bei den nächsten Versuchen bestätigen, dann hat sich meine Frage geklärt.

Und nochmal zur Vervollständigung, es handelt sich um die Mail Funktion:

send_MIME_email( $email );

... die auch im Netz zu finden ist. (siehe auch mein 1. Post)



Ergänzung:



In der Original Version der Funktion werden auch bei Plain Text Emails falsche Umlaute übermittelt. Mit dem direkten Eintrag des charset an der richtigen Stelle funktioniert letzendlich auch dieses.
Ich stelle die korrigierte Version hier gern auch nochmal komplett zur Verfügung falls damit mal noch jemand anderes probleme bekommt.

Im laufenden Script müssen nur die Variablen für den HTML und PLAIN Content gefüllt werden und dann die Funktion aufgerufen.


PHP:
//Die beiden Variablen heißen:

 $email["content"]["plain"] = 'hier reiner Text für die Mail';
 $email["content"]["html"] ='<html><head><body>Hier HTML Text...</bod></html>';

//Funktionsaufruf:

send_MIME_email( $email );


//hier die korrigierte Funktion mit charset=utf-8

function send_MIME_email( $email ){
    /*

    Parameter:    [Array]
                "recip":    Email Empf?nger (String)
                "sender":    Email Absender (String)
                "subject":    Betreff (String)
                "content":    [Array]
                            "plain":    Nachricht im Plaintextformat (String)
                            "html":        Nachricht im HTML-Format (String)
                "attachment":    Pfad der anzuh?ngenden Datei (String)
    Ausgabe:     Boolean (TRUE/FALSE)
                TRUE: Email wurde versendet
                FALSE: Email wurde nicht versendet
    */

    if( empty($email["recip"]) || empty($email["sender"]) || empty($email["subject"]) ) {
        // recip, sender oder subject wurden nicht angegeben
        return false;
    }

    if( !validate_email($email["recip"]) || !validate_email($email["sender"]) ) {
        // der Aufruf der Hilfsfunction oben ("validate_email") gab FALSE zur?ck,
        // die Email Adresse von Sender und/oder Empf?nger ist also ung?ltig
        return false;
    }

    if( empty($email["content"]["plain"]) && empty($email["content"]["html"]) ) {
        // es wurde weder Plaintext-Inhalt noch HTML-Inhalt angegeben,
        // die Nachricht ist also leer
        return false;
    }

    // Anders als bei einer "normalen" Mail wird bei einer MIME Mail
    // alles, was versendet werden soll, in den "Header" gepackt.
    // Die einzelnen MIME-Types werden durch eine feste Textzeile
    // eine voneinander getrennt, die "boundary". Diese wird hier
    // erst einmal aus dem Zeitstempel erzeugt:
    $boundary = strtoupper(md5(uniqid(time())));

    // Dann wird der Header gef?llt:
    $mail_header = "From: ".$email["sender"];

    // Hier erh?lt der Mail Client die Information,
    // dass es sich um eine MIME Mail handelt...
    $mail_header .= "\nMIME-Version: 1.0";

    // ...und die Trennkennung - die "boundary" wird mitgeteilt, damit
    // die einzelnen Teile nicht als ein Brei verstanden werden
    $mail_header .= "\nContent-Type: multipart/alternative; boundary=".$boundary;
    $mail_header .= "\n\nThis is a multi-part message in MIME format";

    // wenn Plaintext Inhalt angegeben wurde...  
    if( !empty($email["content"]["plain"]) ){  
        // ...wird erstmal die "boundary" in den Header geschrieben,  
        // ein neuer MIME-type beginnt...  
        $mail_header .= "\n--".$boundary;  
        // der MIME-type wird angegeben  
        $mail_header .= "\nContent-Type: text/plain; charset=utf-8";
        // ebenso die Codierung  
        $mail_header .= "\nContent-Transfer-Encoding: 8bit";  
        // und dann der eigentliche Inhalt  
        $mail_header .= "\n\n".$email["content"]["plain"];  
    }  
      
    // wenn HTML-Inhalt angegeben wurde...  
    if( !empty($email["content"]["html"]) ){  
        // ...wird erstmal die "boundary" in den Header geschrieben,  
        // ein neuer MIME-type beginnt...  
        $mail_header .= "\n--".$boundary;  
        // MIME-type und Codierung werden angegeben  
        $mail_header .= "\nContent-Type: text/html; charset=utf-8";  
        $mail_header .= "\nContent-Transfer-Encoding: 8bit"; 
        // dann folgt wieder der eigentliche Inhalt  
        $mail_header .= "\n\n".$email["content"]["html"];  
    } 

    // wenn eine Datei zum anh?ngen angegeben wurde...
    if( !empty($email["attachment"]) ){
        $file = $email["attachment"];
        $filename = basename( $file );

        // ...existiert die Datei ?berhaupt und ist sie lesbar?
        if( @is_file($file) && @is_readable($file) ){
            // ja, also wird sie ge?ffnet...
            $fp = @fopen( $file, "rb" );
            if( $fp ){
                // ...und in eine Variable ($buffer) eingelesen,
                $buffer = fread( $fp, filesize($file) );
                // dann BASE64 codiert, weil es sich bin?re Daten handelt
                $buffer = base64_encode( $buffer );
                // und auf 72 Zeichen pro Zeile gestutzt.
                $buffer = chunk_split( $buffer, 72 );
                // Die Datei wird wieder geschlossen, wir sind ja ordentlich.
                fclose($fp);

                // Jetzt kommt wieder die "boundary" in den Header,
                $mail_header .= "\n--".$boundary;
                // der MIME-type und hier zus?tzlich der Dateiname werden angegeben.
                $mail_header .= "\nContent-Type: application/octet-stream; name=\"".$filename."\"";
                // die Codierung ist hier BASE64
                $mail_header .= "\nContent-Transfer-Encoding: base64";
                // und dem Mail Client wird mitgeteilt, dass es sich um einen Anhang handelt.
                $mail_header .= "\nContent-Disposition: attachment; filename=\"".$filename."\"";
                // Jetzt folgt die BASE64-codierte Datei
                $mail_header .= "\n\n".$buffer;
            } else {
                // Die Datei konnte nicht ge?ffnet werden
            }
        }
    }

    // Jetzt muss die erzeugte Mail nur noch versendet werden.
    // der PHP Befehl "mail" wird mit den Parametern
    // mail( recipient, subject, body, header ) aufgerufen und
    // gibt TRUE oder FALSE zur?ck, dieser R?ckgabewert wird
    // einfach weitergeleitet
    if( !mail($email["recip"],$email["subject"],"",$mail_header) )
       {
       return false;
       }
       else
       {
       return true;
       }
}

//Ende function  send_MIME_email
 
Vielleicht liegt es auch noch daran, dass du statt \r\n nur \n nutzt und somit der E-Mail-Klient die einzelnen Header-Zeilen nur als eine wahrnimmt und nicht richtig interpretiert.
 
Zurück