Formular - Mail kommt nicht an

  • Also jetzt versteh ich gar nichts mehr.. Zuerstmal wirklich danke das du/ihr euch überhaupt mit meinem Problemchen befasst. Aber die Felderauswertungen stehen ja zwischen den Feldern, also wenn der erste if Block alles umschliessen soll. Das geht ja gar nicht, dann müsste ich es ja komplett umbauen. Oder?

    Heisst für mich als Fazit: Alles löschen und neu schreiben, puuuh..

    Richtig oder falsch?

  • Naja, verkehrt wäre es nicht, die Struktur ist verbesserungsfähig. Stichwort EVA-Prinzip.
    Du solltest erstmal nur den PHP-Teil abhandeln, bevor du irgendeine Ausgabe machst. Alles was du im PHP-Teil ausgeben möchtest speicherst du in Variablen ab die du dann später an der entsprechenden Stelle ausgibst.
    Also Aufbau:
    - Prüfen ob Formular abgeschickt wurde
    -- Falls ja:
    --- Eingaben ok? Mail versenden und Erfolgsmeldung
    --- Eingaben nicht ok? Passende Fehlermeldung
    - Ausgabe des Formulars und gegebenenfalls Erfolgs-/Fehlermedlung

    So in ganz grob zur Struktur. Die Überprüfungen kannst du ja aus deinem Script übernehmen, du kannst das ganze aber eben klarer strukturieren, was bei eventueller Fehlersuche und -korrektur hilfreich ist, wie du jetzt merkst.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Hab mal kurz reingeschaut. Was er da erzählt ist grundsätzlich schon richtig. Mir ging es darum eben die Ausgabe von der Verarbeitung zu trennen. Wenn das Formular abgesendet wurde prüfst du die Daten, gibst aber während der Prüfung noch nichts aus sondern legst die Meldungen die du ausgeben willst in Variablen ab.
    Und erst wenn die Verarbeitung komplett fertig ist kommt deine Ausgabe. Und da kannst du dann die abgelegten Meldungen mit ausgeben. Das widerspricht, soweit ich es mir angeschaut habe, nicht dem von dir verlinkten Video.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • In groben Zügen:


    So, aber jetzt nicht einfach kopieren und sagen "fetisch", bitte auch versuchen zu verstehen, was da steht und warum das so da steht.

  • Dankeschön, ich habe es jetzt noch etwas verändert un das preg_match wieder eingebaut. Jetzt kommen auch beide Mails an. Lieber Unbekannter, findest du es besser nicht zu verketten und alles in doppelten Anführungszeichen zu schreiben. Ich habe gelernt das verketten schneller sein soll. Natürlich bei kleinen Scripten die auf Seiten mit wenig Besuchern eingesetzt werden unrelevant. Dachte nur ich gewöhne es mir gleich mit verketten an, bei 100000 Besuchern hat man da ja einen kleinen Geschwindigkeitsvorteil, auch wenn ich soviele Besucher bestimmt nie haben werde;-)

    http://isi.square7.ch/kontakt/

    Veränderter Code, auch mit Kommentaren ob ich alles richtig verstanden habe:roll:

    Am Nachmittag werde ich mich noch damit befassen, das die Felder nach absenden wieder leer sind. Denn möchte kein Captcha haben sondern nur ein bisschen verhindern das man nicht F5 drücken kann um die nachricht nochmal zu versenden und ich werde mir noch mal den PHPMailer ansehen , und eventuell einbauen...

    Einmal editiert, zuletzt von Programmierer (21. September 2011 um 13:38)

  • Sieht so aus, als wenn du es verstanden hättest. ;)

    Mit leeren Feldern verhinderst du mit F5 kein erneutes Senden. Ohne Captcha könntest du zu einer anderen Seite weiterleiten, dann geht auch F5 nicht mehr.

    Und ja, benutzte den PHPMailer, damit kommen die Mails auch überall an und verschwinden nicht in Spamordnern, weil der Mailheader eventuell nicht ausreicht.

  • das ist jetzt eine Frage keine Kritik an deinem Vorgehen:

    Zitat

    Mit leeren Feldern verhinderst du mit F5 kein erneutes Senden. Ohne Captcha könntest du zu einer anderen Seite weiterleiten, dann geht auch F5 nicht mehr.

    Ich dachte wenn die Felder wieder leer sind dann muss man sie ja erneut ausfüllen und das erschert das Spammen ja auch, stimmt das so nicht. Frag nur weil ich es mir so vorstelle..

    Werde mir dann mal den Link von SinNlos --> http://phpforum.de/forum/showthread.php?t=216932 zu gemüte führen. Vielen Vielen Dank;-);-)

    Das erste was mir beim PHP Mailer auffält, Senden von E-Mails mit mehreren Empfängern(TO), Kopieempfängern(CC), Blindkopieempfängern(BCC) und Antwortemailadressen(REPLY-TO) soll das wirklich gehen. In meinem Buch über PHP Sicherheit steht, das sollte man unterbinden? Alternativ kann man auch prüfen ob die Mailadresse Newlines enthält..

    Wenn ich mal bisschen gelesen habe kommen bestimmt noch ein zwei Fragen, bis später

    Einmal editiert, zuletzt von Programmierer (21. September 2011 um 13:48)

  • Ja, das geht alles mit dem PHPMailer. Anhänge und embedded-Images sind auch kein Problem. Diese Klasse ist wirklich gut.

    Und was das F5 angeht, probiere es aus. Es ist ein Unterschied, ob du auf "Senden" klickst oder die Seite einfach aktualisierst. Dir zeigt der Browser bei F5 auch schon an, ob er die Daten wirklich nochmal schicken soll.

  • Zitat

    Und was das F5 angeht, probiere es aus. Es ist ein Unterschied, ob du auf "Senden" klickst oder die Seite einfach aktualisierst. Dir zeigt der Browser bei F5 auch schon an, ob er die Daten wirklich nochmal schicken soll.

    Nee ich mein, nehmen wir an die Felder werden nach dem Absenden wieder leer, dann kann man doch per F5 nicht neu senden, weil dann wieder geprüft wird ob Inhalte da sind und ob korrekt. Einem Spammer wäre das bestimmt zu nervig. Ich frag nur, weil ich es mir von der Logik her so vorstelle:

    Felder korrekt ausgefüllt --> Nachricht wird versandt --> Felder sind wieder leer --> Erneute Prüfung bei Klick auf Senden --> Wenn Felder leer oder falsche ANgaben dann meckern. Kann man dann wirklich die Nachricht mehrmals abschicken.

  • Probiere es doch einfach aus! Fülle alle Felder aus, klicke senden und danach F5. Beim erneutem Klick auf Senden wird wieder überprüft, aber eben nicht mit F5

  • Probiere es doch einfach aus! Fülle alle Felder aus, klicke senden und danach F5. Beim erneutem Klick auf Senden wird wieder überprüft, aber eben nicht mit F5

    Jop du hast recht, es wird wieder versendet. Daher waren meine Überlegungen ja ob man die Feldinhalte nach senden aus den feldern entfernen kann. Aber wird wahrscheinlich nicht gehen sonst hättest es mir schon gesagt?!

  • Ist gibt einige Möglichkeiten, ein mehrfaches Senden zu verhindern google liefert mit

    php mehrfaches absenden formular verhindern

    4.000.000 Treffer, da solltest du was finden. ;)

  • So: Es funktioniert zwar wenn das Formular gesendet wurde, aber es erscheinen wieder Noticen. Ich glaub da habe ich noch Lernbedarf vom Ablauf her;-), dachte eigentlich die Vars sind initialisiert

    PHP
    if(isset($_POST['senden']) && $fehler==false)
        {
            unset($name);
            unset($email);
            unset($nachricht);
        }

    http://isi.square7.ch/kontakt/

    Ich denke laut Meldungen das eben wieder gesamter Ablauf vor dem Ablauf abgearbeitet wird und deshalb die Namen der Felder email_kopie usw.. noch nicht gesetzt sein können. Tipp???


    ------------

    Es scheint der richtige Ansatz zu sein, denn Wenn Nachricht versendet, werden Felder leer und bei F5 kommt keine neue nachricht da die Felder ja leer sind. Muss nur noch die meldungen wegbekommen. Ich kann natürlich am Anfang error_reporting(E_ALL); ini_set("display_errors", true); ausklammern aber dann werden die meldungen ja nur verborgen und sind nicht behoben

    4 Mal editiert, zuletzt von Programmierer (21. September 2011 um 16:55)

  • PHP
    if(isset($_POST['senden']) && $fehler==false)
        {
            unset($name);
            unset($email);
            unset($nachricht);
        }


    ändern in

    PHP
    if(isset($_POST['senden']) && $fehler==false)
    {
      $name = $email = $nachricht = "";
    }
  • PHP
    if(isset($_POST['senden']) && $fehler==false)
        {
            unset($name);
            unset($email);
            unset($nachricht);
        }


    ändern in

    PHP
    if(isset($_POST['senden']) && $fehler==false)
    {
      $name = $email = $nachricht = "";
    }

    Magst du mir noch sagen warum es mit unset nicht funktionierte, war es nicht die richtige Funktion? Jetzt klappt es wird keine weitere Mail versandt! Aber eine Notice kommt noch, dann hab ichs. Glaub liegt eben daran das das Formular erst danach kommt, aber wenn ich den Teil erst danach hinpacke bleibt die meldung trotzdem. Daher vielleicht doch was anderes

  • Steht doch in der Doku:

    unset() löscht die angegebene Variable.

    D.h., die Variable existiert danach nicht mehr.

  • ahh die Variable aber nicht den Inhalt?! Achja steht auch bei PHP.net, habe dann weiter unten gelesen man soll $GLOBALS(name); verwenden aber dann erschienen die Noticen immer noch. Löscht also bei unset($name) nur Variable und bei $GLOBALS Variable und den Inhalt?

    Ich bin ehrlich ohne deine Hinweise und Hilfestellungwen hätte ich es denke ich niemals hinbekommen dioese Logik halbwegs zu verstehen

  • Zur Notice-Meldung:

    Checkboxen werden nur übertragen, wenn sie angeklickt worden sind. Deshalb kommt bei

    PHP
    if($_POST['email_kopie'] == 'kopie')


    die Meldung "undefined index"
    Richtig ist

    PHP
    if(isset($_POST['email_kopie']) && $_POST['email_kopie'] == 'kopie')


    wobei der Vergleich $_POST['email_kopie'] == 'kopie' in dem Falle nicht unbedingt nötig ist, da es ja nur diese eine Checkbox gibt