Ankündigung

Einklappen
Keine Ankündigung bisher.

Php kontaktformular funktioniert nicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Php kontaktformular funktioniert nicht

    Ich habe auf meiner Website ein Php Kontaktformular erstellt, dieses geht auch. Jedoch nicht wenn ich den Cache usw. lösche, dann werde ich ohne was eingetippt zu haben zu meiner seite weiter geleitet als hätte ich was eingetippt.

    Code ist folgender (kontakt.php)

    PHP-Code:
    <?php
        
    // Ganz oben, vor irgendeiner Ausgabe: //
        
    session_start();

        
    // Bearbeiten des Formulars //
        
    if ($_POST['captcha_code'] == $_SESSION['captcha_spam']) {
            
    // Das Captcha wurde korrekt ausgefüllt //

    $mail_header 'From:' $email "n";
    $mail_header .= 'Content-type: text/plain; charset=UTF-8' "rn";
    $name1 $_POST['name1'];
    $name2 $_POST['name2'];
    $email $_POST['email'];
    $subject $_POST['subject'];
    $message $_POST['message'];
    $formcontent="von: $name1 $name2 \n Nachricht: $message";
    $recipient "meine@email.com";
    $subject "$subject";
    $mailheader "von: $email \r\n";
    mail($recipient$subject$formcontent$mailheader$mail_header ) or die("Error!");
    header('Location: mail.php');

        } else {
            
    // Captcha wurde falsch ausgefüllt, Fehler ausgeben. //
            
    echo '';
        }
    ?>
    mail.php
    PHP-Code:
    <?php
    header
    ("refresh:5;index.html");
    ?>
    Die Mail.php soll nur eine art "Danke, haben wir bekommen" ausgeben.

    Klappt auch, aber halt nicht wenn mein Cache leer ist. Wo liegt mein fehler?

  • #2
    Es fehlt der Code des Formulars, denn Caching ist Browsersache, du zeigst aber den Server-Teil, das heisst dort kommt wohl was anderes an als du erwartest.

    Du solltest auch kein Captcha verwenden, es nervt viele Benutzer und es gibt benutzerfreundlichere Möglichkeiten, sich unerwünschte Anfragen vom Hals zu halten.
    Du überprüfst auch nicht die Parameter die du empfängst, dass stellt immer ein Sicherheitsrisiko dar. Kontextwechsel wird auch nicht beachtet.

    Am besten verwendest du eine Mailerklasse wenn du E-Mails vom Server aus abgeschickst, zum Beisiel phpMailer ist eine gute Wahl.

    Kommentar


    • #3
      Die Mail.php soll nur eine art "Danke, haben wir bekommen" ausgeben.
      Wieso gibts Du das nicht nach dem mail zeug uin der kontakt.php aus?

      Kommentar


      • #4
        Zitat von protestix Beitrag anzeigen
        Es fehlt der Code des Formulars
        Daran soll es nicht scheitern.

        HTML-Code:
                        <div class="col-md-6 animate-box">
                            <form  method="post">
                                <div class="row form-group">
                                    <div class="col-md-6">
                                        <label for="fname">Vorname*</label>
                                        <input name="name1" type="text" id="fname" class="form-control" placeholder="Ihr Vorname" required>
                                    </div>
                                    <div class="col-md-6">
                                        <label for="lname">Nachname*</label>
                                        <input name="name2" type="text" id="lname" class="form-control" placeholder="Ihr Nachname" required>
                                    </div>
                                </div>
        
                                <div class="row form-group">
                                    <div class="col-md-12">
                                        <label for="email">Email*</label>
                                        <input type="text" id="email" class="form-control" placeholder="Ihre E-Mail adresse" required>
                                    </div>
                                </div>
        
                                <div class="row form-group">
                                    <div class="col-md-12">
                                        <label for="subject">Betreff</label>
                                        <input type="text" name="subject" id="subject" class="form-control" placeholder="Ihr Betreff dieser Nachricht">
                                    </div>
                                </div>
        
                                <div class="row form-group">
                                    <div class="col-md-12">
                                        <label for="message">Nachricht</label>
                                        <textarea name="message" id="message" cols="30" rows="10" class="form-control" placeholder="Ihre Nachricht an uns"></textarea>
                                    </div>
                                    <p>Mit * Markierte felder sind Pflichtfelder</p>
        
                                </div>
                                <div class="form-group">
                                    <img src="captcha.php?RELOAD=" alt="Captcha" title="Klicken, um das Captcha neu zu laden" onclick="this.src+=1;document.getElementById('captcha_code').value='';" width=140 height=40 />
                                    <p></p>
                                <input type="text" name="captcha_code" id="captcha_code" class="form-control" placeholder="Bitte Captcha ausfüllen" size=10 />
                                <p></p>
                                                    <input type="submit" value="Nachricht senden" class="btn btn-lg btn-primary">
        
                               </div>
        
                            </form>        
                        </div>
        Hoffe das hilft nun halbwegs weiter.

        Also doch kein Captcha verwenden? bin froh das es nun läuft

        Kommentar


        • #5
          • Du prüfst nicht ob das Formular abgesendet wurde.
          • Wenn die Seite geöffnet wird ist $_SESSION['captcha_spam'] leer und identisch mit $_POST['captcha_code'].
          • In der Variable $mail_header wird versucht den Absender zu fälschen. Dank SPF sollte die E-Mail nicht ankommen.
          • $_POST wird sinnlos in Variablen verteilt um diese danach wieder zu einem String zusammenzufügen.
          • Die Variablen $mail_header und $mailheader machen dir nur komplizierter.

          Kommentar


          • #6
            Zitat von tomBuilder Beitrag anzeigen
            Wieso gibts Du das nicht nach dem mail zeug uin der kontakt.php aus?
            Bin mit nicht sicher wie ich dies anstellen soll.

            Zitat von Blar Beitrag anzeigen
            • Du prüfst nicht ob das Formular abgesendet wurde.
            • Wenn die Seite geöffnet wird ist $_SESSION['captcha_spam'] leer und identisch mit $_POST['captcha_code'].
            • In der Variable $mail_header wird versucht den Absender zu fälschen. Dank SPF sollte die E-Mail nicht ankommen.
            • $_POST wird sinnlos in Variablen verteilt um diese danach wieder zu einem String zusammenzufügen.
            • Die Variablen $mail_header und $mailheader machen dir nur komplizierter.
            Könntest du mir evtl. auf einfachen weg helfen den code sauber zu gestalten?
            so wie ich das rauslese müsste ich das "$_SESSION['captcha_spam']" einfach löschen

            Kommentar


            • #7
              Folgender (ungetester) Vorschlag. Die Schritte wurde in eigene Funktionen verpackt. In der Funktion form_validate solltest du deine Felder und auch das Captcha prüfen können:

              PHP-Code:
              function buffer(callable $callback) {
                  
              ob_start();
                  
              call_user_func($callback);
                  
              $content ob_get_contents();
                  
              ob_end_clean();
                  return 
              $content;
              }

              function 
              form_process($data) {
                  if(
              $_SERVER['REQUEST_METHOD'] !== 'POST') {
                      return 
              false;
                  }
                  if(!
              form_validate($data)) {
                      return 
              false;
                  }
                  if(!
              form_send($data)) {
                      return 
              false;
                  }
                  return 
              true;
              }

              function 
              form_validate($data) {
                  if(empty(
              $data['name1'])) {
                      return 
              false;
                  }
                  if(empty(
              $data['name2'])) {
                      return 
              false;
                  }
                  if(empty(
              $data['email'])) {
                      return 
              false;
                  }
                  return 
              true;
              }

              function 
              form_send($data) {
                  
              $message buffer(function() use($data) {
                      include 
              'message.php';
                  });
                  
              mail(
                      
              'to@example.com',
                      
              $data['subject'],
                      
              $message,
                      [
                          
              'From' => 'kontaktformular@example.com',
                          
              'Reply-To' => $data['email']
                      ]
                  );
              }

              if(
              form_process($_POST)) {
                  
              header('Location: /success.php');
              }

              include 
              'form.php'
              form.php
              PHP-Code:
              <form method="post">
                  <
              input type="text" name="name1" required="required" />
                  <
              input type="text" name="name1" required="required" />
                  <
              input type="email" name="email" required="required" />
                  <
              input type="text" name="subject" required="required" />
                  <
              textarea name="message"cols="30" rows="10" required="required"></textarea>
                  <
              button type="submit" class="btn btn-lg btn-primary">Nachricht senden</button>
              </
              form
              message.php
              PHP-Code:
              Von: <?php echo $data['name1'], ' '$data['name2'], "\n"?>
              E-Mail: <?php echo $data['name1'], "\n"?>
              Nachricht: <?php echo $data['message'], "\n";  ?>
              success.php
              PHP-Code:
              <p>Kontaktformular wurde als E-Mail gesendet.</p

              Kommentar


              • #8
                Das sieht nicht verkehrt aus, leider macht er mir einen Fehler rein wenn ich meinen code implementiere...

                PHP-Code:
                    mail(
                        
                $data['subject'],
                        
                $message,
                        
                $name1 $_POST['name1'],
                        
                $name2 $_POST['name2'],
                        
                $email $_POST['email'],
                        
                $subject $_POST['subject'],
                        
                $message $_POST['message'],
                        
                $formcontent="von: $name1 $name2 \n Nachricht: $message",
                        
                $recipient "XXX",
                        
                $subject "$subject",
                        
                $mailheader "von: $email \r\n",
                        
                mail($recipient$subject$formcontent$mailheader$mail_header ) or die("Error!"),
                    );

                die
                PHP-Code:
                    ); 
                mag er irgendwie nicht

                in der Form.php kann ich ja im grunde meine inputs rein nehmen aus #4 oder nicht? wegen stylesheet usw.

                am ende wenn alles klappt sieht der User dann die success.php? diese kann auch als weiterleitung dienen wie anfänglich bei mir gemacht oder nicht?

                Kommentar


                • #9
                  Zitat von Bartho Beitrag anzeigen

                  Bin mit nicht sicher wie ich dies anstellen soll.
                  https://php-de.github.io/jumpto/affenformular/
                  Ich finde den Ansatz oben nicht so super, und nutze doch eine mailerklasse.

                  Kommentar


                  • #10
                    Habe es nun folgendermaßen gelöst

                    PHP-Code:
                    <?php

                    // ======= Konfiguration:

                    $mailTo 'meine@email.com';
                    $mailFrom $_POST['E-mail'];
                    $mailSubject $_POST['Betreff'];
                    $returnPage 'Mail-Versendet';
                    $returnErrorPage 'Mail-nicht-versendet';
                    $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($mailtext);
                    }

                    // ======= 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();

                    ?>
                    PHP-Code:
                    $returnPage 'Mail-Versendet';
                    $returnErrorPage 'Mail-nicht-versendet'
                    verweisen auf seiten die mit mod_rewrite geändert werden.

                    Danke fürs helfen an jeden hier Frohe Festtage

                    Kommentar


                    • #11
                      Zitat von Bartho Beitrag anzeigen
                      Habe es nun folgendermaßen gelöst...
                      Das ist keine (eigene) Lösung, das ist einfach nur ein Copy&Paste eines fertigen Scriptes!

                      Zitat von Bartho Beitrag anzeigen
                      PHP-Code:
                      $mailSent = @mail($mailTo$mailSubject$mailText"From: ".$mailFrom); 
                      Punkt 1: @ Unterdrückt etwaige Fehlermeldungen und sollte daher nicht genutzt werden (Vor allem nicht von Anfängern!)
                      Punkt 2: Du nutzt immer noch die mail() Funktion! Nutze lieber eine eMail Klasse wie PHPMailer oder SwiftMailer, da diese auch die RFC's umsetzen, welche du mit diesem Script in keinster Weise beachtest!

                      Letzter und wohl wichtigster Punkt:
                      Das Script ist anfällig für "E-Mail Header Injection"!

                      Mein Tipp:
                      Das Script ist totaler Schrott! Lies dir oben genannte Beiträge nochmal genau durch, nutze eine der empfohlenen Mailer-Klassen und erstelle damit ein sauberes Script!

                      Kommentar


                      • #12
                        Zitat von CPCoder Beitrag anzeigen

                        Das Script ist totaler Schrott! Lies dir oben genannte Beiträge nochmal genau durch, nutze eine der empfohlenen Mailer-Klassen und erstelle damit ein sauberes Script!

                        Hab mich etwas belesen, hier und da. Raus gekommen ist nun so was mit hilfe von google.

                        PHP-Code:
                        <?php
                            
                        if (isset($_POST["submit"])) {
                                
                        $fname $_POST['fname'];
                                
                        $lname $_POST['lname'];
                                
                        $Email $_POST['Email'];
                                
                        $Nachricht $_POST['Nachricht'];
                                
                        $human intval($_POST['human']);
                                
                        $from $_POST['Email'];
                                
                        $to 'meine@email.de';
                                
                        $subject $_POST['Betreff'];
                                
                        $returnPage 'Mail-Versendet';
                                
                        $returnErrorPage 'Mail-nicht-versendet';


                                
                        $body "Von: $fname $lname\n E-Mail: $Email\n Nachricht:\n $Nachricht";

                                
                        // Check if name has been entered
                                
                        if (!$_POST['fname']) {
                                    
                        $errName 'Please enter a valid email address';
                                }

                                if (!
                        $_POST['lname']) {
                                    
                        $errName 'Please enter a valid email address';
                                }

                                
                        // Check if email has been entered and is valid
                                
                        if (!$_POST['Email'] || !filter_var($_POST['Email'], FILTER_VALIDATE_EMAIL)) {
                                    
                        $errEmail 'Please enter a valid email address';
                                }

                                
                        //Check if message has been entered
                                
                        if (!$_POST['Nachricht']) {
                                    
                        $errMessage 'lease enter a valid email address';
                                }
                                
                        //Check if simple anti-bot test is correct
                                
                        if ($human !== 5) {
                                    
                        $errHuman 'Hier is nix';

                                }



                        // If there are no errors, send the email
                        if (!$errName && !$errEmail && !$errMessage && !$errHuman) {
                            if (
                        mail ($to$subject$body$from)) {
                                
                        $resultheader("Location: " $returnPage);

                            } else {
                                
                        $resultheader("Location: " $returnErrorPage);
                        ;
                            }
                        }
                            }
                        ?>
                        Das "captcha" geht, es kommen auch die emails an. Jedoch lande ich bei falscher eingabe nicht bei meiner ErrorPage sondern direkt auf der php seite des scriptes, wo liegt genau mein fehler?

                        HTML des ganzen

                        HTML-Code:
                                        <div class="col-md-6 animate-box">
                                            <form  method="post" action="form-mailer_2.php">
                                                <div class="row form-group">
                                                    <div class="col-md-6">
                                                        <label for="fname">Vorname*</label>
                                                        <input name="fname" type="text" id="fname" class="form-control" placeholder="Ihr Vorname" required>
                                                    </div>
                                                    <div class="col-md-6">
                                                        <label for="lname">Nachname*</label>
                                                        <input name="lname" type="text" id="lname" class="form-control" placeholder="Ihr Nachname" required>
                                                    </div>
                                                </div>
                        
                                                <div class="row form-group">
                                                    <div class="col-md-12">
                                                        <label for="Email">Email*</label>
                                                        <input type="text" id="Email" name="Email" class="form-control" placeholder="Ihre E-Mail adresse" required>
                                                    </div>
                                                </div>
                        
                                                <div class="row form-group">
                                                    <div class="col-md-12">
                                                        <label for="Betreff">Betreff</label>
                                                        <input type="text" name="Betreff" id="Betreff" class="form-control" placeholder="Ihr Betreff dieser Nachricht" required>
                        
                                                    </div>
                                                </div>
                        
                                                <div class="row form-group">
                                                    <div class="col-md-12">
                                                        <label for="Nachricht">Nachricht</label>
                                                        <textarea name="Nachricht" id="Nachricht" cols="30" rows="10" class="form-control" placeholder="Ihre Nachricht an uns"></textarea>
                                                    </div>
                                                    <div class="col-md-12">
                                                        <label for="human">2 + 3 = ?*</label>
                                                        <input type="text" name="human" id="human" class="form-control" placeholder="Die Lösung dieser aufgabe" required>
                                                        <?php echo "<p>$errHuman</p>";?>
                                                    </div>
                                                    <p>Mit * Markierte felder sind Pflichtfelder</p>
                        
                                                </div>
                                                <div class="form-group">
                                                                    <input type="submit" name="submit" id="submit" value="Nachricht Senden" class="btn btn-lg btn-primary">
                                                   </div>
                                                    <div class="form-group">
                                    <?php echo $result; ?>    
                                </div>
                                            </form>        
                                        </div>

                        Kommentar


                        • #13
                          Du missachtest noch immer den von mir genannten Punkt 2!
                          Und auch diese Version deines Scriptes ist nach wie vor anfällig für eine E-Mail Header Injection!

                          Warum zum teufel versteifst du dich auf mail()?
                          Ich habe dir schon empfohlen auf eine Mailer-Klasse wie PHPMailer oder Swift umzusteigen.

                          Kommentar


                          • #14
                            Zitat von CPCoder Beitrag anzeigen
                            Du missachtest noch immer den von mir genannten Punkt 2!
                            Und auch diese Version deines Scriptes ist nach wie vor anfällig für eine E-Mail Header Injection!

                            Warum zum teufel versteifst du dich auf mail()?
                            Ich habe dir schon empfohlen auf eine Mailer-Klasse wie PHPMailer oder Swift umzusteigen.
                            weil eine ganze Libary für den sinn&zweck dessen völlig überdimensioniert wäre.

                            Deshalb beharre ich auf die lösung, die leider nun mal nicht ganz so funktioniert und ich deshalb hier hilfe suche

                            Kommentar


                            • #15
                              Deshalb beharre ich auf die lösung, die leider nun mal nicht ganz so funktioniert und ich deshalb hier hilfe suche
                              Dann bist hier leider falsch.


                              Kommentar

                              Lädt...
                              X