DiamondDog: Problem mit fett schreiben beim versenden von Mail.

Hallo Leute,
ich hab ein kleines Kontaktformular für meine Hompage und wollte wenn mir die Sachen jetzt per Mail geschickt werden bestimmte Teile fett schreiben. Also die Mail als html senden. Leider krieg ich das egal was ich versuche nicht hin. Hier mal mein Code:

  
<?  
// Wir legen eine Variable mit deiner E-Mail  
$ihremail = "E-Mail@gmx.de";  
// Lege nun eine leere Variable für Fehler an (wird später benötigt)  
$error = "";  
// IP-Adresse übertragen  
$ip = "".$HTTP_SERVER_VARS["REMOTE_ADDR"];  
// Datum und Uhrzeit übertragen  
$timestamp = time();  
$datum = date("d.m.Y",$timestamp);  
$uhrzeit = date("H:i",$timestamp);  
// Inhalt aus den Formularen übertragen "Name"  
$name = $_POST['name'];  
// Inhalt aus den Formularen übertragen "Email"  
$email = $_POST['email'];  
// Inhalt aus den Formularen übertragen "Betreff"  
$betreff = $_POST['betreff'];  
// Inhalt aus den Formularen übertragen "Nachricht"  
$text = $_POST['text']; // Text  
$Submit = $_POST['Submit']; // Sende Button  
// Wir bauen eine Funktion die soll die Absender E-Mail überprüfen, ob die gültig ist  
// das machen wir mit eregi() wir prüfen nicht nur ob "@" und "." vorhanden ist sondern auch  
// 2 bustaben vor "@" und nach dem "@" da sind.  
function mailcheck($mail) {  
  $mail = eregi("^[a-z0-9]+([-_.]?[a-z0-9])  
+@[a-z0-9]+([-_.]?[a-z0-9])+.[a-z]{2,4}", $mail); // Hier läuft das ab  
  return $mail; // wir geben die E-Mail zurück  
}  
    // Jetzt prüfen wir ob die Felder ausgefüllt wurden mit if(empty)  
    //wenn das feld "Name" nicht ausgefüllt wurde geben wir der leeren $error Inhalt  
    // Also die Ausgabe "Sie haben keinen Namen angegeben."  
    if(empty($name)) $error .= "<li>Sie haben keinen Namen angegeben.</li>";  
    // das gleiche mit "Email"  
    if(empty($email)) $error .= "<li>Sie haben keine E-Mail angegeben.</li>";  
    // hier setzen wir unsere oben gebaute Funktion ein wenn E-Mail nicht stimmt dann fehlerausgabe  
    if(mailcheck($email)) $error .= "<li>Ihre E-Mail ist ungültig</li>";  
    // für das Feld "Betreff"  
    if(empty($betreff)) $error .= "<li>Es wurde kein Betreff ausgewählt.</li>";  
    // für Nachricht  
    if(empty($text)) $error .= "<li>Sie haben kein Text angegeben.</li>";  
    // if(empty($error)) d.h wenn $error leer ist also alles normal ausgefüllt wurde und der Button "Absenden" angeklickt wurde  
    // Dann springt das runter und wir holen uns die übertragene Daten  
        if(empty($error) && $Submit == "Absenden" ) {  
    // wir machen das ganze in eine Variable "$nachricht"  
    $nachricht = "<b>".$uhrzeit."".  
	   	 "Uhr - ".$datum."</b>\n\n".  
	         "<b>Ip:</b> ".$ip."\n".  
		 "<b>Name:</b> ".$name."\n".  
                 "<b>Email:</b> ".$email."\n".  
                 "<b>Betreff:</b> ".$betreff."\n\n".  
                 "<b>Nachricht:</b> \n".$text;  
  
	$subject = "Homepage Kontakt - $betreff";  
  
	$header    = "FROM: $email";  
	$header   .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n";  
	$header   .= "X-Mailer: PHP ". phpversion();  
	  
    // hier setzen wir unsere mail() funktion ein das muss genau so ausehen  
    // mail($anwem,$subject,$den den ganzen inhalt, unbedingt "FROM:" also von wem)  
    mail($ihremail,$subject,$nachricht,$header);  
    }  
    // hier fragen wir wieder ein Error ein:  
if(empty($error)) {  
    // wir geben dann hier ein dass alles ok ist  
    echo "<b>Nachricht wurde erfolgtreich verschickt</b><br>  
                  <ul>  
                  <li>Name: $name</li>  
                  <li>Email: $email</li>  
                  <li>Betreff: $betreff</li>  
                  <li>Nachricht: $text</li>  
                  </ul>";  
    // Wenn es nicht stimmt  
    } else {  
    echo "Folgender Fehler ist aufgetreten<br><p>Ihre Nachricht konnte nicht gesendet werden:<ul>$error</ul></p>";  
}  
?>  

Man sieht ja was nachher fett geschrieben werden soll, nur leider kommt es so bei mir nicht an.

Danke schon mal für eure Hilfe.

Mfg Dog

  1. Hallo,

    ich hab ein kleines Kontaktformular für meine Hompage

    und das scheint schon recht betagt, um nicht zu sagen "veraltet" zu sein.

    <?

    Bitte immer die ausgeschriebene Form <?php verwenden. Short Open Tags sind auf vielen Servern nicht verfügbar, und das aus gutem Grund.

    $ip = "".$HTTP_SERVER_VARS["REMOTE_ADDR"];

    Die $HTTP_*_VARS sind schon seit langem missbilligt, in manchen PHP-Installationen sind sie schon gar nicht mehr verfügbar. Verwende stattdessen die superglobalen Arrays $_GET, $_POST, $_SERVER.

    // Inhalt aus den Formularen übertragen "Name"
    $name = $_POST['name'];
    // Inhalt aus den Formularen übertragen "Email"
    $email = $_POST['email'];
    // Inhalt aus den Formularen übertragen "Betreff"
    $betreff = $_POST['betreff'];
    // Inhalt aus den Formularen übertragen "Nachricht"
    $text = $_POST['text']; // Text

    Wozu kopierst du diese Werte um, noch dazu ohne sie zu prüfen? - So wandert $betreff zum Beispiel ungeprüft in dein $subject, eine herrliche Methode für Header Injection. So kann dein Formular leicht als Spamschleuder missbraucht werden. Als allerminimalste Forderung sollte man hier sicherstellen, dass die übergebenen Werte keine Steuerzeichen (Codes <0x20) enthalten.

    // Wir bauen eine Funktion die soll die Absender E-Mail überprüfen, ob die gültig ist
    // das machen wir mit eregi() wir prüfen nicht nur ob "@" und "." vorhanden ist sondern auch
    // 2 bustaben vor "@" und nach dem "@" da sind.
    function mailcheck($mail) {

    Autschn. Eine Funktion mitten in den linearen Codeablauf zu quetschen, ist schlechter Stil, vor allem macht es den Code unübersichtlich.

    $subject = "Homepage Kontakt - $betreff";

    Das meinte ich vorher: Hier setzt du $betreff ungeprüft ein.

    $header    = "FROM: $email";

    Fehler: Der Header heißt "From", nicht "FROM", und du hast das abschließende \r\n vergessen. Folglich wird nicht nur *dieser* Header ignoriert, sondern auch der folgende ...

    $header   .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n";

    ... weil er ja mit dem vorherigen zu einer Zeile verschmilzt. Folge: Niemand weiß, dass deine Mail HTML enthalten soll.

    $header   .= "X-Mailer: PHP ". phpversion();

    Okay, kann man machen; man kann's auch weglassen.

    Man sieht ja was nachher fett geschrieben werden soll, nur leider kommt es so bei mir nicht an.

    Sondern als Plain Text, ja. Siehe oben.

    So long,
     Martin

    --
    Ja, ja ... E.T. wusste schon, warum er wieder nach Hause wollte.
    1. Also was ich jetzt gemacht habe:
      <? geändert in <?php

      $ip = "".$HTTP_SERVER_VARS["REMOTE_ADDR"];
      geändert in
      $ip = $SERVER_["REMOTE_ADDR"];

      $header    = "From: $email";
      geändert in
      $header    = "From: $email\r\n";

      gelöscht:
      $header   .= "X-Mailer: PHP ". phpversion();

      $header   .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n";
      geändert in
      $header   .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n". phpversion();

      $header    = "FROM: $email";
      geändert in
      $header    = "From: $email";

      Funktioniert so aber immer noch nicht. In der E-Mail steht dann als text noch oben drüber:

      Content-Type: text/html

      Content-Transfer-Encoding: 8bit

      Message-Id: 20090605105010.C2664C00387@viktoria.servcity.org
      Date: Fri,  5 Jun 2009 12:50:10 +0200 (CEST)

      5.2.0-8+etch13

      Dann das mit dem Betreff is nicht so schlimm, bzw das mitdem Spam das ganz ist ja auch noch nciht Fertig ;)

      1. Hallo

        $ip = "".$HTTP_SERVER_VARS["REMOTE_ADDR"];
        geändert in
        $ip = $SERVER_["REMOTE_ADDR"];

        Mache aus $SERVER_["REMOTE_ADDR"]; dieses: $_SERVER["REMOTE_ADDR"]; (Position des Unterstrichs)

        $header   .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n";
        geändert in
        $header   .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n". phpversion();

        Was hat die PHP-Versionsnummer da zu suchen?

        Funktioniert so aber immer noch nicht. In der E-Mail steht dann als text noch oben drüber:

        Content-Type: text/html

        Content-Transfer-Encoding: 8bit

        Message-Id: 20090605105010.C2664C00387@viktoria.servcity.org
        Date: Fri,  5 Jun 2009 12:50:10 +0200 (CEST)

        5.2.0-8+etch13

        Dann hast du wahrscheinlich *vor* der Zeile "Content-Type: text/html" eine doppelte Zeilenschaltung ("\r\n\r\n"). Eine solche trennt den Header vom Body einer Email. Schau da mal nach.

        Dann das mit dem Betreff is nicht so schlimm, bzw das mitdem Spam das ganz ist ja auch noch nciht Fertig ;)

        Dann mache das bitte fertig, bevor das Skript in den Produktiveinsatz geht.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        Veranstaltungsdatenbank Vdb 0.3
        1. Hallo

          »» $ip = "".$HTTP_SERVER_VARS["REMOTE_ADDR"];
          »» geändert in
          »» $ip = $SERVER_["REMOTE_ADDR"];

          Mache aus $SERVER_["REMOTE_ADDR"]; dieses: $_SERVER["REMOTE_ADDR"]; (Position des Unterstrichs)

          Hab ich gemacht Danke

          »» $header   .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n";
          »» geändert in
          »» $header   .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n". phpversion();

          Was hat die PHP-Versionsnummer da zu suchen?

          Hab ich wieder raus genommen.

          Dann hast du wahrscheinlich *vor* der Zeile "Content-Type: text/html" eine doppelte Zeilenschaltung ("\r\n\r\n"). Eine solche trennt den Header vom Body einer Email. Schau da mal nach.

          Nein, ein Post über deinem wurd mir gesagt, ich soll /r/n in /n ersetzen und das hat geholfen.

          »» Dann das mit dem Betreff is nicht so schlimm, bzw das mitdem Spam das ganz ist ja auch noch nciht Fertig ;)

          Dann mache das bitte fertig, bevor das Skript in den Produktiveinsatz geht.

          Keine sorge werd noch n Captchar einbauen.

          1. Hallo

            »» Dann hast du wahrscheinlich *vor* der Zeile "Content-Type: text/html" eine doppelte Zeilenschaltung ("\r\n\r\n"). Eine solche trennt den Header vom Body einer Email. Schau da mal nach.
            »»
            Nein, ein Post über deinem wurd mir gesagt, ich soll /r/n in /n ersetzen und das hat geholfen.

            Nur zur Erklärung: Der Standard schreibt vor, dass Headerzeilen einer Email mit dem Windowszeilenumbruch (\r\n) getrennt werden. Das trifft natürlich auch auf die zwei Zeilenschaltungen, die den header vom Body trennen, zu. Wie Martin schon schrieb, vermurksen das einige Systeme. Interessant dabei ist, dass z.B. ältere Outlook-Versionen (wie das heute aussieht, weiß ich nicht) nun gerade *nicht* mit den jetzt von dir eingesetzten Unix-Zeilenumbrüchen (\n) klarkommen (besser: klar kamen).

            »» »» Dann das mit dem Betreff is nicht so schlimm, bzw das mitdem Spam das ganz ist ja auch noch nciht Fertig ;)
            »»
            »» Dann mache das bitte fertig, bevor das Skript in den Produktiveinsatz geht.
            »»
            Keine sorge werd noch n Captchar einbauen.

            *Das* war nicht gemeint. Du sollst die Eingaben, die aus dem Formular kommen, zuallererst auf Plausibilität bzw. nicht erwünschte Zeichen(folgen) prüfen, bevor du sie zum Versand vorbereitest. Diese Aufgabe besteht natürlich in _allen_ Skripten bei _allen_ nicht von dem Skript selbst bereitgestellten Informationen (Formular, GET-Parameter einer URL), etc. pp.).

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            Veranstaltungsdatenbank Vdb 0.3
            1. Hallo

              »» »» Dann hast du wahrscheinlich *vor* der Zeile "Content-Type: text/html" eine doppelte Zeilenschaltung ("\r\n\r\n"). Eine solche trennt den Header vom Body einer Email. Schau da mal nach.
              »» »»
              »» Nein, ein Post über deinem wurd mir gesagt, ich soll /r/n in /n ersetzen und das hat geholfen.

              Nur zur Erklärung: Der Standard schreibt vor, dass Headerzeilen einer Email mit dem Windowszeilenumbruch (\r\n) getrennt werden. Das trifft natürlich auch auf die zwei Zeilenschaltungen, die den header vom Body trennen, zu. Wie Martin schon schrieb, vermurksen das einige Systeme. Interessant dabei ist, dass z.B. ältere Outlook-Versionen (wie das heute aussieht, weiß ich nicht) nun gerade *nicht* mit den jetzt von dir eingesetzten Unix-Zeilenumbrüchen (\n) klarkommen (besser: klar kamen).

              Achso ok das hab ich verstanden.

              »» »» »» Dann das mit dem Betreff is nicht so schlimm, bzw das mitdem Spam das ganz ist ja auch noch nciht Fertig ;)
              »» »»
              »» »» Dann mache das bitte fertig, bevor das Skript in den Produktiveinsatz geht.
              »» »»
              »» Keine sorge werd noch n Captchar einbauen.

              *Das* war nicht gemeint. Du sollst die Eingaben, die aus dem Formular kommen, zuallererst auf Plausibilität bzw. nicht erwünschte Zeichen(folgen) prüfen, bevor du sie zum Versand vorbereitest. Diese Aufgabe besteht natürlich in _allen_ Skripten bei _allen_ nicht von dem Skript selbst bereitgestellten Informationen (Formular, GET-Parameter einer URL), etc. pp.).

              Der Betreff ist ja jetzt keine Eingabe mehr sondern ein Menü und hab zusätzlich noch eine Prüfung eingebaut.

              1. Hallo

                »» Du sollst die Eingaben, die aus dem Formular kommen, zuallererst auf Plausibilität bzw. nicht erwünschte Zeichen(folgen) prüfen, bevor du sie zum Versand vorbereitest. Diese Aufgabe besteht natürlich in _allen_ Skripten bei _allen_ nicht von dem Skript selbst bereitgestellten Informationen (Formular, GET-Parameter einer URL), etc. pp.).

                Der Betreff ist ja jetzt keine Eingabe mehr sondern ein Menü und hab zusätzlich noch eine Prüfung eingebaut.

                Ich hoffe, du prüfst auf die erlaubten Werte.

                Als Tip:

                Erstelle ein Array mit den erlaubten Werten. Aus diesem Array speist du sowohl das Menü als auch die Prüfung nach dem Absenden.

                Vorschlag:

                // einfaches Array für die möglichen Betrefftexte  
                $werte_betreff = array(  
                "Text des Betreffs #1",  
                "Text des Betreffs #2",  
                "Text des Betreffs #3");  
                  
                // Ausgabe im Formular (hier mal Radioboxen)  
                foreach ($werte_betreff as $bw) {  
                echo '<input type="radio" name="betreff" value="'.$bw.'" /> $bw<br />';  
                // Der Text wird sowohl als Wert übergeben  
                // als auch hinter der Checkbox ausgegeben.  
                }  
                  
                // Prüfung nach der Übergabe (wir nehmen POST als Methode an)  
                if (!empty($_POST["betreff"]) and in_array($_POST["betreff"],$werte_betreff)) {  
                // Prüfung bestanden, Weiterverarbeitung  
                } else {  
                // Der Betreff wurde nicht oder falsch ausgefüllt. Standardbetreff  
                // einsetzen oder Formulareingaben zurückweisen. Formular kann  
                // dem Benutzer erneut vorgelegt werden. Stichwort: Affenformular  
                }
                

                Tschö, Auge

                --
                Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
                Terry Pratchett, "Wachen! Wachen!"
                Veranstaltungsdatenbank Vdb 0.3
                1. Der Vorschlag ist natürlcih super habs jetzt so:

                    
                  [...]  
                  // Betreffwerte in array speichern  
                  $werte_betreff = array("Fehler","Download","sonstiges");  
                  [...]  
                  // Prüfen für das Feld "Betreff"  
                  if (!empty($betreff) and in_array($betreff,$werte_betreff)) {  
                  $error .= "<li>Sie haben keinen Betreff ausgewählt.</li>";};  
                  //if(empty($betreff)) $error .= "<li>Sie haben keinen Betreff ausgewählt.</li>"  
                  
                  

                  Aber irgend wie ist das nicht ganz ok und ich wei nicht ganz was falsch ist. Das mit den // vor ist der Code der funktioniert um zu prüfen ob es leer ist und der funktioniert auch. Nur mir dem array kommt das Script nich klarr.

                  1. Hallo

                    [...]
                    // Betreffwerte in array speichern
                    $werte_betreff = array("Fehler","Download","sonstiges");
                    [...]
                    // Prüfen für das Feld "Betreff"
                    if (!empty($betreff) and in_array($betreff,$werte_betreff)) {
                    $error .= "<li>Sie haben keinen Betreff ausgewählt.</li>";};
                    //if(empty($betreff)) $error .= "<li>Sie haben keinen Betreff ausgewählt.</li>"

                    
                    > Aber irgend wie ist das nicht ganz ok und ich wei nicht ganz was falsch ist. Das mit den // vor ist der Code der funktioniert um zu prüfen ob es leer ist und der funktioniert auch. Nur mir dem array kommt das Script nich klarr.  
                      
                    Lass dir mal die übergebenen Werte mit [var_dump](http://de.php.net/var_dump) oder [print_r](http://de.php.net/print_r) ausgeben, um zu sehen, was da drin steht. Also `var_dump($_POST)`{:.language-php} oder `var_dump($_GET)`{:.language-php} bzw. `print_r($_POST)`{:.language-php} oder `print_r($_GET)`{:.language-php}.  
                      
                    Tschö, Auge  
                    
                    -- 
                    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.  
                    Terry Pratchett, "Wachen! Wachen!"  
                      
                    [Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
                    
      2. Hi,

        Also was ich jetzt gemacht habe:
        [...]

        das sind alles Änderungen, die zumindest nicht vergebens sind. ;-)

        Funktioniert so aber immer noch nicht. In der E-Mail steht dann als text noch oben drüber:

        Content-Type: text/html

        Content-Transfer-Encoding: 8bit

        Message-Id: 20090605105010.C2664C00387@viktoria.servcity.org

        Dann ändere mal alle \r\n in deinen Headerzeilen in einfache \n. Auf Unix-artigen Servern wird die zu versendende Mailnachricht meistens über ein Script oder ein lokales Programm aufbereitet, das teilweise \r\n in \n\n umwandelt. Folge: Nach der ersten Headerzeile steht eine Leerzeile, und das bedeutet: Ende der Headerzeilen, in der nächsten Zeile beginnt der Mail-Inhalt.

        Dann das mit dem Betreff is nicht so schlimm, bzw das mitdem Spam das ganz ist ja auch noch nciht Fertig ;)

        Diese Haltung ist gefährlich. Nur allzu leicht vergisst man nachher, dass man da noch ein Loch zu stopfen hat. Und dann gebe ich dir plötzlich als Betreff:
        "You can last longer!\nCC: mail1@somewhere.net, mail2@somewhere.else.net"

        Und schon sind zwei unschuldige Empfänger SPAM-Opfer geworden. Den Text kann ich ja auch mehr oder weniger frei eingeben, also ist die Werbemaschine für Schwanzverlängerungen und ähnlichen Kram schon fertig.

        So long,
         Martin

        --
        Moskito, ergo summ.
        1. Also das ändern von /r/n in /n hat geholfen.
          Jetzt funktioniert es so wie es soll.

          Danke.

          Ps:
          Keine Sorge wegen dem Betreff, der wird als Liste auswählbar sein. Desweiteren werd ich wenn alles läuft wie es soll, noch eine Captchar abfrage einbauen.