formmailer-problem
FRIIIEEK
- php
hallo!
bin PHP-Neuling erster Stunde, wenn überhaupt...
eine Webseite erfordert einen Formmailer und ich hab ein opensource beispiel über google gefunden. das wollte ich nun anpassen, aber dabei scheiterts schon... :(
die datei heisst bestellung2.php und folgendes steht drin:
header usw. hab ich mal weggelassen. die email-adresse hab ich mit xxxxxx ersetzt.
"Beim Versenden der E-Mail ist ein Fehler aufgetreten!"
kommt beim verschicken als Fehler! allerdings weiss ich nicht was den fehler auslöst! :(
Wär cool wenn sich das jmd. angucken könnte, bin echt am verzweifeln!
[CODE]
<?php
// *** Deine Mailadresse (Empfänger) ***
$mail_to="info@xxxxxxx.de";
// *************************************
$from_name=$_POST['fromname'];
$from_mail=strtolower($_POST['frommail']);
$mail_subject=$_POST['mailsubject'];
$tickets=$_POST['tickets'];
$datum=$_POST['datum'];
$wohn1=$_POST['wohn1'];
$wohn2=$_POST['wohn2'];
$tele=$_POST['tele'];
$mail_text=$_POST['mailtext'];
$send=$_POST['s'];
if(trim($from_name)=="") $err_text.="Bitte gib Deinen Namen an.<br>";
if(trim($from_mail)=="")
$err_text.="Bitte gib Deine E-Mail-Adresse an.<br>";
else
if(!ereg("[1]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,6})$",$from_mail))
$err_text.="Bitte gib eine gültige E-Mail-Adresse an.<br>";
// *** Zu langen Text abschneiden ***
if(strlen($mail_text)>1000) {
$mail_text=substr($mail_text,0,1000)."... (Text wurde gekürzt!)";
}
$from_name=str_replace(chr(34),"''",$from_name);
$from_name=stripslashes($from_name);
$from_mail=stripslashes($from_mail);
$mail_tickets=stripslashes($mail_tickets);
$mail_datum=stripslashes($mail_datum);
$mail_wohn1=stripslashes($mail_wohn1);
$mail_wohn2=stripslashes($mail_wohn2);
$mail_tele=stripslashes($mail_tele);
$mail_text=stripslashes($mail_text);
if(($send=="1") && (isset($err_text))) {
echo "<p><big><b>Fehler:</b></big><br>";
echo "$err_text</p>";
}
if(($send!="1") || (isset($err_text)))
{
?>
<form action="bestellung2.php" method="post">
<table border=0 cellspacing=2 cellpadding=0 width=100%>
<tr>
<td nowrap align=right><p>Name, Vorname *</p></td><td> </td>
<td width=100%><input type="text" name="fromname" size=25 maxlength=120 value="<?php echo $from_name; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Anzahl der Tickets *</td><td></td>
<td width=100%><input type="text" name="tickets" size=25 maxlength=120 value="<?php echo $tickets; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Veranstaltungsdatum *</td><td></td>
<td width=100%><input type="text" name="datum" size=25 maxlength=120 value="<?php echo $datum; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Straße & Hausnummer</td><td></td>
<td width=100%><input type="text" name="wohn1" size=25 maxlength=120 value="<?php echo $wohn1; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>PLZ/Wohnort</td><td></td>
<td width=100%><input type="text" name="wohn2" size=25 maxlength=120 value="<?php echo $wohn2; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Telefonnr. **</td><td></td>
<td width=100%><input type="text" name="tele" size=25 maxlength=120 value="<?php echo $tele; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Deine E-Mail Adresse *</td><td></td>
<td width=100%><input type="text" name="frommail" size=25 maxlength=120 value="<?php echo $from_mail; ?>"></td>
</tr>
<tr>
<td nowrap align=right valign=top><p>Text</td><td></td>
<td width=100%><textarea cols="25" rows="6" name="mailtext"><?php echo $mail_text; ?></textarea></td>
</tr>
<tr>
<td></td><td></td>
<td>
<input type="hidden" value="1" name="s">
<input type="submit" value="Bestellung abschicken" name="submit">
</td>
</tr>
</table>
</form>
<?php
} else {
$header="From: $from_name <$from_mail>\n";
$header.="Reply-To: $from_mail\n";
$header.="Content-Type: text/plain";
$send=0;
if(@mail($mail_to,$header))
{
echo "<p><b>Deine E-Mail wurde abgesendet.</b></p>";
echo "<p><a href="".$PHP_SELF."?from_name=$from_name&from_mail=$from_mail">Zurück zum Formular</a></p>";
}else{
echo "<p><b>Beim Versenden der E-Mail ist ein Fehler aufgetreten!</b></p>";
echo "<p><a href="".$PHP_SELF."?from_name=$from_name&from_mail=$from_mail&mail_text=";
echo urlencode($mail_text)."">Zurück zum Formular</a></p>";
}
}
?>
[/CODE]
_a-z0-9- ↩︎
echo $begrüßung;
bin PHP-Neuling erster Stunde, wenn überhaupt...
Das brauchst du nicht zu betonen, das sieht man anhand der Fragestellung auch so :-)
"Beim Versenden der E-Mail ist ein Fehler aufgetreten!"
kommt beim verschicken als Fehler! allerdings weiss ich nicht was den fehler auslöst! :(
if(@mail($mail_to,$header))
Du bekämst einen Fehler angezeigt, wenn du ihn nicht mittels @ unterdrücktest.
Und noch ein paar allgemeine Dinge:
$from_name=$_POST['fromname'];
Solche Umkopier-Aktionen sind überflüssig. $_POST['fromname'] kann wie jede andere Variable auch direkt verwendet werden.
$from_name=str_replace(chr(34),"''",$from_name);
Das ist Blödsinn. Warum soll " gegen '' ausgetauscht werden?
$from_name=stripslashes($from_name);
Das soll offensichtlich gegen die Magic Quotes helfen, die in diesem Fall wieder einmal mehr stören als Nutzen bringen. Nicht immer sind sie aktiviert. Eine bedingungsloses Entfernen ist deshalb nicht angebracht. Verwende zum Entfernen der Magic Quotes das im Kapitel Disabling Magic Quotes angegebene Beispiel 31.2 einmalig und direkt am Scriptanfang.
<td width=100%><input type="text" name="fromname" size=25 maxlength=120 value="<?php echo $from_name; ?>"></td>
Wenn du Benutzereingaben und andere aus unsicheren Quellen stammende Daten in den HTML-Code einbetten möchtest musst du die HTML-eigenen Zeichen berücksichtigen und behandeln, sonst ist das eine XSS-Lücke. PHP kennt dafür die Funktion htmlspecialchars().
Ah, hier soll also das obige Austauschen der " gegen die '' verhindern, dass man damit das mit value=" geöffnete Attribut wieder schließen kann. htmlspecialchars() kann das viel besser und ohne die " zu verfälschen.
echo "<p><a href="".$PHP_SELF."?from_name=$from_name&from_mail=$from_mail&mail_text=";
$PHP_SELF muss auch nicht unbedingt existieren. Das Feature register_globals, das dies macht ist schon seit langer Zeit statandardmäßig nicht mehr eingeschaltet. Verwende besser den entsprechenden Wert aus dem Array $_SERVER.
Ebenfalls anfällig für das missbräuchliche Ausnutzen der register_globals=On-Einstellung sind solche Konstrukte:
if(trim($from_name)=="") $err_text.="Bitte gib Deinen Namen an.<br>";
Die Variable $err_text ist vorher nicht initialisiert worden. PHP legt sie zwar nun an, wenn sie noch nicht da war. Wenn aber jemand einen Parameter namens err_text über die URL oder die Post-Daten mitsendet, wird die Variable dank register_globals angelegt und mit von dir nicht gewünschtem Inhalt vorbelegt. Variablen sollten deshalb vor dem ersten lesenden Zugriff unbedingt (= außerhalb von if) mit definiertem Wert angelegt werden, z.B. $err_text = '';
if(($send=="1") && (isset($err_text))) {
Du kannst dann natürlich nicht mehr mit isset() auf Existenz von $err_text prüfen, denn nun ist sie ja immer da. Prüfe lieber ob sie einen Inhalt länger als 0 Zeichen hat, z.B. if (strlen($err_text))
echo "$verabschiedung $name";
"Beim Versenden der E-Mail ist ein Fehler aufgetreten!"
kommt beim verschicken als Fehler! allerdings weiss ich nicht was den fehler auslöst! :(
if(@mail($mail_to,$header))Du bekämst einen Fehler angezeigt, wenn du ihn nicht mittels @ unterdrücktest.
ähm.. auch wenn ich dich eventuell falsch verstehe, aber ich BEKOMME einen fehler angezeigt. er wird also nicht unterdrückt...
oder unterdrücke ich damit quasi den SEND-Befehl?
danke schonmal vielmals für die umfangreiche Hilfe!
gruß
FRIIIEEK
echo $begrüßung;
"Beim Versenden der E-Mail ist ein Fehler aufgetreten!"
kommt beim verschicken als Fehler! allerdings weiss ich nicht was den fehler auslöst! :(
if(@mail($mail_to,$header))
Du bekämst einen Fehler angezeigt, wenn du ihn nicht mittels @ unterdrücktest.
ähm.. auch wenn ich dich eventuell falsch verstehe, aber ich BEKOMME einen fehler angezeigt. er wird also nicht unterdrückt...
Nein, du bekommst den Text angezeigt, der im else-Zweig steht. Eine PHP-Fehlermeldung bekämst du angezeigt, wenn du das @ vor dem mail() wegnimmst, denn mail() erwartet mindestens drei Parameter und nicht nur zwei.
oder unterdrücke ich damit quasi den SEND-Befehl?
Nein, das @ vor einem Befehl unterbindet die Ausgabe von PHP-Fehlermeldungen.
echo "$verabschiedung $name";
SO!
ich habs!
ich danke dir vielmals lieber dedlfix! :D du bist sooo toll ;)
endlich funktioniert alles so wie es soll!
gruß
FRIIIEEK
ich hab jetzt versucht, die änderungsvorschläge so gut es geht umzusetzen, allerdings bekomme ich jetzt ganz andere Probleme, wie z.B. dass mir gesagt wird das ich einen namen und email-adresse eingeben sollen, dabei habe ich die seite gerade erst aufgerufen!
das zweite Problem ist, dass wenn ich was abschicken will, die seite scheinbar nur "reloaded" wird. eine mail wird dabei auch nicht abgeschickt, fehler kommen auch keine.. :(
ich würde ja die Finger von dem Kram lassen, wenn ich es nicht müsste... :/
auf der angegebenen URL kann man sichs anschauen...
QUELLTEXT:
<?php
$err_text = '';
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
// *** Deine Mailadresse (Empfänger) ***
$mail_to="friiieek@web.de";
// *************************************
$from_name=$_POST['fromname'];
$from_mail=strtolower($_POST['frommail']);
$mail_subject=$_POST['mailsubject'];
$tickets=$_POST['tickets'];
$datum=$_POST['datum'];
$wohn1=$_POST['wohn1'];
$wohn2=$_POST['wohn2'];
$tele=$_POST['tele'];
$mail_text=$_POST['mailtext'];
$send=$_POST['s'];
if(trim($from_name)=="") $err_text.="Bitte gib Deinen Namen an.<br>";
if(trim($from_mail)=="")
$err_text.="Bitte gib Deine E-Mail-Adresse an.<br>";
else
if(!ereg("[1]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,6})$",$from_mail))
$err_text.="Bitte gib eine gültige E-Mail-Adresse an.<br>";
if (strlen($err_text)) {
echo "<p><big><b>Fehler:</b></big><br>";
echo "$err_text</p>";
}
if(($send!="1") || (isset($err_text)))
{
?>
<form action="bestellung2.php" method="post">
<table border=0 cellspacing=2 cellpadding=0 width=100%>
<tr>
<td nowrap align=right><p>Name, Vorname *</p></td><td> </td>
<td width=100%><input type="text" name="fromname" size=25 maxlength=120 value="<?php echo $from_name; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Anzahl der Tickets *</td><td></td>
<td width=100%><input type="text" name="tickets" size=25 maxlength=120 value="<?php echo $tickets; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Veranstaltungsdatum *</td><td></td>
<td width=100%><input type="text" name="datum" size=25 maxlength=120 value="<?php echo $datum; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Straße & Hausnummer</td><td></td>
<td width=100%><input type="text" name="wohn1" size=25 maxlength=120 value="<?php echo $wohn1; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>PLZ/Wohnort</td><td></td>
<td width=100%><input type="text" name="wohn2" size=25 maxlength=120 value="<?php echo $wohn2; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Telefonnr. **</td><td></td>
<td width=100%><input type="text" name="tele" size=25 maxlength=120 value="<?php echo $tele; ?>"></td>
</tr>
<tr>
<td nowrap align=right><p>Deine E-Mail Adresse *</td><td></td>
<td width=100%><input type="text" name="frommail" size=25 maxlength=120 value="<?php echo $from_mail; ?>"></td>
</tr>
<tr>
<td nowrap align=right valign=top><p>Text</td><td></td>
<td width=100%><textarea cols="25" rows="6" name="mailtext"><?php echo $mail_text; ?></textarea></td>
</tr>
<tr>
<td></td><td></td>
<td>
<input type="hidden" value="1" name="s">
<input type="submit" value="Bestellung abschicken" name="submit">
</td>
</tr>
</table>
</form>
<?php
} else {
$header="From: $from_name <$from_mail>\n";
$header.="Reply-To: $from_mail\n";
$header.="Content-Type: text/plain";
$send=0;
if(@mail($header,$mail_to,$tickets,$datum,$tele))
{
echo "<p><b>Deine E-Mail wurde abgesendet.</b></p>";
echo "<p><a href="__FILE__?from_name=$from_name&from_mail=$from_mail">Zurück zum Formular</a></p>";
}else{
echo "<p><b>Beim Versenden der E-Mail ist ein Fehler aufgetreten!</b></p>";
echo "<p><a href="__FILE__?from_name=$from_name&from_mail=$from_mail&mail_text=";
echo urlencode($mail_text)."">Zurück zum Formular</a></p>";
}
}
?>
_a-z0-9- ↩︎
echo $begrüßung;
ich hab jetzt versucht, die änderungsvorschläge so gut es geht umzusetzen, allerdings bekomme ich jetzt ganz andere Probleme, wie z.B. dass mir gesagt wird das ich einen namen und email-adresse eingeben sollen, dabei habe ich die seite gerade erst aufgerufen!
if (strlen($err_text)) {
echo "<p><big><b>Fehler:</b></big><br>";
echo "$err_text</p>";
}
Du hast hier beim Ändern zu viel entfernt bzw. ersetzt. Der Test auf $send ist die Entscheidung, ob das Formuler neu ist oder zur Korrektur vorgelegt wird, wobei dann Fehler angezeigt werden sollen.
if (($send=="1") && (strlen($err_text))) {
müsste die erste Zeile lauten.
das zweite Problem ist, dass wenn ich was abschicken will, die seite scheinbar nur "reloaded" wird. eine mail wird dabei auch nicht abgeschickt, fehler kommen auch keine.. :(
if(($send!="1") || (isset($err_text)))
Hier musst du auch statt isset() strlen() verwenden. (Und den Teil mit dem $send so lassen.)
<td width=100%><input type="text" name="fromname" size=25 maxlength=120 value="<?php echo $from_name; ?>"></td>
Wichtig ist, dass du in diesen Zeilen aus dem <?php echo $variable; ?> ein
<?php echo htmlspecialchars($variable); ?>
machst, damit darin enthaltene <, >, & und " HTML-gerecht kodiert werden.
if(@mail($header,$mail_to,$tickets,$datum,$tele))
So geht das mit der mail()-Funktion nicht. Der erste Parameter muss der Empfänger sein. Dann kommt das Subjekt. Der dritte Parameter ist der Text der Mail. Wenn du da noch den Inhalt von Eingabefeldern drin haben möchtest, musst du den Text damit ergänzen bevor du ihn der Funktion übergibst. Dann hast du auch noch zusätzliche Header (From, Reply-To, Content-Type) in der Variable $header stehen, die du als vierten Parameter übergeben musst. Außerdem müssten die Header-Zeilen jeweils mit \r\n und nicht nur mit \n abgeschlossen werden.
echo "<p><a href="__FILE__?from_name=$from_name&from_mail=$from_mail">Zurück zum Formular</a></p>";
Das __FILE__ ist ganz sicher keine gute Idee. Abgesehen davon, dass das eine Konstante ist, die in einem ""-String im Gegensatz zu Variablen nicht berücksichtigt wird, ist das der Name der Datei mit vollständigem Pfad im Dateisystem, der ein anderer sein wird, als der den der Apache erwartet. PHP_SELF war schon nicht verkehrt, nur muss es $_SERVER['PHP_SELF'] geschrieben werden. Außerdem müssen geschweifte Klammern drum, weil sonst dieser komplexe Ausdruck innerhalb eines ""-Strings nicht richtig als Variable erkannt wird.
echo "<p><a href="__FILE__?from_name=$from_name&from_mail=$from_mail&mail_text=";
echo urlencode($mail_text)."">Zurück zum Formular</a></p>";
Weiterhin müssen, so wie es hier mit dem mail_text gemacht wurde, alle Werte, die in einer URL übertragen werden sollen URL-gerecht kodiert werden. Ferner ist das & in HTML als & zu notieren, auch wenn es wie hier als Trenner zwischen den Parametern verwendet wird.
Und noch etwas: Du hast das Original-Script um eigene Felder ergänzt und eins mit dem Namen mailsubject entfernt. Du solltest dann auch alle Verweise im Quelltext darauf entfernen, z.B. den da:
$mail_subject=$_POST['mailsubject'];
echo "$verabschiedung $name";