69823
Goto Top

PHP E-Mail Formular

https://www.administrator.de/index.php?content=3742c09bfa4f07d6547676ea9 ...

Im obigen Link wird ein Formular vorgestellt, das im 2. Teil auch eine Überprüfung der Einträge im Formularfeld vornimmt. Dieser Vorschlag wird als gelöst gekennzeichnet.
Wir haben nun festgestellt dass mit der Anweisung wie dort gezeigt keine Überprüfung der Eingabe im Formularfeld stattfindet. Das Script ist so übernommen worden wie vorgestellt.
Nur die Eingabefelder wurden entsprechend angepasst.Weiss jemand die Ursache?

Siehe hier:

<?php 
//email script zur Uebermittlung von Formulardaten  

$empfaenger = "absender@provider.de"; //hier kommt die email adresse hin, an die die mail geschickt wird   
//bestimmen der eingabefelder 

$field1 = $_POST['vorname'];   
$field2 = $_POST['nachname'];  
$field3 = $_POST['strasse'];  
$field4 = $_POST['ort'];  
$field5 = $_POST['telefon'];  
$field6 = $_POST['email'];  
$field7 = $_POST['bestellung'];  

//aussehen der email die der E-Mail Empfaenger bekommt 

$send = '   

        Vorname des Absenders: '.$_POST['vorname'].'   
        Nachname des Absenders: '.$_POST['nachname'].'   
        Strasse und Hausnummer: '.$_POST['strasse'].'   
        PLZ und Wohnort: '.$_POST['ort'].'   
        Telefonnummer: '.$_POST['telefon'].'   
        Die E-Mail Adresse: '.$_POST['email'].'   
        Folgende Artikel werden bestellt: '.$_POST['bestellung'].'   
        ';   
        
//hier die Überprüfung ob der Vorname eingetragen ist

if(!empty($_POST['vorname'])) {    

$check_one = true;  

} else {  

$check_one = false;  

}  

//hier die Überprüfung ob der Nachname eingetragen ist

if(!empty($_POST['nachname'])) {    

$check_one = true;  

} else {  

$check_one = false;  

}  

//hier die Überprüfung ob die Strasse eingetragen ist

if(!empty($_POST['strasse'])) {    

$check_one = true;  

} else {  

$check_one = false;  

}  

//hier die Überprüfung ob der Ort eingetragen ist

if(!empty($_POST['ort'])) {    

$check_one = true;  

} else {  

$check_one = false;  

}  

//hier die Überprüfung der E-Mail Adresse

if(!empty($_POST['email'])) {    

$check_two = true;  

} else {  

$check_two = false;  

}  

$email = preg_replace("#[\;\#\n\r\*\'\"<>&\%\!\(\)\{\}\[\]\?\\/\s]#","",$_POST['email']);   

if(!preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,4})(\]?)$/",$email)<1) {    

$check_two_alpha = true;  

} else {  

$check_two_alpha = false;  

}  

//hier die Überprüfung ob der Bestelltext eingetragen wurde

if(!empty($_POST['bestellung'])) {    

$check_three = true;  

} else {  

$check_three = false;  

}  
//hier die Sendefunktion der E-Mail

if  (mail($empfaenger, 'Neue Bestellung', $send, $from))   
    { 
    echo "Ihre E-Mail wurde erfolgreich an den Empf&auml;nger weitergeleitet.";   
        } 
        else 
        { 
       echo "Bitte &uuml;berpr&uuml;fen Sie Ihre Eingabedaten, ob alle Felder richtig ausgefüllt sind.";   
} 
/* überprüfung ob der verschicken button gedrückt wurde */  

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

$check_zero = true;  

} else {  

$check_zero = false;  

}  

?>

Content-Key: 97205

Url: https://administrator.de/contentid/97205

Printed on: April 16, 2024 at 11:04 o'clock

Member: Mitchell
Mitchell Sep 17, 2008 at 19:33:43 (UTC)
Goto Top
Hi Kieler,

ehrlich gesagt blicke ich da auch nicht ganz durch. Ich sehe auch nicht wirklich, dass er was überprüft.

$check_two = true;

hier frag ich mich a) wo ist die Variable definiert und b) was wird gemacht, wenn die Bedingung nicht wahr ist. Ich sehe nur, dass nach dem else einfach aufgehört wird, dann kommt schon die nächste Abfrage.

Daher würde ich die entsprechenden Snipsets austauschen, evtl. sagt ja noch der ein oder andere was dazu, der nicht so blind ist, wie ich face-smile Bsp.:

