Ankündigung

Einklappen
Keine Ankündigung bisher.

Email wird mehrmals abgeschickt

Einklappen

Neue Werbung 2019

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

  • Email wird mehrmals abgeschickt

    Hallo,
    ich habe mir ein php Formularscript zusammengestellt, und es funktioniert auch gut, aber ich hätte da noch 2 kleine Fragen.

    Wie ich in diesem Thread gelesen habe, kann man den reload per header unterbinden. klick

    Leider habe ich es bei meinem Script nicht ganz hinbekommen und man kann es trotzdem mehrmals senden.

    Die 2te Frage ist, wie kann ich die Zeit überprüfen, wie lange man für das ausfüllen gebraucht hat, um Spambots herrauszufiltern?

    Ich bedanke mich für eure Hilfe schonmal im Vorraus.

    Hier mein Code:
    PHP-Code:
    if (isset($_POST["sendung"])) {
     if (
    strlen($nachname) <= 2) {$eingabefehler .= "# Der Nachname fehlt!<br>";}
     if (
    strlen($telefonnummer) >= ) {$eingabefehler .= "# Geben Sie bitte hier <b>nichts</b> ein!<br>";}
     if (!
    preg_match("|^[_a-za-z0-9-]+(.[_a-za-z0-9-]+)*@([a-z0-9-]{3,})+.([a-za-z]{2,4})$|i"$mailfrom)) {$eingabefehler .= "# Fehler in der E-Mail-Adresse!<br>";}
     if (
    strlen($betreff) <= 4) {$eingabefehler .= "# Der Betreff " . ((strlen($betreff) == 0) ? " fehlt" " ist zu kurz") . " (min. 5 Zeichen)!<br>";}
     if (
    strlen($textfeld) <= 19) {$eingabefehler .= "# Die Nachricht " . ((strlen($textfeld) == 0) ? " fehlt" " ist zu kurz") . " (min. 20 Zeichen)!<br>";}
     if (
    $eingabefehler == "") {
      
    $text "Nachricht vom: " date("d.m.y H:i") . "\r\nAnrede: $anrede \r\nVorname: $vorname \r\nNachname: $nachname \r\nE-Mail: $mailfrom \r\nBetreff: $betreff \r\n\r\nNachricht: $textfeld \r\n\r\n";
      @
    mail($mailto$betreff$text"From: " $mailfrom);
      echo 
    "Die Daten wurden gesendet.<br>";
      if (isset(
    $_POST["kopie"])) {
       
    $kopie "\r\nKopie Ihrer Nachricht auf $url.\r\nWir haben folgende Nachricht erhalten:\r\n\r\n=== Beginn Nachricht ===\r\n\r\n$text \r\n=== Ende Nachricht ===";
       @
    mail($mailfrom"Kopie einer Anfrage"$kopie"From: " $mailto);
       echo 
    "Sie erhalten eine Kopie Ihrer Anfrage an Ihr Postfach.<br>";
      }
      echo 
    "Vielen Dank - <a href=\"$url\">Weiter zur Startseite</a></p>";
     }
     else {
      echo 
    str_replace("<!-- Fehleranzeige -->""<strong>Bitte korrigieren:</strong><br>$eingabefehler"$formular);
     }
    }
    else {
     echo 
    $formular;

    Mit freundlichen Grüßen
    Jan

  • #2
    Hallo,

    ich würde an deiner Stelle wenn die E-Mail erfolgreich versendet wurde, einfach umleiten.
    PHP-Code:
    header("Location: email_erfolgreich_versandt.php"); 
    Und die Zeit, die der User zum ausfüllen des Formulars gebraucht hat, kann man auch leicht berechnen. Man könnte beim Ausgeben des Formulars die aktuelle Zeit in eine Session speichern und beim überprüfen des Formulars diese Zeit überprüfen, wobei es wesentlich schönere Möglichkeiten gibt, um Spambots zu verhindern.

    mfg Tobby

    Kommentar


    • #3
      Erst einmal Danke für die schnelle Antwort.

      Das mit dem Header weiß ich, aber ich weiß nicht wo und wie ich das einfügen soll. Ich habe eigtl. alles ausprobiert, aber nichts hat funktioniert.

      2. Wie soll ich denn die Zeit messen, oder welche Methoden sind denn effektiver?

      Gruß
      Jan

      Kommentar


      • #4
        Da wo normal die Ausgabe bei Erfolg stattfindet fügst du den Header ein.

        Das Zeit messen ist eigentlich ganz simple:
        - du speicherst die aktuelle [MAN]time()[/MAN] zb. in ein [MAN]Session[/MAN] Cookie ab datenbank würde zb. auch gehen
        - diese Zeit ließt du dann aus wenn gesendet wurde
        - wenn die aktuelle [MAN]time()[/MAN] [minus] gespeicherte Zeit kleiner als zb 10 sekunden (oder was auch immer) ist dann gibst du einen Fehler aus.

        Wie sinnvoll das ist, ist eine andere Frage und es gibt sicher bessere Möglichkeiten zur Spam Vermeidung.

        lg

        Kommentar


        • #5
          Mit time() werde ich es mal ausprobieren. Welche Methoden wären denn sinnvoller?

          Dann müsste ich es ja hier einfügen:
          PHP-Code:
           if ($eingabefehler == "") {

          header("Location: ?lang=de&page=kontakterfolgreich");
           
            
          $text "Nachricht vom: " date("d.m.y H:i") . "\r\nAnrede: $anrede \r\nVorname: $vorname \r\nNachname: $nachname \r\nE-Mail: $mailfrom \r\nBetreff: $betreff \r\n\r\nNachricht: $textfeld \r\n\r\n";
            @
          mail($mailto$betreff$text"From: " $mailfrom);
            echo 
          "Die Daten wurden gesendet.<br>"
          Das habe ich leider schon versucht, hat aber nicht funktioniert

          Kommentar


          • #6
            Zitat von LeseDieter Beitrag anzeigen
            Dann müsste ich es ja hier einfügen:
            PHP-Code:
             if ($eingabefehler == "") {

            header("Location: ?lang=de&page=kontakterfolgreich");
             
              
            $text "Nachricht vom: " date("d.m.y H:i") . "\r\nAnrede: $anrede \r\nVorname: $vorname \r\nNachname: $nachname \r\nE-Mail: $mailfrom \r\nBetreff: $betreff \r\n\r\nNachricht: $textfeld \r\n\r\n";
              @
            mail($mailto$betreff$text"From: " $mailfrom);
              echo 
            "Die Daten wurden gesendet.<br>"
            Den header musst du anstelle des echo-Befehls einfügen, davor darf aber kein einziges Zeichen ausgegeben werden (kein HTML und nicht von PHP).

            Andere Möglichkeiten zur Spambotvermeidung gibt es viele:
            Captchas,
            andere Sicherheitsabfragen,
            hidden input-Felder mit einem Namen wie z.B. email (die werden von spambots bevorzugt ausgefüllt). Wenn da ein text drin steht, dann war es ein Spambot,
            etc.

            Am besten mal googeln.

            mfg Tobby

            Kommentar


            • #7
              Wie meinst du das mit anstelle? Kannst du mir das mal zeigen?

              Mit dem hidden input-Feld habe ich schon drinnen, mit einer Telefonnummer und Captchas finde ich eher lästig.

              Kommentar


              • #8
                weiß zwar nicht, was an dem wort "anstatt" nicht zu verstehen war, aber egal. Hier der Code:
                PHP-Code:
                if ($eingabefehler == "") {
                    
                $text "Nachricht vom: " date("d.m.y H:i") . "\r\nAnrede: $anrede \r\nVorname: $vorname \r\nNachname: $nachname \r\nE-Mail: $mailfrom \r\nBetreff: $betreff \r\n\r\nNachricht: $textfeld \r\n\r\n";
                    @
                mail($mailto$betreff$text"From: " $mailfrom);
                    
                header("Location: ?lang=de&page=kontakterfolgreich");

                mfg Tobby

                Kommentar


                • #9
                  So habe das jetzt so:
                  PHP-Code:
                  ...
                  $anrede = isset($_POST["anrede"]) ? $_POST["anrede"] : "";
                  $anredeCk $_POST["anrede"] == "Frau" " checked=\"checked\"" "";
                  $vorname = isset($_POST["vorname"]) ? $_POST["vorname"] : "";
                  $nachname = isset($_POST["nachname"]) ? $_POST["nachname"] : "";
                  $telefonnummer = isset($_POST["telefonnummer"]) ? $_POST["telefonnummer"] : "";
                  $mailfrom = isset($_POST["mailfrom"]) ? $_POST["mailfrom"] : "";
                  $betreff = isset($_POST["betreff"]) ? $_POST["betreff"] : "";
                  $textfeld = isset($_POST["textfeld"]) ? $_POST["textfeld"] : "";
                  $kopie = isset($_POST["kopie"]) ? "checked=\"checked\"" "";
                  $eingabefehler "";
                  $formular "<form action='?lang=de&page=kontakt' method='post' enctype='multipart/form-data' accept-charset='ISO-8859-1'>
                  <table border='0' cellPadding='5' cellSpacing='1'>
                   <tr>
                    <td><strong>Anrede:</strong></td>
                    <td><input type='radio' name='anrede' value='Herr' checked='checked' id='marke1'><label for='marke1'>Herr</label> 
                   <input type='radio' name='anrede' value='Frau'" 
                  $anredeCk " id='marke2'><label for='marke2'>Frau</label></td>
                   </tr>
                   <tr>
                    <td><label for='Vorname'>Vorname:</label> </td>
                    <td><input type='text' size='40' name='vorname' value='" 
                  $vorname "' id='Vorname'></td>
                   </tr>
                   <tr>
                    <td><label for='Nachname'>Nachname:</label> <span class='pflichtfeld'>*</span></td>
                    <td><input type='text' size='40' name='nachname' value='" 
                  $nachname "' id='Nachname'></td>
                   </tr>
                   <tr class='telefon'>
                    <td ><label for='telefonnummernichtseingeben'>Telefonnummer NICHTS eingeben:</label>  </td>
                    <td><input type='text' size='40' name='telefonnummer' value='" 
                  $telefonnummer "' id='telefonnummernichtseingeben'></td>
                   </tr>
                   <tr>
                    <td><label for='Email'>E-Mail:</label> <span class='pflichtfeld'>*</span></td>
                    <td><input type='text' size='40' name='mailfrom' value='" 
                  $mailfrom "' id='Email'></td>
                   </tr>
                   <tr>
                    <td><label for='Betreff'>Betreff:</label> <span class='pflichtfeld'>*</span></td>
                    <td><input type='text' size='40' name='betreff' value='" 
                  $betreff "' id='Betreff'></td>
                   </tr>
                   <tr>
                    <td colspan='2'><label for='Nachricht'>Nachricht:</label> <span class='pflichtfeld'>*</span><br><textarea name='textfeld' rows='8' cols='60' id='Nachricht'>" 
                  $textfeld "</textarea></td>
                   </tr>
                   <tr>
                    <td colspan='2'><input type='checkbox' id='marke3' name='kopie' 
                  $kopie> <label for='marke3'>Ich w&uuml;nsche eine Kopie meiner Anfrage an mein Postfach</label></td>
                   </tr>
                   <tr>
                    <th colspan='2'><br><span class='pflichtfeld'>*</span> <small>= Bitte alle Pflichtfelder ausf&uuml;llen!</small> &nbsp; &nbsp; 
                     <input type='button' onClick=\"location.href='" 
                  $_SERVER["SCRIPT_NAME"] . "'\" value='Zur&uuml;cksetzen'> &nbsp; &nbsp; 
                     <input type='submit' name='sendung' value='Formular absenden'>
                    </th>
                   </tr>
                  </table>
                  </form>"
                  ;

                  if (isset(
                  $_POST["sendung"])) {
                   if (
                  strlen($nachname) <= 2) {$eingabefehler .= "# Der Nachname fehlt!<br>";}
                   if (
                  strlen($telefonnummer) >= ) {$eingabefehler .= "# Geben Sie bitte hier <b>nichts</b> ein!<br>";}
                   if (!
                  preg_match("|^[_a-za-z0-9-]+(.[_a-za-z0-9-]+)*@([a-z0-9-]{3,})+.([a-za-z]{2,4})$|i"$mailfrom)) {$eingabefehler .= "# Fehler in der E-Mail-Adresse!<br>";}
                   if (
                  strlen($betreff) <= 4) {$eingabefehler .= "# Der Betreff " . ((strlen($betreff) == 0) ? " fehlt" " ist zu kurz") . " (min. 5 Zeichen)!<br>";}
                   if (
                  strlen($textfeld) <= 19) {$eingabefehler .= "# Die Nachricht " . ((strlen($textfeld) == 0) ? " fehlt" " ist zu kurz") . " (min. 20 Zeichen)!<br>";}
                   if (
                  $eingabefehler == "") {
                    
                  $text "Nachricht vom: " date("d.m.y H:i") . "\r\nAnrede: $anrede \r\nVorname: $vorname \r\nNachname: $nachname \r\nE-Mail: $mailfrom \r\n\r\nBetreff: $betreff \r\n\r\nNachricht: $textfeld \r\n\r\n";
                     @
                  mail($mailto$betreff$text"From: " $mailfrom);
                      
                  header("Location: ?lang=de&page=home&section=gesendet");
                    if (isset(
                  $_POST["kopie"])) {
                     
                  $kopie "\r\nKopie Ihrer Nachricht auf $url.\r\nWir haben folgende Nachricht erhalten:\r\n\r\n=== Beginn Nachricht ===\r\n\r\n$text \r\n=== Ende Nachricht ===";
                     @
                  mail($mailfrom"Kopie einer Anfrage"$kopie"From: " $mailto);
                    }
                   }
                   else {
                    echo 
                  "<strong>Bitte korrigieren:</strong><br>$eingabefehler";
                    echo 
                  "$formular";
                   }
                  }
                  else {
                   echo 
                  $formular;


                  Leider funktioniert es immernoch nicht. Ich werde einfach nicht weitergeleitet. Wenn ich bei <form action='?lang=de&page=kontakt' method='post' enctype='multipart/form-data' accept-charset='ISO-8859-1'> auch ?lang=de&page=home&section=gesendet einfüge, zeigt er mir dann keine Fehler mehr an, was auch logisch ist.

                  Könnte mir vielleicht einer sagen, wo mein Fehler ist, da ich ja kein echo oder ähnliches davor habe, ich definiere ja immer nur Variablen.

                  Mit freundlichen Grüßen
                  Jan

                  Kommentar


                  • #10
                    Es wäre sehr schon, wenn jemand Antworten könnte, um das Problem so schnell wie möglich aus der Welt zuschaffen.

                    Mit freundlichen Grüßen
                    Jan

                    Kommentar


                    • #11
                      Was kriegst du denn für Fehlermeldungen?

                      Und unterdrücke doch bitte keine Fehlermeldungen mehr (alle @s entfernen). Hast du error_reporting schon auf E_ALL gesetzt?

                      Kommentar


                      • #12
                        Wie gesagt, ich werde einfach nicht auf meine gewünschte Seite geleitet, in meinem Fall: ?lang=de&page=home&section=gesendet

                        ich werde immer auf die Seite geleitet, die in der form action drinne steht: ?lang=de&page=kontakt

                        sonst bekomme ich keine Fehlermeldung.
                        Leider habe ich durch mein Hoster keinen zugriff auf die php.ini oder phpinfo();

                        Wie meinst du das mit @s?

                        Kommentar


                        • #13
                          @mail($mailto, $betreff, $text, "From: " . $mailfrom);
                          ^- Da ist ein @ und das soll weg

                          Weißt du, was dieses @ verursacht ?

                          Kommentar


                          • #14
                            nein, habe mich zwar mit php beschäftigt, aber das habe aus dem Internet und dann für mich angepasst.

                            wenn ich das vohin gepostete script neheme, und dann das @ lösche geht es trotzdem nicht.

                            Könntest du mir trotzdem erzählen, was das @ bedeutet?

                            Kommentar


                            • #15
                              Zitat von LeseDieter Beitrag anzeigen
                              Könntest du mir trotzdem erzählen, was das @ bedeutet?
                              PHP: Error Control Operators - Manual

                              Und künftig liest LeseDieter bitte erst mal selbst, anstatt sich alles vorlesen zu lassen.
                              [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                              Kommentar

                              Lädt...
                              X