PHP Mailversand: Schönheitsfehler - Details

frontloop

Ensign
Registriert
Mai 2016
Beiträge
202
Hi,

ich poste das ganze hier nochmal, weils - glaube ich - jetzt eher noch um PHP-Detailfragen geht und nicht mehr um das ursprüngliche Problem: ich hoffe, das ist ok
Ursprünglicher Thread: https://www.computerbase.de/forum/threads/kontaktformular-auf-homepage-erstellen.1685785/

Ich habe ein Kontaktformular auf meiner Strato-Homepage eingebaut.
Basis ist dieser Generator: http://www.nof-tutorials.com/Webbausteine-Formular-Generator/formulargenerator.php
Code aktuell:
Code:
<?php
/*
   Aktion: Formulardaten als E-Mail mit dem PHPMailer versenden.
   Formular - PHP 5.4+, Zeichenkodierung: UTF-8

   Erstellt mit dem Formular Generator (06.06.2017) - 
   http://www.nof-tutorials.com/Webbausteine-Formular-Generator/formulargenerator.php

   Bitte testen Sie das Formular ausführlich und
   beachten Sie die Hinweise im Quelltext!
*/

// PHP Fehlermeldungen (1 um das Formular zu testen) anzeigen.
error_reporting(1); // (0/1)

// Weiterleitung - Nach dem absenden des Formulars,
// gelangt der Benutzer über einen Link auf folgende Seite:
$Weiterleitung = "danke.html";

// PHPMailer - Download unter:
// https://github.com/PHPMailer/PHPMailer     (Button: "Download ZIP").
// Das entpackte Verzeichnis: "PHPMailer-master" als Unterverzeichnis
// einfügen indem dieses Kontaktformular liegt.

// PHPMailer einbinden, Instanz und Zeichenkodierung setzen.
require "PHPMailer-master/PHPMailerAutoload.php";
$Mailer = new PHPMailer();
$Mailer->CharSet = "UTF-8";

// Floodsperre - Innerhalb der Zeitspanne kann das Formular
// vom selben Benutzer nicht mehrmals gesendet werden.
$Floodsperrzeit = 60; // Sperrzeit in Sekunden

// Datei in der die IP und die Zeit gespeichert werden sollen.
$Flooddatei = "floodsperre.txt"; // Die Datei benötigt Schreibrechte!

$name = isset($_POST["name"]) ? strip_tags(trim($_POST["name"])) : ""; // Name
$email = isset($_POST["email"]) ? strip_tags(trim($_POST["email"])) : ""; // E-Mail
$betreff = isset($_POST["betreff"]) ? strip_tags(trim($_POST["betreff"])) : ""; // Betreff
$nachricht = isset($_POST["nachricht"]) ? strip_tags(trim($_POST["nachricht"])) : ""; // Nachricht

// Floodsperre - IP und Zeit überprüfen
if (file_exists($Flooddatei) && is_readable($Flooddatei)) {
 foreach (file($Flooddatei) as $element) {
  list($Ip, $Zeit) = explode("|", $element);
  if ($Ip == $_SERVER["REMOTE_ADDR"]) {
   if ((floor((time() - $Zeit))) < $Floodsperrzeit) {
    // Meldung und Link ausgeben
    exit("<p>Ihre Nachricht wurde bereits versandt!<br>" .
    "<a href='" . $Weiterleitung . "'>Weiter</a></p>");
   }
  }
 }
}

