PHP Form-Mailer

PHP Form-Mailer| Datum: 21.11.2009 - 15:11 | Author: Mgier

Hier ein kleines Tutorial für einen Form-Mailer, vollständig gibts das auf http://mgier.xe.cx/tutorials.php?id=form-mailer

Viel Spaß beim Lernen wünscht,
Mgier

Code


<?php


//Session starten (für Session-Variablen)
session_start();


//Falls kein Formular gesendet, Formular anzeigen
if(empty($_POST['send'])){


//Spam-Schutz, siehe Anmerkungen
$_SESSION['time'] = time();


echo '<div><form name="formmailer" action="' . $_SERVER['PHP_SELF'] . '" method="POST">';


echo '<p>Deine Email-Adresse:<br>';<br> echo '<input type="text" name="email"></p>';


echo '<p>Dein Name:<br>';
echo '<input type="text" name="name"></p>';


echo '<p>Betreff:<br>';
echo '<input type="text" name="subject"></p>';


echo '<p>Nachricht:<br>';
echo '<textarea style="width:250px;height:200px;" name="message"></textarea></p>';


echo '<p><input type="submit" name="send" value="Absenden"></p>';
echo '</form></div>';


} else {


//Eingaben prüfen
htmlentities($_POST['email']);
htmlentities($_POST['name']);
htmlentities($_POST['subject']);
htmlentities($_POST['message']);


//Errors - Array erstellen. In diesem werden alle Fehler gespeichert
$errors = array();


//Überprüfen, ob alles ausgefüllt ist
if(empty($_POST['email'])){
array_push($errors,'Keine Email angegeben!');
}
if(empty($_POST['name'])){
array_push($errors,'Kein Name angegeben!');
}
if(empty($_POST['subject'])){
array_push($errors,'Kein Betreff angegeben!');
}
if(empty($_POST['message'])){
array_push($errors,'Keine Nachricht angegeben!');
}
//Email Syntax überprüfen
if(!preg_match('§^[\w\.-]+@[\w\.-]+\.[\w]{2,4}$§',$_POST['email'])){
array_push($errors,'Keine gültige Email!');
}
//Spam-Bot Überprüfung
if(time() - $_SESSION['time'] < 10){
array_push($errors,'Fehler beim Ausfüllen!');
}
//Überprüfung, ob in der letzten Stunde schon eine Email geschickt wurde
if(time() - $_SESSION['saved'] < 3600){
array_push($errors,'Du musst mindestens 1h warten, bis du erneut senden kannst!');
}


//Falls Fehler auftreten, abbrechen
if(count($errors)){


foreach($errors as $error){
echo $error . '<br>';
}


//Falls alles O.K., Email abschicken
} else {


$message = 'Geschrieben von: ' . $_POST['email'] . '
Geschrieben von: ' . $_POST['name'] . '
' . $_POST['message'];
$_SESSION['saved'] = time();
mail('deine-email@dom.de',$_POST['subject'],$message,'From: Form_Mailer');
echo 'Erfolgreich gesendet!';


}
}


?>



Re: PHP Form-Mailer| Datum: 23.11.2009 - 16:11 | Author: PCFreund

hi .. naja einiges könnte man noch verbessern ;)
moment ich guck mir das mal an ..

Re: PHP Form-Mailer| Datum: 23.11.2009 - 18:11 | Author: Haruspex

Achso, man kann einiges verbessern, du hast es aber noch nicht angesehen, interessant...

Re: PHP Form-Mailer| Datum: 23.11.2009 - 18:11 | Author: PCFreund

ICH HAB ES SCHON ANGESEHEN !!!!!
also man könnte verbessern

Code