if ($_post|| $_email == "")  
{
echo "Sie haben nicht alle Felder ausgefüllt";  
}
{
else
echo "Danke für Ihren Eintrag";  
}

Mfg

Mitchell
Mitglied: 16568
16568 Sep 18, 2008 at 06:56:42 (UTC)
Goto Top
Uiiii Mitchell,

perfekt, machen wir es doch zur Trainings-Aufgabe (wink mit dem Zaunpfahl), dieses Problemchen zu lösen...
(und der Regex für die Email-Adresse sieht auch grausig aus!)


Lonesome Walker
Mitglied: 69823
69823 Sep 18, 2008 at 08:10:28 (UTC)
Goto Top
Das ist eine gute Idee. In diesem Zusammenhang fiel mir auch auf, dass nirgendwo die eventuelle Eingabe von Leerzeichen als Text unterbunden wird. (trim)
Macht das nur im Textfeld Sinn?

Bin gespannt ob dieses Beispiel so hier steht, dass es auch gebraucht werden kann.
Ich habe das Script übrigens nun ordentlich eingestellt.

Kieler
Mitglied: 69823
69823 Sep 18, 2008 at 19:14:41 (UTC)
Goto Top
Ich habe nun das Formular noch einmal überarbeitet. Bei mir funktioniert das Ganze nun, aber leider nicht überall.
Eventuell hat ja einer der Fachleute mal Zeit da drauf zu schauen und zu entdecken wo es klemmt.

Vielen Dank.

<?php 
//email script zur &Uuml;bermittlung von Formulardaten 

$empfaenger = "Emailname@provider.de"; //hier kommt die email adresse hin, an die die mail geschickt wird   
//bestimmen der eingabefelder 

$field1 = $_POST["vorname"];   
$field2 = $_POST["nachname"];  
$field3 = $_POST["strasse"];  
$field4 = $_POST["ort"];  
$field5 = $_POST["telefon"];  
$field6 = $_POST["email"];  
$field7 = $_POST["bestellung"];  

if (empty($field1))
{ echo "Sie haben Ihren Vornamen nicht eingegeben.<br>";  
echo "Klicken Sie <a href=\"javascript:history.back()\">hier</a>, um zum Formular zurückzukehren und den Fehler zu beheben.<br>"; }  
if (empty($field2))
{ echo "Sie haben Ihren Nachnamen nicht eingegeben.<br>";  
echo "Klicken Sie <a href=\"javascript:history.back()\">hier</a>, um zum Formular zurückzukehren und den Fehler zu beheben.<br>"; }  
if (empty($field3))
{ echo "Sie haben Ihre Strasse nicht eingegeben.<br>";  
echo "Klicken Sie <a href=\"javascript:history.back()\">hier</a>, um zum Formular zurückzukehren und den Fehler zu beheben.<br>"; }  
if (empty($field4))
{ echo "Sie haben Ihre PLZ oder den Ort nicht eingegeben.<br>";  
echo "Klicken Sie <a href=\"javascript:history.back()\">hier</a>, um zum Formular zurückzukehren und den Fehler zu beheben.<br>"; }  
else
if (empty($field6))
{ echo "Sie haben Ihre Email-Adresse nicht eingegeben.<br>";  
echo "Klicken Sie <a href=\"javascript:history.back()\">hier</a>, um zum Formular zurückzukehren und den Fehler zu beheben.<br>"; }  
else
if (empty($field7))
{ echo "Sie haben keine Nachricht eingegeben.<br>";  
echo "Klicken Sie <a href=\"javascript:history.back()\">hier</a>, um zum Formular zurückzukehren und den Fehler zu beheben.<br>"; }  
else
if(!ereg(".+@.+\..+", $field6)&& !empty($field6)) {  
echo "Die Email-Adresse ist falsch.<br>";  
echo "Klicken Sie <a href=\"javascript:history.back()\">hier</a>, um zum Formular zurückzukehren und den Fehler zu beheben."; }  

//aussehen der email die der E-Mail Empf&auml;nger bekommt 

$send = '   

        Vorname des Absenders: '.$_POST["vorname"].'   
        Nachname des Absenders: '.$_POST["nachname"].'   
        Strasse und Hausnummer: '.$_POST["strasse"].'   
        PLZ und Wohnort: '.$_POST["ort"].'   
        Telefonnummer: '.$_POST["telefon"].'   
        Die E-Mail Adresse: '.$_POST["email"].'   
        Folgende Artikel werden bestellt: '.$_POST["bestellung"].'   
        ';   
//hier die Sendefunktion der E-Mail

