mitchell
Goto Top

Mailfunktion gibt Zeichen für Zeilenumbrüche in textarea aus

Hi,

ich habe jetzt diverse Foren durch und alles ausprobiert, was Google mir ausgespuckt hat bzw. mir in den Sinn kam. Ich komme nicht weiter, vielleicht könnt ihr mir helfen.

Vor mir liegt ein Formular, mit welchem ich per "mail" die Daten, die per POST übermittelt werden, an mich schicke. Nun habe ich im Script selber die Input-Felder durch "\r\n" mit einem Abstand versehen, dies kommt auch in der E-Mail so an. Also

Vorname

Nachname

usw.

Ganz unten gibt es eine textarea ($text), sobald der User hier was einträgt, bekomme ich in meiner E-Mail diese als "\r\n" angezeigt. Versucht habe ich schon folgendes:

- header komplett weggelassen (außer natürlich dem Absender)
- header Content-Type auf plain bzw. html gesetzt, bei beiden mal folgendes getestet:

str_replace("\r\n", "", $text)  
str_replace("\r\n", "\r", $text)  
str_replace("\r\n", "\n", $text)  
str_replace("\r\n", "\n\n", $text)  
str_replace("\r\n", "<br>", $text)  
str_replace("<br>", "\r\n", $text)  

(letzteres ein Verzweiflungsakt *g*)

- header Content-Type auf utf-8 und ISO-8859-1 gesetzt (aktuell wieder utf-8)
- in der textarea ein "nl2br" eingefügt (auch Verzweiflungsakt)
und zuletzt nochmal - aus Verzweiflung - den Text der textarea htmltauglich gemacht
nl2br($text)
htmlentities($text)

Ich weiß nicht mehr, was ich noch tun soll. Sehr kurios finde ich auch die Tatsache, dass genau das selbe Script (außer dem header) auf anderen Servern ohne Probleme funktioniert. Über den Server kann ich euch noch nichts sagen, aber ich gehe mal von Debian aus. EDIT: Server OS ist Debian.
Hat jemand eine Idee?

Mfg
Mitchell

Content-ID: 174330

Url: https://administrator.de/contentid/174330

Ausgedruckt am: 19.12.2024 um 12:12 Uhr

dog
dog 08.10.2011 um 18:17:48 Uhr
Goto Top
Also nur damit ich dich richtig verstehe:

Wenn der Benutzer
Hallo
Welt

eingibt kommt bei dir die Mail als
Hallo\r\nWelt

an?
Mitchell
Mitchell 08.10.2011 um 21:57:47 Uhr
Goto Top
richtig

PS: Das sind 30 Zeichen
dog
dog 08.10.2011 um 22:02:17 Uhr
Goto Top
Da das ein übliches Risiko bei Mailformularen ist würde ich mal auf Sicherheitsfunktionen wie mod_security oder suhosin patch tippen.

Das lässt sich prüfen wenn du einfach mal ganz oben im Script
<?php var_dump($_POST); ?>

machst.
Die Zeilenumbrüche sollten dann regulär dargestellt werden.
Mitchell
Mitchell 09.10.2011 um 13:56:21 Uhr
Goto Top
sorry, hatte ich oben vergessen. Ich hab die Variable schon mit "var_dump" und "print_r" ausgeben lassen. Der Zeilenumbruch wird mir allerdings nur ausgegeben (im Browser), wenn ich halt noch ein "nl2br" dran hänge. Wenn ich also schreibe:

var_dump($text)
bekomme ich als Antwort string(9) "i k k "

In der textarea habe ich die drei Buchstaben jeweils mit Zeilenumbruch geschrieben. Ach ja..:$text ist natürlich $_POST['text'] face-smile

Mfg
Mitchell

PS: Server läuft übrigens auf Debian
Arano
Arano 09.10.2011 um 14:51:53 Uhr
Goto Top
Hallo

...bekomme ich als Antwort string(9) "i k k "
Du musst dann __in den Quelltext__ der erzeugten Seite schauen !
"Normale" Zeilenumbrüche werden in/als HTML doch nicht angezeigt, bzw. nur als "Leerzeichen" - genau wie Tabulatoren oder mehrere Leerzeichen ;)

Wie fügst du das denn in die E-Mail ein (Quellcode)
Mach hier auch noch einmal ein var_dump(), von der Variable mit dem Text selber und hinterher vom E-Mail-Quellode und von der POST-Variable !
...im Quelltext schauen...

Ach ja..:$text ist natürlich $_POST['text']
Was soll das heißen ?
Etwa $text = $_POST['text'] oder gar register_globals = On ?

Was für ein System verwendest du ?
Bzw. Wie stellt dein System einen Zeilenumbruch dar ? (\r | \n | \r\n)


