PHP HTML Versandt: Problem bei Umbrüchen

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
563
Hallo,

ich versuche gerade eine HTML Mail zu versenden.

Ich habe lediglich beim "content" ein Problem, so dass Zeilenumbrüche in der Mail als \r\n dargestellt werden.

PHP:
<?php
/**
 * DevListBlog
 *
 * Copyright (C) 2012-2013 Blackbenji
 *
 * @package ---
 * @link    ---
 * @license http://www.gnu.org/licenses/lgpl-3.0.html LGPL
 */

class Mail {

    public function __construct() {}

    public function sendContactMail() {
        $output = $this->cleanInput();
        if (!$output['name'] == NULL && !$output['email'] == NULL && !$output['content'] == NULL){
            if (filter_var($output['email'], FILTER_VALIDATE_EMAIL)) {
                $acceptor="meine@addresse.de";
                $name=$output['name'];
                $sender=$output['email'];
                $subject="Eine Kundenanfrage";
                $content=$output['content'];

                $mailbody = file_get_contents( TEMPLATE_DIR.FRONTEND.'mail.vm' );

                $mailbody = str_replace( '###NAME###', $name, $mailbody );
                $mailbody = str_replace( '###EMAIL###', $sender, $mailbody );
                $mailbody = str_replace( '###NACHRICHT###', nl2br($content), $mailbody );

                // Mail Header erstellen
                $mailheader  = "From: ".$sender."\r\n";
                $mailheader .= "Reply-To: " .$sender. "<" .$sender. ">\r\n";
                $mailheader .= "Return-Path: noreply@" .$_SERVER['SERVER_NAME']. "\r\n";
                $mailheader .= "MIME-Version: 1.0\r\n";
                $mailheader .= "Content-Type: text/html; charset=UTF-8\r\n";
                $mailheader .= "Content-Transfer-Encoding: 7bit\r\n";
                $mailheader .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
                $mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n\r\n";

                // Email versenden
                if (@mail( $acceptor, htmlspecialchars( $subject ), $mailbody, $mailheader ))
                {
                    return true;
                }

            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    private function cleanInput() {
        $input['name'] = stripslashes($_POST['name']);
        $input['email'] = stripslashes($_POST['email']);
        $input['content'] = stripslashes($_POST['content']);

        $input['name'] = trim($input['name']);
        $input['email'] = trim($input['email']);
        $input['content'] = trim($input['content']);

        $input['name'] = mysql_real_escape_string($input['name']);
        $input['email'] = mysql_real_escape_string($input['email']);
        $input['content'] = mysql_real_escape_string($input['content']);
        return $input;
    }
}

Das Formular dazu sieht so aus:
HTML:
        <form accept-charset="utf-8" action="<?=$_SERVER['SCRIPT_NAME']?>?contact=send" method="post">
            <div class="element">
                <label for="name">Name <span class="red">(wird benötigt)</span></label>
                <input id="name" name="name" class="text err" />
            </div>
            <div class="element">
                <label for="email">Email <span class="red">(wird benötigt)</span></label>
                <input id="email" name="email" class="text err" />
            </div>
            <div class="element">
                <label for="content">Nachricht <span class="red">(wird benötigt)</span></label>
                <textarea name="content" class="textarea err" rows="5"></textarea>
            </div>
            <div class="element">
                <button type="submit" class="add">absenden</button> <a class="button lost" href="" rel="deactivate">abbrechen</a>
            </div>
        </form>

und das template:

HTML:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Kundenanfrage</title>
<style type="text/css">
body { font: normal 12px Verdana, Arial, Helvetica, sans-serif; }
a { color: blue; text-decoration: none; }
h2 { font-size: 16px; font-weight: bold; }
.gruen { color: green; }
</style>
</head>
<body>
<h2>Soeben ist eine Nachricht von <span class="gruen">###NAME###</span> eingetroffen.</h2>
<p>Als Antwortadresse wurde <a href="mailto:###EMAIL###">###EMAIL###</a> angegeben.</p>
<p>Die Nachricht die gesendet wurde lautet:<br />
###NACHRICHT###<br />
</p>
</body>
</html>

output:
HTML:
Soeben ist eine Nachricht von 1 eingetroffen.

Als Antwortadresse wurde xxx angegeben.

Die Nachricht die gesendet wurde lautet:
123\r\n123\r\n123\r\n123\r\n123
 
mysql_real_escape_string() macht dir da nen strich durch die rechnung, das brauchste beim output in der mail nicht.

nl2br() wäre dein freund, zumindest beim output in der mail, alternativ noch strip_tags(), damit die mail kein humbug enthält :)
 
hedsht schrieb:
mysql_real_escape_string() macht dir da nen strich durch die rechnung, das brauchste beim output in der mail nicht.

nl2br() wäre dein freund, zumindest beim output in der mail, alternativ noch strip_tags(), damit die mail kein humbug enthält :)

Oder gleich auf die fertige, jahrelang aufgebaute und stets weiterentwickelte Klasse PHPMailer wechseln. Der Wechsel meiner eigenen Klasse hin zu PHPMailer hat sich mehr als gelohnt, u.a. auch was valide eMails angeht die viel weniger in SPamfiltern hängen bleiben als selbst gefrickelte php mail Klassen.

http://code.google.com/a/apache-extras.org/p/phpmailer/
 
Überkinger schrieb:
Oder gleich auf die fertige, jahrelang aufgebaute und stets weiterentwickelte Klasse PHPMailer wechseln. Der Wechsel meiner eigenen Klasse hin zu PHPMailer hat sich mehr als gelohnt, u.a. auch was valide eMails angeht die viel weniger in SPamfiltern hängen bleiben als selbst gefrickelte php mail Klassen.

http://code.google.com/a/apache-extras.org/p/phpmailer/

ja, das geht natürlich auch, nutze ich selbst sehr viel, lässt sich aber nicht verkaufen und das script oben scheint mir eher eine komerzielle lösung zu sein.

was spam betrifft... da gehört noch einiges mehr dazu, wie zb der passende reverse dns eintrag, aber das war hier gar nicht gefragt :).
 
hedsht schrieb:
ja, das geht natürlich auch, nutze ich selbst sehr viel, lässt sich aber nicht verkaufen und das script oben scheint mir eher eine komerzielle lösung zu sein.
PHPMailer liegt unter LGPL, Verkauf der Software ist also gar kein Problem. Während jedes Programm, dass GPL-Code einbindet, unter GPL stehen muss, kann man LGPL in kommerzielle Closed-Source - Software einbinden. Man muss nur den Quellcode für die LGPL-Teile zugänglich machen sowie eben darauf hinweisen, dass LGPL-Code verwendet wird.
Gibt Massen an guter Closed Source Software, die LGPL-Code einbindet. Chrome & Safari zum Beispiel (Webkit). Viele unfreie CMS oder Shopsysteme verwenden auch den PHPMailer, einfach weil er genial ist.
 
Zurück
Oben