[PHP] mail() schiebt zwischen jede Zeile eines textarea-Feldes eine weitere

Zweipunktnull

Commander
Registriert
Dez. 2004
Beiträge
2.546
Hallo!

Ähm... ja, hoffentlich klingt der Titel nicht schon zu verwirrend. :)
Also ich habe folgendes Problem:

Ich gebe in ein textarea-Feld einen beliebigen Text ein. Danach verschicke ich den Text mithilfe der PHP-Funktion mail(). Allerdings ist später dann in der E-Mail zwischen jeder Zeile noch eine weitere Leerzeile.
Ich gebe am Besten einmal ein Beispiel:

Eingabe im textarea-Feld:

Code:
Hallo!
Heute ist hier in D:\RLP\MYK\ ein sehr sonniger Tag.

Mir ist sehr heiß.

E-Mail:
Code:
Hallo!

Heute ist hier in D:\RLP\MYK\ ein sehr sonniger Tag.



Mir ist sehr heiß.

Unter jede Zeile wird einfach noch eine Leerzeile eingefügt und ich finde den Fehler einfach nicht.

Hier mal der dafür zuständige PHP-Code:
PHP:
        $to      = $cfg_mailto;
        $subject = stripslashes($subject);
        $message = stripslashes("Datum: $date\nName: $name\nVorname: $first_name\nE-Mail-Adresse: $email\n\nBetreff: $subject\nNachricht:\n$message");
        $from    = "From: $first_name $name <$email>";
        
        if (@mail($to, $subject, $message, $from))

In $message ist der Inhalt vom textarea-Feld gespeichert.
 
Aus dem Code-Fragement läßt sich überhaupt nichts ableiten, da die relevanten Zeilen fehlen… :D
Wie wird $message vor der 3. Zeile aus dem Fragment zusammengesetzt? Wie sieht $message aus, wenn's als Parameter an mail() übergeben wird? Könnte der MTA Carriage Return + Line Feed zu doppelten Line Feeds konvertieren? Konvertiert evtl. der MUA Carriage Returns zu Line Feeds? Fragen über Fragen… ;)

greetings, Keita
 
öh.. ja.. alles verstanden :)

also.. viel mehr code gibts aber gar nicht.

PHP:
$message = trim($_POST['message']);

das ist das alles. mehr wird mit message nicht gemacht. $_POST['message'] kommt halt direkt vom formular. das is ja auch mein Problem. das sind doch eigentlich so wenige schritte, wo soll sich da n fehler schleichen.

hm.. ich glaub es ist zwar irrelevant, aber ich kann ich auch ma den HTML-code angeben:

HTML:
Nachricht<br />
<textarea class="message" name="message" cols="0" rows="10"></textarea>

php fängt es dann halt wie bereits gesagt mit
PHP:
$message = trim($_POST['message']);
auf und die nächsten schritte die mit message gemacht werden sind die aus dem ersten post.

EDIT:
Ich hab jetzt mal direkt vor dem
PHP:
if (@mail($to, $subject, $message, $from))
ein echo $message; eingebaut und mir den quellcode angeschaut. da sind noch keine zusätzlichen leerzeilen drin. das heißt die variable $message ist vollkommen okay. wieso werden jetzt in der email diese leerzeilen eingebaut? ich verschick die doch nur ganz einfach mit @mail($to, $subject, $message, $from) :confused_alt:
 
Zuletzt bearbeitet:
Was passiert denn, wenn du die Zeile
PHP:
$message = stripslashes("Datum: $date\nName: $name\nVorname: $first_name\nE-Mail-Adresse: $email\n\nBetreff: $subject\nNachricht:\n$message");
weglässt?

greetings, Keita
 
Wenn ich diese zeile weglass, besteht das problem immernoch.

hab in der zwischenzeit noch was ausprobiert:
PHP:
        $to       = $cfg_mailto;
        $subject  = stripslashes($subject);
        $mssage  = stripslashes("Datum: $date\nName: $name\nVorname: $first_name\nE-Mail-Adresse: $email\n\nBetreff: $subject\nNachricht:\n$message");
        $headers  = "From: $first_name $name <$email>\r\n";
        $headers .= "MIME-Version: 1.0\r\n";
        $headers .= "Content-type: text/plain; charset=iso-8859-1";
        
        if (@mail($to, $subject, $message, $headers))

hilft auch nix, wenn ich den typ text/plain angebe.. aber du hast bestimmt wie immer ne idee :)
 
Versuchs mal mit
PHP:
$message = str_replace("\r", '', $message);
vor dem Aufruf von mail()… damit eliminierst du die carriage returns, die vermutlich irgendwo von irgendjemandem zu line breaks konvertiert werden.

greetings, Keita
 
funktioniert. aber.. war das problem jetzt webserverabhängig? mit anderen worten: wenn ich das skript auf einem anderen webserver einsetzen will, muss ich es anpassen? denn ein webserver, der "richtig" arbeitet, der brauch doch beides, carriage returns und new lines, oder? wenn ich das skript auf einem richtig funktionierenden webserver einsetze, gibt es dann keine fehler wenn auf einmal die carriage returns fehlen?
oder von was hing das jetzt ab? muss doch wohl ne fehlfunktion des webservers sein, oder?
 
Das Problem wird entweder von einem der involvierten MTAs (Mail Transfer Agent = Mailserver) oder deinem MUA (Mail User Agent = Mailclient) verursacht, der Webserver oder PHP haben mit dem Problem nichts zu tun.

greetings, Keita
 
ja gut, also ist das problem aber trotzdem doch serverabhängig.
Also das skript würde so in der form unter umständen nicht auf einem anderen server korrekt laufen, wenn der andere server einen anderen MTA einsetzt, oder?
 
Es ist strenggenommen webclient-abhängig, da carriage returns stumpf eliminiert werden, d.h. Eingaben in Mac-Format sind danach nur noch Einzeiler. Du könntest das Problem dadurch umgehen, daß du anstelle von str_replace() preg_replace() nimmst:

PHP:
$message = preg_replace('/\r\n|\r/', "\n", $message);

Auf diese Weise werden sowohl CR+LF als auch CR durch LF ersetzt und die MTAs bekommen nur noch LFs.

greetings, Keita
 
könnte es statt \r\n nicht auch \n\r sein? in dem fall müsstest du
PHP:
$message = preg_replace('/\r\n|\n\r|\r/', "\n", $message);
verwenden.

dann sollte das ganze eigentlich in jedem fall funktionieren.
 
nee.. ich glaube nicht..

soweit ich weiß:

dos/windows -> /r/n
mac os bis v9 -> /r (ab version 10 auch /n )
unix/linux usw. -> /n
 
Zurück
Oben