Vinzenz Mai: Kontaktformular PHP - eMail-Inhalt wird nicht angezeigt + Capcha

Beitrag lesen

Hallo Marc,

ein Tipp zu Beginn: versuche Deine Probleme in kleinen Schritten zu lösen.

Ich habe mal einen sauberen Schnitt gemacht und alle Deine Ratschläge nach gelesen. Habe ca. zwei Stunden damit verbracht meine "Fehler" auszubessern, bis ich mir das komplette Scrift kaputt gemacht habe.

Nun, habe ich leider gottes und irgendwie tut es mir auch sehr leid, ein Script geschnappt und es entsprechend angepasst.

das fertige Skript ist fragwürdiger als das, was Du bisher hattest.

Ich habe aber Deine Ratschläge gelesen und zum grösten Teil verstanden.

dann solltest Du erkennen, dass ich Dir einen Fehler zu Unrecht angekreidet habe, den dieses fertige Skript begeht.

Nun bin ich bei dem Thema Captcha / Spam und bekomme meinen vorhandenenes Script von "stoppt-den-spam.info" nicht zum laufen.

ok. Du bekommst wie Millionen vor Dir die berühmt-berüchtigt "headers already sent"-Meldung. Kein Problem. Darf ich Dir einen Vorschlag machen: Implementiere zuerst ein Miniformular, das ausschließlich aus dem Captcha (zu deren Fragwürdigkeit ich mich hier nicht auslassen möchte) besteht.

Die Captcha.php und das entsprechende Bild wurde angelegt und wird korrekt in meiner "Kontakt.php" dargestellt (auch erscheinen random Zahlen).

Nun steht da, man soll den folgenden code verwenden:

<?php
session_start();
  if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
  unset($_SESSION['captcha_spam']);

//Hier kommt das ursprüngliche Script hin.

}

//optional noch eine Fehlerausgabe:

else{
   die ("Der Sicherheitscode ist falsch!");
  }
?>

  
letzteres ist keine Fehlerausgabe, sondern die Aktion, mit der Du Deine wirklich interessierten Benutzer frustrierst. Ich habe schon manches Captcha erst im dritten Anlauf richtig lösen können. Fand' ich sehr nervend, ganz besonders, weil ich einen Bugreport vornehmen wollte - und davon fast Abstand genommen hätte.  
  
Blende daher im Fehlerfall das Formular erneut ein mit einem neuen Captcha und der Meldung, dass der Sicherheitscode falsch war. Lass das Skript nicht sterben, sondern liefere eine hübsches komplettes HTML-Dokument aus.  
  

> `'Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampplite\htdocs\de\Kontakt2.php:1) in C:\xampplite\htdocs\de\Kontakt2.php on line 1'`{:.language-php}  
> Und das ist mein Problem....  
>   
> Habe Testweise sogar ein Kontakt2.php angelegt wo nur folgendes drin steht.  
> ~~~php
  

> <?php session_start();  
> @include("Kontakt.php")  
> ?>

Hilft aber auch nicht, wenn ich die Kontakt2.php aufrufe, bekomm ich die selbe Fehlermeldung.

Es darf noch nicht einmal ein Leerzeichen vor <?php stehen, auch kein Zeilenumbruch und Dein Skript - im Falle von UTF-8 darf keine BOM haben. Welchen Editor benutzt Du?

<?php
$name="";
$firma="";
$adresse="";
$PLZ="";
$telefon="";
$fax="";
$Email="";
$art="";
$betreff="";
$text="";

if(isset($_POST['abschicken'])){
    while(list($feld,$wert)=each($_POST)){
        // übermittelte Inhalte "entschärfen"
        $wert=preg_replace("/(content-type:|bcc:|cc:|to:|from:)/im", "",$wert);

Das ist keine sinnvolle Entschärfung. Sieht eher nach Gießkanne aus.

$$feld=$wert;

Variable Variablen tun immer weh und sind in nahezu allen Fällen ein

ernster Programmierfehler.

if($feld!="abschicken"){
            $mailnachricht.=ucfirst($feld).": $wert\n";
        }
    }

das ist das überflüssige Umkopieren, dazu noch in variable Variablen. Nein, das ist gar nicht schön. Wie Tom Dir bereits nahegelegt hat, solltest Du überhaupt keine Schleife über alle übergebenen Parameter laufen lassen - und diese an dieser unpassenden Stelle "entschärfen".

Wann musst Du Variableninhalte (und nicht nur solche aus Benutzereingaben) speziell behandeln? Dann, wenn Du diese in einen anderen Kontext bringst? Müssen Variablen alle immer und überall auf die gleiche Art behandelt werden. Nein, natürlich nicht. Sie müssen so behandelt werden, wie es der neue Kontext erfordert. dedlfix hat diese Problematik sehr gut aufbereitet (Mail-Versand ist dort nicht das Hauptthema): Artikel Kontextwechsel.

<?php    // sind keine Fehler vorhanden, wird die Email versendet
    } else {
        $mailbetreff="Kontaktformular ".$_SERVER['HTTP_HOST'];
$headers = "From: $Email\r\nContent-Type: text/html; charset=UTF-8";

Die Variable $headers ist ein Überbleibsel aus alten Zeiten. Weg damit!

if(mail("adresse@domain.tld", $mailbetreff, $mailnachricht, "From: $Email"."\r\n".'Content-Type: text/plain; charset=UTF-8')){

[...]

[/code]

Warum willst Du die E-Mail-Adresse des Formularbenutzers unbedingt in den FROM-Header bekommen?

a) erlauben das manche Provider überhaupt nicht.
b) gibt es eh' keine vernünftige Prüfung auf eine gültige E-Mail-Adresse
c) hast Du weit weniger Probleme, wenn Du diese Adresse im Mailtext sendest.
d) musst Du die Adresse entweder quoted-printable oder base64-codiert in den
   Header-Body schreiben und das verwendete Transfer-Encoding angeben. UTF-8
   ist nicht gestattet, auch nicht nach der aktuellen RFC 5322.

Freundliche Grüße

Vinzenz