// Benutzereingaben überprüfen
// Die Meldungen müssen hier eventuell angepasst werden.
$Fehler = ["name"=>"", "email"=>"", "betreff"=>"", "nachricht"=>"", "sicherheit"=>""];
if (isset($_POST["submit"])) {
 $Fehler["name"] = strlen($_POST["name"]) < 1 ? " Bitte füllen Sie dieses Feld aus!" : "";
 $Fehler["email"] = filter_var($_POST["email"], FILTER_VALIDATE_EMAIL) === false ? " Geben Sie eine gültige E-Mail-Adresse ein!" : "";
 $Fehler["betreff"] = strlen($_POST["betreff"]) < 1 ? " Bitte füllen Sie dieses Feld aus!" : "";
 $Fehler["nachricht"] = strlen($_POST["nachricht"]) < 10 ? " Bitte füllen Sie dieses Feld aus (min. 10 Zeichen)!" : "";
 $Fehler["sicherheit"] = (md5($_POST["zip"]) != $_POST["zip2"]) ? "Die Rechenaufgabe ist leider falsch!" : "";
}

// Sicherheitsabfrage - Rechenaufgabe
$Z0 = [mt_rand(1, 9), mt_rand(1, 9)];
$Z1 = max($Z0); $Z2 = min($Z0);
$Spam = $Z1 . " + &#" . (48 + $Z2) . ";";
$Schutz = md5($Z1 + $Z2);

// Formular erstellen
$Formular = "
<form action='" . $_SERVER["SCRIPT_NAME"] . "' method='post'>

<p>
 <label> Name:
<span class='pflichtfeld'>✲ " . $Fehler["name"] . "</span><br>
  <input type='text' name='name' value='" . $name . "' size='35'>
 </label>
</p>

<p>
 <label> E-Mail:
<span class='pflichtfeld'>✲ " . $Fehler["email"] . "</span><br>
  <input type='email' name='email' value='" . $email . "' size='35'>
 </label>
</p>

<p>
 <label> Betreff:
<span class='pflichtfeld'>✲ " . $Fehler["betreff"] . "</span><br>
  <input type='text' name='betreff' value='" . $betreff . "' size='45'>
 </label>
</p>

<p>
 <label> Nachricht:
 <span class='pflichtfeld'>✲ " . $Fehler["nachricht"] . "</span><br>
 <textarea name='nachricht' cols='40' rows='8'>" . $nachricht . "</textarea>
 </label>
</p>

<p>
 <label> Sicherheitsabfrage: 
 <span class='pflichtfeld'>✲ " . $Fehler["sicherheit"] . "</span><br>
 <em>" . $Spam . "</em> = 
 <input type='text' name='zip' size='4' autocomplete='off'>
 </label>
 <input type='hidden' name='zip2' value='" . $Schutz . "'>
 <br><span class='hilfetext'> Bitte lösen Sie die Rechenaufgabe. </span><br>
</p>

<p>
 <br>
 <input type='submit' name='submit' value='Formular absenden'>
</p>

<p>
 <small>Bitte alle mit <span class='pflichtfeld'>✲</span>
 markierten Felder ausfüllen.</small>
</p>

</form>
";

