Hallo Marc,
es ist eine sehr lobenswerte Einstellung, etwas selbst machen zu wollen. Bei einem Kontaktformular, das Mails verschicken soll, ist es sehr wichtig, darauf zu achten, dass es nicht missbraucht werden kann, d.h. zu einer Spamschleuder werden kann. Dein Kontaktformular kann missbraucht werden.
Was Dir derzeit als Dein Hauptproblem erscheint, liegt daran, dass Du den Parameter der Funktion mail(), der für die Nachricht vorgesehen ist, überhaupt nicht nutzt. Übergib die Nachricht dem dritten Parameter ... und alles wird überhaupt nicht gut :-(
Dazu später mehr.
Die Mailadresse und der Betreff passt,
Nein Marc, die hier angegebene Mailadresse passt nicht! Es ist keine gute Idee, eine Mailadresse der Stiftung Warentest in einem Beispiel zu verwenden.
$Empfaenger = "test@test.de";
Verwende lieber example.org oder eine beliebige andere für diese Zwecke vorgesehene Domain, siehe RFC2606
Ich bitte euch nicht, mir den Quellcode zu schreiben, aber woran liegt es?
while(list($Formularfeld, $Wert)=each($_REQUEST)) bedeutet doch, dass er jeweils alle eingegebenen Daten sammelt und diese dann gesammelt in einer Variiablen ausgibt.
Nein, das bedeutet das nicht. Du solltest Dir eine bessere Grundlage zum Erlernen von PHP suchen, als das was Du bisher benutzt hast.
Es sieht danach aus, als sei es ursprünglich für PHP3 (fast genau zehn Jahre tot) geschrieben worden:
while(list()) ... each() ist dafür ein Anzeichen, seit PHP 4 gibt es dafür foreach.
und danach ganz leicht für PHP4 angepasst worden: immerhin wird auf $_REQUEST zugegriffen.
Zurück zum Thema: man sieht das Kopieren von Werten aus den superglobalen Arrays oft, es ist nur überflüssig, erhöht den Umfang und die Komplexität des Skriptes, verschleiert die Herkunft der Daten. Besser Du gewöhnst Dir dies so schnell wie möglich ab. Superglobale Arrays wie $_POST sind ebenfalls Variablen, Daten müssen aus diesen nicht "gesammelt" oder "abgeholt" werden. Auf diese Variablen darf man ganz normal zugreifen. Die superglobalen Variablen haben den zusätzlichen Vorteil, dass Du auch in Funktionen direkt darauf zugreifen kannst, ohne das Schlüsselwort global zu verwenden.
Nächster Kritikpunkt: Du verwendest die Methode POST, deswegen ist es eine gute Idee, die Daten genau aus $_POST auszulesen - und nicht aus $_REQUEST.
<?php
$Empfaenger = "test@test.de";
if($_REQUEST['Send'])
Wenn Du error_reporting auf E_ALL und display_errors so konfiguriert ist, dass Dir Fehler angezeigt werden, bekämst Du bei Nichtübermittlung von "Send" eine Warnung angezeigt. Sinnvoll wäre hier der Einsatz von empty:
if()
... was Dir ja nicht unbekannt ist:
{
if(empty($_REQUEST['Name']) || empty($_REQUEST['Email']) || empty($_REQUEST['Nachricht']) || empty($_REQUEST['Betreff']))
{
echo"Bitte gehen Sie <a href="javascript:history.back();">zurück</a> und füllen Sie alle Felder aus!";
}
aber Du baust Dir hier das nächste Problem ein. Statt Dich auf Javascript zu verlassen, solltest Du die Technik des Affenformulars anwenden und dem Benutzer das Formular erneut vorlegen - mit allen bisherigen Eingaben.
...
$Mailbetreff .= $_REQUEST['Betreff'];
Der Betreff kann beliebige Zeichen enthalten, Du musst den Betreff daher codieren, zum Beispiel mit quoted-printable.
$Trenner = md5(uniqid(time()));
$Header = "From: ".$_REQUEST['Email'];
$Header .= "\n";
$Header .= "MIME-Version: 1.0";
$Header .= "\n";
$Header .= "Content-Type: multipart/mixed; boundary=$Trenner";
$Header .= "\n\n";
$Header .= "This is a multi-part message in MIME format";
$Header .= "\n";
$Header .= "--$Trenner";
$Header .= "\n";
$Header .= "Content-Type: text/plain";
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: 8bit";
$Header .= "\n";
$Header .= "\nDatum/Zeit: ";
$Header .= date("d.m.Y H:i:s");
$Header .= "\n";
$Header .= "Sie haben folgende Nachricht erhalten: \n";
while(list($Formularfeld, $Wert)=each($_REQUEST))
{
if($Formularfeld != "Send" && $Formularfeld != "Nachricht")
{
$Header .= $Formularfeld.": ".$Wert."\n";
}
}
[...]
mail($Empfaenger, $Mailbetreff,"", $Header);
Du versendest einen leeren Inhalt, denn der dritte Parameter ist die Nachricht. Du solltest Deine Nachricht, inklusive Attachments im dritten Parameter übermitteln. Durch das Nutzen der zusätzlichen Header (vierter Parameter) wirst Du anfällig für Header-Injection. Du übernimmst ungeprüft den vom Benutzer gesetzten Wert in den from-Header. Dadurch kann man Dir beliebige Daten in den cc-Header und den bcc-Header schreiben und im Prinzip beliebigen Text von einem beliebigen Absender (sofern dies der Betreiber Deines Mailservers überhaupt zulässt) an beliebige (und beliebig viele) Empfänger senden. Das willst Du ganz bestimmt nicht. Ganz besonders deswegen nicht, weil man noch beliebige Dateien, gern auch mit Malware verseucht, mitverschicken darf ...
Achso: obwohl einige Anregungen von fastix eingebaut wurden, ist auch der SELFHTML-Formmailer angejahrt. Er stammt - und das sieht man ihm mit etwas Erfahrung an - aus dem Anfang dieses Jahrtausends. Statt
<?php echo $_SERVER['PHP_SELF']; ?>
ist keine gute Idee, siehe Archiv, weil Du damit eine XSS-Lücke einbaust.
Freundliche Grüße
Vinzenz