if(empty($_POST['send'])){



mit

Code



$postsended = $_POST['send'];
if(!$postsended){



naja deine lösung ist aber auch nicht schlecht ;)

ps: lokal auf meinen pc funzt es leider nicht da ich xampp habe und irgendwas mit mercury ist :(

Re: PHP Form-Mailer| Datum: 23.11.2009 - 19:11 | Author: Anonymous

PCFreund du schreibst unsinn... das was du tust ist "rumkopiererei". man kann ruhig die array $_POST etc. direkt nutzen statt alles erst in eine extra variable zu packen. d.h. das geht theoretisch auch:

Code


if(!$_POST['send']){



allerdings gibt es dort einen entscheidenen Fehler: die If-Abfrage wird auch zutreffen, wenn "send" zwar übermittelt wurde, aber ein leerer string oder eine 0 als zahl oder der boolsche wert "false" übermittelt wurde.
Um zu überprüfen ob ein bestimmtes Formular-Element (in diesem Fall 'send') übermittelt wurde, ist weder der not-operator ("!") nocht die empty() funktion geeignet.
Viel besser klappt es mit der isset() funktion welche überprüft ob der Key 'send' im array $_POST vorhanden ist:

Code


if(isset($_POST['send'])){



das stimmt dann nämlich wirklich nur dann zu, wenn der name "send" per POST übermittelt wurde, unabhängig vom Inhalt.

mfg Balmung

Re: PHP Form-Mailer| Datum: 23.11.2009 - 19:11 | Author: Fazitas

Ich hab mir das Script jetzt mal auf deiner Seite angesehen,
hier war mir das etwas zu klein (die Code-Box) :D

Also ich find das Script richtig gut.
(wobei ich wahrsceinlich das Formular aus em PHP-Block rausnemen würde, aber das ist jedem selbst überlassen)

Nur fehlt mir persöhnlich eine genauere Beschreibung,
Kommentare sind super, doch für ein Tutorial hätt ich mir ein wenig mehr gewünscht :)

Was mir sonst positiv auffällt ist
das dein Script ein wenig auf Sicherheit achtet, zumindest ein Minimum an Sicherheit ist gegeben (ausbau fähig ist sowas ja immer) :)

Kleine Änderung: statt empty() rinfach isset().
[i:pduw425x]Edit: da war wohl jemand schneller ;)[/i:pduw425x]

Im großen und ganzen gibt es von mir:
[rating=small:pduw425x]4[/rating:pduw425x] von 5 möglichen :D

Re: PHP Form-Mailer| Datum: 28.11.2009 - 20:11 | Author: Mgier

Falls die Variable 0 ist, geht etwas nicht mit rechten Dingen zu, d.h. es wurde nicht durch diese Formularmaske gesendet. Logischerweise leite ich dann zurück zum Formular.
Das mit den Erklärungen...
Ich habe im Moment nicht vor, die Webseite weiter zu entwickeln. Natürlich freue ich mich trotzdem über die positive Kritik.
Als ich dieses Tut geschrieben habe, hatte ich immer empty() benutzt, da es erstens leichter erkennbar ist als ein kleines !, und für mich als Anfänger erschien das auch immer logischer...aber jedem das Seine. Ich hatte auch irgendwo mal erklärt, dass es verschiedene Wege gibt, diesen Teil hab ich aber rausgenommen.

@PCFreund: Die (gesamte) Seite soll den einfachen, aber gezielten Einsatz von PHP zeigen. Daher ist dein Beispiel nicht geeignet.
Des weiteren steckt hinter jeder Zeile Code, der auf der Seite angezeigt wird, fast doppelt soviel Arbeit, als man sieht. Es müssen schließlich auch Zeilenumbrüche eingefügt werden. Ich arbeite von daher auch in meinem Sinn.

Mfg
Mgier

Re: PHP Form-Mailer| Datum: 11.12.2009 - 14:12 | Author: Der_Admin

Ich würde zudem ein einmal token mitsenden oder ein captcha einbauen. ;)

Re: PHP Form-Mailer| Datum: 11.12.2009 - 17:12 | Author: Mgier

Also ich wüsste nicht wieso ich ein Captcha einbauen sollte. Das ist auch nicht der Sinn der Übung.
Wäre sowieso ein extra Tutorial gekommen, aber die Seite ist inzwischen 'ne Leiche. Wenn der vorhandene Spamschutz nicht ausreicht, kann das im passenden Forum diskutiert werden ;)
Ne im Ernst. Man könnte auch noch ne Fake-Email-Eingabe versteckt einbauen. Muss doch nicht immer ein Captcha sein. Das wird nict lange dauern, bis die alle Massenweise geknackt werden, weil viele sie verwenden.

Mfg
Mgier