Sonderzeichenproblem - Formulardaten per Email verschicken

  • Themenstarter Themenstarter kunstler
  • Beginndatum Beginndatum
K

kunstler

Hallo zusammen!

habe mich soeben hier angemeldet, weil ich mittlerweile stundenlang nach einer Lösung für mein (wahrscheinlich ganz triviales) Problem gesucht habe (auch auf diesen Seiten), aber noch nichts passendes gefunden habe.

Ich bin ein PHP-Neuling ...

Situation:
1.
Formulardaten werden mit $_POST[] eingelesen und aus Sicherheitsgründen sofort mit stripslashes() und. htmlentities() escaped, weil ich sie später mal auf der Webseite ausgeben will. In etwa so:

PHP:
function esc($text)   {
     if (get_magic_quotes_gpc())
        $text = stripslashes($text); 
     $text = htmlentities($text, ENT_QUOTES);
     $text = trim($text); 
     return $text;
}

// ...

$vorname = esc($_POST['vorname']);
$nachname = esc($_POST['nachname']);
$nachricht= esc($_POST['nachricht']);

// ...

2.
Nun will ich diese Daten per mail() versenden. In etwa so:

PHP:
$empfaenger = "...";
$betreff = "...";
$nachricht = "Die ist eine Email von ".$vorname." bla bla. Nachricht: ".$nachricht;
$header = "...";

mail($empfaenger, $betreff, $nachricht, $header);

3.
Funktioniert bis hier her auch alles einwandfrei und die Email kommt auch genau so an wie ich mir das vorstelle.

Problem:

Wenn nun im Formular bspw.

"Günther" oder
"Straße" oder
">"

oder sonstige Zeichen, die mittels htmlentities() in Html-Code umgewandelt wurden, eingegeben werden, dann stehen die in der Email natürlich auch in ihrer Html-Code-Entsprechung, also bspw.

Günther
Straße
>

Frage: Wie kann ich diese Html-Codierung in der Email wegbekommen? Ziel ist also, dass quasi die üblichen Sonderzeichen auch als Sonderzeichen in quasi beliebigen Email-Programmen angezeigt werden.

Eigene Lösungsansätze
Ich habe bereits versucht, die per mail() übermittelte Nachricht irgendwie umzucodieren, allerdings hat das rein gar nichts am Emailtext verändert. Ich habe es in etwa so versucht:

PHP:
$nachricht = utf8_decode($nachricht);

// oder

$nachricht = utf8_encode($nachricht);

// oder modifizierte Header-Angaben

$header = "...";
$header .= "Content-Type: text/plain; charset='utf-8'\n";
// und-oder
$header .= "Content-Transfer-Encoding: 8bit\n";
// und-oder
$header .= "Content-type:text/plain; charset=iso-8859-1\n";
// und-oder
$header .= "Content-Transfer-Encoding: quoted-printable\n";

Was mache ich falsch? Bitte um Unterstützung.

Danke!
 
Wenn du die E-Mail als Klartext sendest, werden die HTML-Zeichenreferenzen auch als Klartext dargestellt.
 
Danke, das hat mir weitergeholfen.

Hatte bisher im Header text/plain stehen und nun text/html. Damit ist mein Problem erstmal behoben und eigentlich ist das auch trivial. Aber habs voll übersehen!

Nächste Frage: Lösung trotz text/plain?

Prinzipiell wäre es mir lieber, die Emails alle als plaintext zu verschicken. Gibt es daher noch eine andere Lösung für mein obiges Problem oder kann das im Klartext gar nicht funktionieren, auch wenn ich die Zeichen vorher sonst wie bearbeite?

Allgemein ist es doch schon möglich, viele Sonderzeichen wie ä, ö, ü auch in reinen Text-Emails zu schicken, oder?
 
Solange die jeweiligen Zeichen im Zeichensatz vorhanden sind und damit auch von einer Zeichenkodierung kodiert werden können, können die Zeichen direkt verwendet werden.

In deinem Fall rate ich dir zur UTF-8-Kodierung, mit der sämtliche Unicode-Zeichen kodiert werden können.
 
Ja, das dachte ich auch, dass UTF-8 am besten wäre, aber das scheint ja eben nicht zu klappen:

Wenn ich im Header etwa angebe:

$header = "...";
$header .= "Content-Type: text/plain; charset='utf-8'\n";
$header .= "Content-Transfer-Encoding: 8bit\n";

und dann meinen Nachrichtentext vor dem Versand mittels
$nachricht = utf8_encode($nachricht);
kodiere, dann passiert nichts, d.h. Sonderzeichen werden immer noch zerhauen ausgegeben.

Ich suche quasi nach einer Funktion, die folgendes macht:
PHP:
$nachricht = "Günther";
$nachricht_emailtauglich = funktionxy($nachricht);

mit der Ausgabe "echo $nachricht_emailtauglich;" => "Günther"

D.h. mein Problem ist nicht, dass aus einem ü in der Email irgendwas unlesbares wird, sondern dass aus einem ü in der Email ein ü werden soll, aber immer ü versendet wird.
 
ü ist eine HTML-Kodierung und wird nur bei als HTML interpretierten Dokumenten dekodiert, das heißt durch die jeweiligen Zeichen ersetzt. Und dies geschieht durch den Inhaltstyp text/html. text/plain steht hingegen für Klartext und nicht HTML.
 
Zurück