Formmailerskript funktioniert nicht :(
*Pizza
- php
Moin,
ich versuche nun schon seit ca. 2 Stunden das Formmailerskript zum Laufen zu bekommen. Das Script kommt von dieser Seite und sollte eigentlich funktionieren: http://webkompetenz.wikidot.com/html-handbuch:einfacher-formmailer-php
Doch es zeigt mir nur immer die Fehlerseite an :(
Die Datei mit dem Formular sieht bei mir so aus:
<html>
<head>
</head>
<body>
<form method="post" action="send_mail.php">
<p><label>Name:<br><input type="text" name="Name"></label</p>
<p><label>E-Mail:<br><input type="text" name="Mail"></label</p>
<p><label>Betreff:<br><input type="text" name="Betreff"></label</p>
<p><label>Nachricht:<br>
<textarea name="Nachricht" cols="50" rows="8"></textarea></label</p>
<input type="submit" value="OK">
</form>
</body>
</html>
send_mail.php:
<html>
<head>
</head>
<body>
<?php
// ======= Konfiguration:
$mailTo = 'Hier steht meine Email-Adresse';
$mailFrom = '"FormMailer" <info@provider.xy>';
$mailSubject = 'Feedback';
$returnPage = 'verarbeitung.php';
$returnErrorPage = 'fehler.php';
$mailText = "";
// ======= Text der Mail aus den Formularfeldern erstellen:
// Wenn Daten mit method="post" versendet wurden:
if(isset($_POST)) {
// alle Formularfelder der Reihe nach durchgehen:
foreach($_POST as $name => $value) {
// Wenn der Feldwert aus mehreren Werten besteht:
// (z.B. <select multiple>)
if(is_array($value)) {
// "Feldname:" und Zeilenumbruch dem Mailtext hinzufügen
$mailText .= $name . ":\n";
// alle Werte des Feldes abarbeiten
foreach($valueArray as $entry) {
// Einrückungsleerzeichen, Wert und Zeilenumbruch
// dem Mailtext hinzufügen
$mailText .= " " . $value . "\n";
} // ENDE: foreach
} // ENDE: if
// Wenn der Feldwert ein einzelner Feldwert ist:
else {
// "Feldname:", Wert und Zeilenumbruch dem Mailtext hinzufügen
$mailText .= $name . ": " . $value . "\n";
} // ENDE: else
} // ENDE: foreach
} // if
// ======= Korrekturen vor dem Mailversand
// Wenn PHP "Magic Quotes" vor Apostrophzeichen einfügt:
if(get_magic_quotes_gpc()) {
// eventuell eingefügte Backslashes entfernen
$mailtext = stripslashes($strMailtext);
}
// ======= Mailversand
// Mail versenden und Versanderfolg merken
$mailSent = @mail($mailTo, $mailSubject, $mailText, "From: ".$mailFrom);
// ======= Return-Seite an den Browser senden
// Wenn der Mailversand erfolgreich war:
if($mailSent == TRUE) {
// Seite "Formular verarbeitet" senden:
header("Location: " . $returnPage);
}
// Wenn die Mail nicht versendet werden konnte:
else {
// Seite "Fehler aufgetreten" senden:
header("Location: " . $returnErrorPage);
}
// ======= Ende
exit();
?>
</body>
</html>
fehler.php:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Feedback: Danke</title>
</head>
<body>
<h1>Feedback: Fehler!</h1>
<p>Leider ist ein Fehler aufgetreten, und Ihre Formulardaten konnten
nicht an uns gesendet werden.</p>
</body>
</html>
verarbeitung.php:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Feedback: Danke</title>
</head>
<body>
<h1>Feedback: Danke!</h1>
<p>Wir haben Ihre Nachricht erhalten und werden uns bei Klärungsbedarf
an die von Ihnen angegebene Mailadresse wenden.</p>
</body>
</html>
Kann mir vielleicht jemand sagen, wo der Fehler liegt?
Mit freundlichen Grüßen,
Pizza
Moin,
texttextetxte
Hi!
ich versuche nun schon seit ca. 2 Stunden das Formmailerskript zum Laufen zu bekommen.
Wie lange du daran schon arbeitest ist nicht weiter relevant. Wichtiger ist, was du alles bereits probiert hast und nicht zum Erfolg führte. Ansonsten zählen wir das nämlich alles nochmal und unnötigerweise auf.
Das Script kommt von dieser Seite und sollte eigentlich funktionieren: http://webkompetenz.wikidot.com/html-handbuch:einfacher-formmailer-php
Das Script hat einige Fehler, wenigstens keine sicherheitsrelevanten.
Doch es zeigt mir nur immer die Fehlerseite an :(
Die Fehlerseite wird unter einer Bedingung angezeigt: Der Mailversand war nicht erfolgreich. Um Fehler beim Versand zu finden, ist es sinnvoll, den Fehlerunterdrückungsoperator @ vor dem Aufruf von mail() zu entfernen und das Anzeigen von Fehlermeldungen generell zuzulassen. Ob der Mailversand prinzipiell funktionieren kann, kommt auf das System an, auf dem der Webserver läuft. Unter Windows wird dazu beispielsweise ein Mailserver benötigt, der zumindest in der php.ini konfiguriert sein muss. Unter Linux wird (ein) sendmail(-Ersatz) verwendet, der üblicherweise mit dem System installiert wird und aus PHP-Sicht sofort funktionieren sollte.
Zur Ursachenforschung wäre also erst einmal das @ zu entfernen und das Wissen notwendig, welches Betriebssystem vorliegt. Wenn keine Meldung angezeigt wird, wären die Werte von display_errors und error_reporting in einer phpinfo()-Ausgabe zu prüfen und gegebenenfalls zu ändern.
Es folgen Anmerkungen zu den Fehlern im Script.
// Wenn Daten mit method="post" versendet wurden:
if(isset($_POST)) {
Das ist der erste Fehler. $_POST ist immer vorhanden, auch wenn das Script per GET aufgerufen wurde. Bei einem POST ist es jedoch üblicherweise nicht leer, denn man möchte ja ein paar Daten verarbeiten. if (!empty($_POST))
// ======= Korrekturen vor dem Mailversand
// Wenn PHP "Magic Quotes" vor Apostrophzeichen einfügt:
if(get_magic_quotes_gpc()) {
// eventuell eingefügte Backslashes entfernen
$mailtext = stripslashes($strMailtext);
Die Magic Quotes können prinzipiell alle Eingabefelder treffen, nicht nur den Mailtext. In der E-Mail-Adresse eher selten, aber Namen und Betreffs können welche enthalten. Zudem ist die Variable $strMailtext überhaupt nicht verwendet worden, was im Falle von eingeschalteten Magic Quotes dazu führt, dass eine neue Variable $mailtext mit einem Leerstring hinzugefügt wird. Ja, hinzugefügt, denn der eigentliche Mailtext ist in der Variable $mailText (mit einem großen T). Außerdem gäbe es eine Notice-Meldung, wenn das error_reporting auf E_ALL stände. Diese Stelle zeigt, dass der Autor die eingebauten Funktionalitäten nicht alle überprüft hat.
if($mailSent == TRUE) {
Ist es wahr, dass $mailSent wahr ist? Beim Auswerten von Ausdrücken in einem boolschen Kontext kann man ein "== true" getrost weglassen.
// ======= Ende
exit();
?>
</body>
</html>
Und warum soll das HTML-Dokument nicht ordentlich geschlossen werden? Mit der PHP-Kompetenz sieht es bei "Herrn Webkompetenz" nicht besonders gut aus.
Lo!
[latex]Mae govannen![/latex]
Die Fehlerseite wird unter einer Bedingung angezeigt: Der Mailversand war nicht erfolgreich. Um Fehler beim Versand zu finden, ist es sinnvoll, den Fehlerunterdrückungsoperator @ vor dem Aufruf von mail() zu entfernen und das Anzeigen von Fehlermeldungen generell zuzulassen. Ob der Mailversand prinzipiell funktionieren kann, kommt auf das System an, auf dem der Webserver läuft. Unter Windows wird dazu beispielsweise ein Mailserver benötigt, der zumindest in der php.ini konfiguriert sein muss. Unter Linux wird (ein) sendmail(-Ersatz) verwendet, der üblicherweise mit dem System installiert wird und aus PHP-Sicht sofort funktionieren sollte.
Diverse Hoster hätten übrigens gerne eine "Bestätigung", daß der Mailversand tatsächlich "berechtigt" durchgeführt wird, meist als envelope sender [1]. Ist dieser Parameter nicht gesetzt, scheitert der Versand, auch wenn ansonsten alles korrekt gemacht wurde. Dazu steht dann meist ein huinweis auf den Hife-Seiten sdes Providers.
Cü,
Kai
[1] in Form von -f <adresse> in $additional parameters; siehe Doku von mail()