if  (mail($empfaenger, 'Neue Bestellung', $send, $from))   
    { 
    
        header("Location: http://www.internet.de");  
        exit;
        }
        
?> 
Mitglied: 69823
69823 Sep 19, 2008 at 08:35:29 (UTC)
Goto Top
Guten Morgen,

Was muss man tun um eine Antwort zu bekommen?
Ich habe alles was notwendig ist hier eingestellt.
Die Weiterschaltung funktioniert nur bei mir auf dem Server.
Auf einer Confix Plattform funktioniert das nicht.
Nun habe ich die Weiterleitung rausgenommen, und ein Echo eingegeben. Es kommt nun der Hinweis dass die E-Mail weitergeleitet wurde.
Dieser Satz kommt aber nun immer, egal ob im Formulareintrag Fehler sind oder nicht.
Ich denke es ist ein Fehler so wie es da steht, weil
der Satz das die Mail erfolgreich verschickt wurde erst kommen darf wenn alle if Bedingungen erfüllt sind. Also alle Formularfelder ausgefüllt!
Wer hat nun bitte das Know How?

Gruß
Kieler
Mitglied: 16568
16568 Sep 19, 2008 at 09:21:01 (UTC)
Goto Top
Hey, das hier ist ein Support-Forum, d.h. HILFE FREIWILLIG.

Suchst Du professionellen Support, besser einen Freelancer buchen, der das gegen Geld macht.


Lonesome Walker
Mitglied: 69823
69823 Sep 19, 2008 at 09:40:55 (UTC)
Goto Top
Das ist ein netter Hinweis.
Ich möchte daran erinnern dass der Ursprung meiner Frage in einem hier als "gelöst" markierten Beitrag liegt.
Eventuell macht es dann Sinn den oben gekennzeichneten Beitrag herauszunehmen, oder ihn zumindest nicht als gelöst zu kennzeichnen.
Damit erspart man sich dann Arbeit.

Wer im Netz solch ein Formular sucht findet das Beispiel und muss dann feststellen dass er SUPPORT braucht.
Aber dann ist er hier ja richtig. Nichts für ungut!

Freundlicher Gruß
Kieler
Member: Mitchell
Mitchell Sep 19, 2008 at 10:14:41 (UTC)
Goto Top
Was muss man tun um eine Antwort zu bekommen?

diese Frage nicht stellen, dir wird hier kostenlos und gerne geholfen, aber nicht auf Hetze.

Ich sehe in deiner Sendefunktion keine Funktion zum Senden face-smile, wo ist die denn?

mail($empfaenger, "Neue Bestellung", $send, "From: $from ");  

die Variable $from würde ich aber noch definieren.

Wer hat nun bitte das Know How?

Haben viele hier, aber momentan versuche ich es mal *gg*

Mfg

Mitchell

PS: LSW, dein Zaunpfahl steckt mir mittlerweile schon im Auge ^^
Mitglied: 69823
69823 Sep 19, 2008 at 11:10:16 (UTC)
Goto Top
Moin Mitchell,

Die Sendefunktion ist definiert. Die Variable
$empfaenger ist am Anfang mit der Empfänger E-Mail Adresse gekennzeichnet in Zeile 4.
"Neue Bestellung" kennzeichnet den Betreff in der Mail. Und die Variable $send beschreibt das Aussehen der Mail beim Empfänger. Es ist von Zeile 42-50 festgelegt.
Die Variable $from lief bis jetzt über ein CGI Programm und ich habe es nun wie folgt festgelegt:

"From: $sender <$sendermail>"  

hier die ganze Zeile:

if  (mail($empfaenger, 'Neue Bestellung', $send, "From: $sender <$sendermail>");  

Bis jetzt schickt das Formular auch eine leere E-Mail. Es sind im Formular keine Daten eingegeben, und das wird dann sofort in den if Festlegungen deutlich gemacht. Da dazu der Senden Button gedrückt wurde ging die Mail raus.

Gruß
Kieler

Nachtrag: Es muss keine Variable für $from definiert werden. Ich habe das Script wieder auf die alte Version reduziert und das if vor Mail rausgenommen. Und jetzt funktioniert das so wie ich wollte.

Gruß
Kieler

PS: Danke für die Anregungen
Member: Mitchell
Mitchell Sep 19, 2008 at 14:10:57 (UTC)
Goto Top
Hi,

ich habe die Zeilen schon gesehen, nur entging mir die mail-funktion visuell.

Mfg

Mitchell
Member: Arano
Arano Sep 21, 2008 at 01:25:28 (UTC)
Goto Top
Moin moin.

Natürlich wird die Email bzw. der Hinweis des verschickens __immer__ verschickt/ausgegeben.
Schauen wir uns das doch einmal an (verkürzte Version):
<?php
if( /*check der daten1*/ ){
      echo 'daten1 falsch / ungueltig';  
} elseif( /*check der daten2*/){
      echo 'daten2 falsch / ungueltig';  
}

$send = 'Der Inhalt der Email';  

if( mail($empfaenger, 'Neue Bestellung', $send, $from) ){  
      header("Location: http://www.internet.de");   
      exit; 
}
?>
So ist das Script quasi in drei Teile unterteilt:
  • Die Überprüfung der Eingabedaten
  • Das zusammensetzen des Emailinhalt und
  • Das Senden der Email
Diese drei Abschnitte sind absolute __unabhängig von einander__ und werden immer ausgeführt.
Als Beispiel: Vor dem versenden der Email wird nicht einmal geprüft ob die Eingabedaten wirklich korrekt sind und die Email versandt werden darf !

Bei mir sieht das seit einiger Zeit ungefähr so aus:
<?php
  // !! DAS FOLGENDE SCRIPT IST UNGETESTET !!
  // !! DAS FOLGENDE SCRIPT IST UNGETESTET !!
  
  $form_error        = FALSE;
  $form_error_fields = array();
  
  if(isset($_POST['send_form'])){  
  
      // kurze grundpruefung:
      $vname = isset($_POST['vname']) && trim($_POST['vname'])!='' ? if_magic_quotes($_POST['vname']) : NULL;  
      $nname = isset($_POST['nname']) && trim($_POST['nname'])!='' ? if_magic_quotes($_POST['nname']) : NULL;  
      $email = isset($_POST['email']) && trim($_POST['email'])!='' ? if_magic_quotes($_POST['email']) : NULL;  
      $homep = isset($_POST['homep']) && trim($_POST['homep'])!='' ? if_magic_quotes($_POST['homep']) : NULL;  
      $text  = isset($_POST['text'])  && trim($_POST['text'])!=''  ? if_magic_quotes($_POST['text'])  : NULL;  
      
      // erweiterte pruefung:
      if(is_null($vname)  || !preg_match('/^([a-zäöüß\-. ]{3,20})$/i',$vname)                                                          ) $form_error_fields='Vorname';  
      if(is_null($nname)  || !preg_match('/^([a-zäöüß\-. ]{3,20})$/i',$nname)                                                          ) $form_error_fields='Nachname';  
      if(!is_null($email) && !preg_match('/^[a-z0-9]+?[a-z0-9\-_.]+[a-z0-9]+@[a-z0-9]+?[a-z0-9\-_.]+[a-z0-9]+?\.[a-z]{2,5}$/i',$email) ) $form_error_fields='Email';  
      if(!is_null($homep) && !preg_match('/^(http:\/\/|www.|http:\/\/www.)?[a-z0-9\-_.]+\.[a-z]{2,5}([a-z0-9\-_.:\/?&;=%]*)$/i',$homep)) $form_error_fields='Homepage';  
      if(is_null($text)   || strlen($text)<20                                                                                          ) $form_error_fields='Text';  
      
      // wenn es keinen eingabefehler gab:
      if(empty($form_error_fields)){
            $form_error = FALSE; // eigentlich unnoetig weil default.
            $to         = 'meineMail@example.com';  
            $subject    = 'Neue Email von wo auch immer';  
            $body       = "Neu Email von wo auch immer\n\n";  
            $body      .= "Name     : $vname $nname\n";  
            $body      .= "Email    : $email\n";  
            $body      .= "Homepage : $homep\n";  
            $body      .= "Nachricht: $text\n\n";  
            $header     = "From: $vname $nname <$email>\n";  
            $header    .= "X-Mailer: PHP/".phpversion()."\n";  
            $header    .= "X-Sender-IP: ".$_SERVER['REMOTE_ADDR']."\n";  
            $header    .= "MIME-Version: 1.0\n";  
            $header    .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";  
            $header    .= "Content-Transfer-Encoding: 8bit\n";  
            // wenn die mail versandt wurde:
            if(@mail($to,$subject,$body,$header)){
                  echo 'Ihre Nachricht wurde erfolgreich versandt.';  
                  // oder
                  header('Location: http://www.example.com');  
            // bei einem mail fehler:
            } else {
                  echo 'Ihre Nachricht konnte leider nicht versandt werden,<br>bitte versuchen Sie es sp&auml;ter erneut.';  
            }
      // bei einem eingabefehler:
      } else {
            $form_error = TRUE;
            echo 'Die Eingaben der Felder: "'.implode('", "', $form_error_fields).'" wurden nicht akzeptiert !<br>';  
      }
  }
     
  
  echo '<form action="" method="POST">  
          <label for="vn">Vorname</label>  
          <input type="text" name="vname" id="vn" value="'.($form_error ? $vname : 'Max').'"><br>  
          <label for="nn">Bachname</label>  
          <input type="text" name="nname" id="nn" value="'.($form_error ? $nname : 'Musterman').'"><br>  
          <label for="em">Email</label>  
          <input type="text" name="email" id="em" value="'.($form_error ? $email : 'email@adresse').'"><br>  
          <label for="hp">Homepage</label>  
          <input type="text" name="homep" id="hp" value="'.($form_error ? $homep : 'www.example.com').'"><br>  
          <textarea name="text">'.($form_error ? $text : 'Ihre Nachricht an uns...').'</textarea><br>  
          <input type="submit" name="send_form" value="Speichern">  
        </form>';  
  
  
  
  
  function if_magic_quotes($string){
      /* funktion zur maskierung von sonderzeichen und
         umwandlung dieser in htmlentities
         - krige sie gerade nicht ausm kopf zusammen, -
         - darum einfach nur so                       -
      */
      return addslashes(htmlentities($string));
  }
  
?>
Was haben wir nun hier !?
Diese Datei ist eigentlich in zwei Abschnitte unterteilt:
  • Die Prüfung und der Email versandt
  • Die Ausgabe des Eingabeformulares
  • (ganz unten ist noch eine eigene Funktion der vollständigkeit halber )

Fangen wir beim Formular an, ein paar Eingabefelder und etwas PHP, diese dient zur Wiederanzeige der Eingaben bei einem Fehler damit der Benutzer nicht wieder komplett von vorne beginnen muss.
Wenn es einen Fehle bei den Eingaben gab [$form_error==TRUE] wird die Eingabe, andernfalls der Standardwert als Feldinhalt angezeigt.

Im darüber liegendem PHP wird zuerst geprüft ob das Formular überhaupt abgeschickt wurde [isset($_POST['send_form'])==TRUE].
Danach werden die Eingaben, sofern welche gemacht wurden, in Variablen gespeichert - oder NULL bei keiner Eingabe.
Folgend werden die gesetzten Variablen geprüft (die eigentliche Eingabenprüfung). Hier müssen wird zwischen pflicht und optionalen Eingaben unterscheiden (3. und 4. sind optional).
  • (pflicht) Wenn das Feld/Variable NULL enthält __oder__ nicht auf den regulären Ausdruck passt, speicher den Namen/Beschreibung in das $form_error_fields-Array.
  • (optional) Wenn das Feld/Variable __nicht__ NULL ist __UND__ nicht auf den RegEx passt, speicher den Namen/Beschreibung in das $form_error_fields-Array.
Wenn das Array $form_error_fields nun leer ist wurden die Felder korrekt ausgefüllt und die Email kann verschickt werden.
Wenn sich jedoch ein oder mehrere Elemente in dem Array befinden bedeutet dies, das eine Eingabe nicht unseren Vorgaben entspricht und die Email nicht versandt werden soll.
Anstelle dessen geben wir die Elemente aus dem Array aus um den Benutzer auf seine "unerwünschten" Eingaben aufmerksam zu machen. Hier kommt auch der PHP-Code innerhalb des Formulars zum Einsatz, das die gemachten Eingaben wieder anzeigt um dem Benutzer unnötiges wiederholen zu ersparen - was eine schnell Korrektur der Eingaben erlaubt.

Sooo, das war jetzt alles.
Schönen Gruß
~Arano

(Wenn ich das mal so anmerken darf, das "Tutorial" das du verwendet/angegeben hast ist ja mal überhaupt nicht zu gebrauchen oO)

__Edit:__
Vielleicht könnte mal eine(r) der Moderator(en|innen) einen Link von dem "Tutorial"-Thread zu diesem hier setzten um andere Leser gleich darauf aufmerksam zu machen !?

__Edit2:__
Mir ist gerade mal aufgefallen, das die Anzeige des Quelltextes in dem separatem Popup nicht richtig funktioniert !
Ich habe in meinem Quelltext ja unter anderem "</textarea>" stehen, dieses schließt allerdings die Textarea in der mit mein Quelltext angezeigt wird so das alles folgende __abgeschnitten__ wird !
Test:
 bla bla bla </textarea><script style="text/javascript">  
  <!--
    alert("XSS-Attack");  
  -->
</script>