// Formular abgesendet
if (isset($_POST["submit"])) {

 // Sind keine Benutzer-Eingabefehler vorhanden
 if (implode("", $Fehler) == "") {

  // Floodsperre - IP und Zeit speichern
  if (file_exists($Flooddatei) && is_writeable($Flooddatei)) {
   $Array = array_slice(file($Flooddatei), -10);
   $Fh = fopen($Flooddatei, "w+");
   fputs($Fh, implode("", $Array) . $_SERVER["REMOTE_ADDR"] . "|" . time() . "|\n");
   fclose($Fh);
  }

  // Daten als E-Mail mit dem PHPMailer versenden (Vorschlag) - Bitte anpassen!

  // E-Mail Absender
  $Mailer->setFrom($email, $name);

  // E-Mail Empfänger
  $Mailer->addAddress("mail@vr-diefotografin.de", "Verena Sandner");

  // Betreff der E-Mail
  $Mailer->Subject = $betreff;

  // Die Zeitzone und das aktuelle Datum setzen
  // http://de3.php.net/manual/de/timezones.europe.php
  date_default_timezone_set("Europe/Berlin");
  $Datum = date("d.m.Y H:i");

  // Inhalt der E-Mail setzen
  $Text = "   Gesendet am: $Datum Uhr
   Name: $name
   E-Mail: $email
   Betreff: $betreff
   Nachricht: $nachricht
  ";
  $Mailer->Body = $Text;

  
  // E-Mail senden und überprüfen ob diese richtig versandt wurde.
  if ($Mailer->Send()) {

   echo "<p>Vielen Dank, die Nachricht wurde versendet.</p>";
  }
  else {

   // Wenn die Daten nicht versendet werden konnten,
   // wird die E-Mail-Adresse für den direkten Kontakt eingeblendet.
   echo "<p>Beim Senden der Nachricht ist ein Fehler aufgetreten!<br>" . 
   "Bitte wenden Sie sich direkt an: <a href='mailto:" . $Mailto . "'>" . $Mailto . "</a></p>";
  }

  // Automatische Weiterleitung
  echo "<script>window.setTimeout('location.href=\"" . $Weiterleitung . "\"', " . $Autoweiterleitung . "*1000);</script>
  <noscript><meta http-equiv='refresh' content='" . $Autoweiterleitung . "; URL=" . $Weiterleitung . "'></noscript>
  <p>Automatische Weiterleitung in " . $Autoweiterleitung . " Sekunden &hellip;<br>
   <a href='" . $Weiterleitung . "'>Weiter</a></p>";
 }
 else {

  // Formular und Benutzer-Eingabefehler ausgeben
  echo $Formular;
 }
}
else {

 // Formular ausgeben
 echo $Formular;
}
?>

bzw. link:
https://www.vr-diefotografin.de/indexphp2.php

Probleme, die jetzt noch existiert:
1. Wenn ich ein Feld nicht ausfülle oder die Sicherheitsabfrage falsch ist und dementsprechend die Fehlermeldung eingeblendet wird, setzt er mich automatisch an den Anfang der Seite. D.h. ich muss erst wieder zu dem Formular runterscrollen, bevor ich die Fehlermeldung sehe.
Ich will aber gleich bei dem Formular bleiben.
Wie geht das?

2. Wenn die Fehlermeldung kommt "Ihre Nachricht wurde bereits versandt", ist alles was unterhalb noch auf der Seite kommen sollte, also die "Partner" und die Fußzeile mit Impressum etc. nicht mehr vorhanden. Die Seite endet unmittelbar nach der "Ihre Nachricht wurde bereits versandt!".
Warum?

3. Die Weiterleitung auf die "Danke-Seite" geht nicht. Eigentlich sollte er unmittelbar nach dem Drücken des "senden-buttons" auf die Seite "www.vr-diefotografin.de/danke.html" weiterleiten.

Kann mir da noch jemand helfen?

Und noch als 4. Frage: Ist das Formular so in der Form entsprechend sicher bzw. rechtlich in Ordnung?
 
zu 1
wirst du nen formular-anker benötigen der bei dir auf #contact geht
wird im generator angeboten

zu 3
was wenn du in zeile 18
$Weiterleitung = "danke.html";

die ganze url verwendest?
www.vr-diefotografin.de/danke.html

geht dann die weiterleitung?


zu 2
wann kommt diese meldung?
wie kann man das gegentesten?
 
zu 2)
exit("<p>Ihre Nachricht wurde bereits versandt!<br>" .

Das exit killt das komplette Script, daher keine weitere Ausgabe.

Das ganze ändern lässt sich nur, wenn du dein komplettes Script umschreibst.

Insgesamt finde ich das total kompliziert, mit dem Script und ginge wesentlich leichter ;-)


edit: zu 1

<form action='" . $_SERVER["SCRIPT_NAME"] . "' method='post'>

ändern in

<form action='./indexphp2.php#contact' method='post'>

teste mal bitte, ob das klappt ;-)
 
Zuletzt bearbeitet:
Zurück
Oben