~Arano
Mitchell
Mitchell 09.10.2011 um 15:28:11 Uhr
Goto Top
Du musst dann __in den Quelltext__ der erzeugten Seite schauen !
"Normale" Zeilenumbrüche werden in/als HTML doch nicht angezeigt, bzw. nur als "Leerzeichen" - genau wie
Tabulatoren oder mehrere Leerzeichen ;)

schon klar face-smile im Quelltext ist der Zeilenumbruch vorhanden.

Wie fügst du das denn in die E-Mail ein (Quellcode)

ich schreibe den Text der textarea in die Variable und gebe es normal an die Mailfunktion weiter, also:
<textarea name="text" cols="50" rows="8" id="text"></textarea>  
und
mail($mail, $subject, $msg, $header)

in $msg stehen die restlichen Variablen und natürlich dann die Variable $text.

Mach hier auch noch einmal ein var_dump(), von der Variable mit dem Text selber und hinterher vom E-Mail-Quellode und von der
POST-Variable !
...im Quelltext schauen...

die Variable mit dem Text und die POST-Variable sind die gleichen...daher $text = POST['text']. Ein var_dump vom E-Mail Quellcode ergibt das selbe, wie der var_dump von $text. Außer natürlich, ich führ var_dump direkt mit der Funktion aus, also
var_dump(mail($to, $subject, $msg, $from)
, dann bekomme ich ein bool(false)

Was soll das heißen ?
Etwa $text = $_POST['text'] oder gar register_globals = On ?

nein, siehe oben. Ich habe den POST Wert damit nur in eine andere Variable geschrieben ^^

Was für ein System verwendest du ?
Bzw. Wie stellt dein System einen Zeilenumbruch dar ? (\r | \n | \r\n)

Der Server läuft unter Debian und lt. var_dump sind die Umbrüche mit \r\n dargestellt...so zeigt es mein Outlook 2000 übrigens auch an.

Ich habe übrigens noch was probiert, klappt aber auch nicht. Egal, in welcher Weise:
str_replace("\r\n", chr(10).chr(13), $text)  

Mfg
Mitchelll
Arano
Arano 09.10.2011 um 15:46:28 Uhr
Goto Top
Hi Mitchell

Was für ein System verwendest du ?
Der Server läuft unter Debian und lt. var_dump sind die Umbrüche mit \r\n dargestellt...so zeigt es mein Outlook 2000 übrigens auch an.
Hehe... ich wollte wissen was für ein System DU verwendest, welches Betriebssystem hat der Computer mit dem du den Browser aufrufst. Aber da du Outlook verwendest, wird es wohl ein Windows sein.

Wie fügst du das denn in die E-Mail ein (Quellcode)
...in $msg stehen die restlichen Variablen und natürlich dann die Variable $text.
Genau das wollte ich doch sehen, also wie setzt du die Variable $msg zusammen, den Quellcode.
und wo ich das gerade sehe, zeige gleich noch mal wie du $header zusammensetzt und was drin steht.

Edit:
Handelt es sich eigentlich um Plaintext- oder HTML-Mails ?

~Arano
Mitchell
Mitchell 09.10.2011 um 16:38:55 Uhr
Goto Top
Hi Arano,

jep, ich verwende Windows XP face-smile

Code für die Mail + Header:

	$header  = "MIME-Version: 1.0\r\n";  
	$header .= "Content-type: text/plain; charset=utf-8\r\n";  
	$header .= "Content-Transfer-Encoding: quoted-printable\r\n";  
	$header .= "From: Bestellung|Graphic-24.de ".$_POST['email']."\r\n";  


	$msg = $vorname."\r\n\r\n".$nachname."\r\n\r\n".$email."\r\n\r\n".$telefon."\r\n\r\n".$wohnort."\r\n\r\n".$plz."\r\n\r\n".$adresse."\r\n\r\n".$kategorie."\r\n\r\n".$text;  

Die Mail geht als Plain raus, wie oben zu sehen ist ^^. Habs aber auch schon mit html probiert.

Mfg
Mitchell
dog
dog 09.10.2011 um 16:51:12 Uhr
Goto Top
Werden denn die anderen Zeilenumbrüche in der Mail richtig dargestellt?
$msg = $vorname."\r\n\r\n".$nachname

Thema str_replace:
Das einzige was entfernt Sinn machen würde wäre
str_replace("\\r\\n","\r\n",$text);  

, dann bekomme ich ein bool(false)

Dann solltest du mal error_reporting anschalten und dir den Fehler angucken face-smile
Mitchell
Mitchell 09.10.2011 um 22:19:52 Uhr
Goto Top
Hi dog,

die andren Zeilenumbrüche werden richtig dargestellt.

Wieso macht dein Replace Sinn? Also ich glaubs dir schon, ich sehs nur nich face-smile Der Zeilenumbruch ist doch ein "\r\n\, wieso also nochmal escapen?

Error_reporting ist an, ich bekomme so keinen Fehler. Aber ich könnt mal ins Errorlog gucken, vielleicht gibts da was ^^. Morgen gibts Feedback.

Mfg
Mitchell
Mitchell
Mitchell 10.10.2011 um 00:47:05 Uhr
Goto Top
Ich glaubs net, mit deinem Replace funktioniert es. Error Reporting sagt zwar immernoch nix, aber gut, was soll da auch kommen? ^^

Dog, you made my day. Jetzt würd ichs nur noch gerne verstehen. Warum geht
str_replace("\r\n", chr(10).chr(13), $text)  
nicht?
Und warum funktioniert deins? face-smile

Tausend dank schonmal.

Mfg
Mitchell
dog
dog 10.10.2011 um 01:02:43 Uhr
Goto Top
Naja, ganz einfach:

In deiner E-Mail steht der Text "\r\n" (das sind die vier Zeichen \ r \ n)
Ein "\r\n" wird in PHP ausgewertet zu, na....genau einem Zeilenumbruch (also den zwei Zeichen CR LF).

Dein str_replace("\r\n", chr(10).chr(13), $text) würde also schlicht einen Zeilenumbruch mit einem Zeilenumbruch ersetzen (allerdings der hoch-untypischen Variante LF CR) face-smile

Du wolltest aber den Regulären Text "\r\n" in einen Zeilenumbruch umwandeln.
In dem Fall kannst du es entweder als "\\r\\n" oder '\r\n' schreiben.

Allerdings ist das immer noch keine Lösung.
Wenn in dem gePOSTeten Text die Zeilenumbrüche noch regulär sichtbar sind musst du ja irgendwo einen Code-Aufruf haben, der die Zeilenumbrüche konvertiert.
Mitchell
Mitchell 10.10.2011 um 16:11:19 Uhr
Goto Top
Hm ok, das Escapen seh ich langsam ein ^^, aber dann frage ich mich immernoch, warum die erste Lösung str_replace{"\r\n\", "", $text) bei anderen funktioniert. Ich verstehe einfach nicht, warum manche escapen müssen und andere anscheinend nicht face-smile
Nur nochmal nebenbei (stößt bei mir auch auf Unverständnis): Das selbe Script läuft auf meinem Webspace ohne Probleme. OS des Servers ist das selbe, der Unterschied ist nur, dass ich in dem Script auf meinem Webspace keinen Header (mit Charset) angegeben habe. Allerdings wird mir hier bei var_dump($text) auch nichts ausgegeben bzgl. der Zeilenumbrüche.

Wenn in dem gePOSTeten Text die Zeilenumbrüche noch regulär sichtbar sind musst du ja irgendwo einen Code-Aufruf haben, der die Zeilenumbrüche konvertiert.

die Umbrüche sind ja nur im Plaintext sichtbar, so soll es doch auch sein, oder nicht? Im Browserfenster werden die Zeilenumbrüche natürlich nicht dargestellt, nur im Quelltext. Und dort wird \r\n behandelt, wie in einer textarea...es wird normal dargestellt.
Oder meinst du was anderes?

Mfg
Mitchell
dog
dog 10.10.2011 um 17:43:41 Uhr
Goto Top
die Umbrüche sind ja nur im Plaintext sichtbar, so soll es doch auch sein, oder nicht?

Ja
Mitchell
Mitchell 10.10.2011 um 18:14:28 Uhr
Goto Top
was meinst du dann mit "allerdings..."? face-smile

Mfg
Mitchell
dog
dog 10.10.2011 um 19:38:04 Uhr
Goto Top
Naja, im POST ist der Zeilenumbruch noch da, aber wenn den Text an die Mail anhängst ist er auf einmal weg.
Da muss noch irgendwas dazwischen passieren face-smile
Mitchell
Mitchell 10.10.2011 um 20:21:24 Uhr
Goto Top
nö...kannst ja oben gucken, mehr is da nich ^^. Außerdem ist im POST ja \r\n da, von daher passt das schon.

Mfg
Mitchell
dog
dog 10.10.2011 um 20:26:52 Uhr
Goto Top
Irgendwie war mir das schon klar....

Die Zeilenumbrüche sollten dann regulär dargestellt werden.

Damit meinte ich, dass die Zeilenumbrüch als

Hallo
Welt

dargestellt werden.

Hallo\r\nWelt

Ist für mich kein regulärer Zeilenumbruch. face-smile

Womit wir wieder beim Thema sind: Auf dem Server läuft irgendein Modul, dass Zeilenumbrüche escapt.
Mitchell
Mitchell 11.10.2011 um 15:38:04 Uhr
Goto Top
ach so meinste das face-smile...kann ich dir leider nicht sagen, vielleicht in dem CMS irgendwas. Ich wollte jetzt nur dafür sorgen, dass dieses Formular richtig ankommt. Bei Gelegenheit schaue ich mal nach, momentan bin ich erstmal zufrieden ^^^.
Danke nochmal, hast dir ein Bier oder nen Kaffee verdient.

Mfg
Mitchell