Kontaktformular auf Homepage erstellen

frontloop

Ensign
Registriert
Mai 2016
Beiträge
203
Hi,

meine Homepage ist bei Strato im Paket "PowerWeb Basic" gehostet.
Homepage ist selbst erstellt und nicht über den Strato-Homepagebaukasten.

Leider habe ich nur absolut rudimentäre Kenntnisse in der Homepageerstellung, also brauche ich eine Anleitung für Dummies und stelle mit Sicherheit die eine oder andere dämliche Frage: :D

Ich würde gerne auf der Homepage ein Kontaktformular einbinden.
Das geht ja am besten mit einem php-Skript, richtig?
Aber wie geht sowas, wo finde ich sowas? Oder hat Strato da was fertiges?

Und dann muss das ja wohl per tls verschlüsselt sein. Was ist dabei zu beachten? Wie implementiere ich das?
 
Warum benutzt du nicht Wordpress als Grundlage wenn du eh nicht viele Kenntnisse beim Erstellen von Websites hast? Oder weißt du nicht was das ist?
 
Es gibt über Google.de tausende Antworten zu deiner Frage, nutze es!
 
frontloop schrieb:
Hi,

meine Homepage ist bei Strato im Paket "PowerWeb Basic" gehostet.
Homepage ist selbst erstellt und nicht über den Strato-Homepagebaukasten.

Leider habe ich nur absolut rudimentäre Kenntnisse in der Homepageerstellung, also brauche ich eine Anleitung für Dummies und stelle mit Sicherheit die eine oder andere dämliche Frage: :D

Ich würde gerne auf der Homepage ein Kontaktformular einbinden.
Das geht ja am besten mit einem php-Skript, richtig?
Aber wie geht sowas, wo finde ich sowas? Oder hat Strato da was fertiges?

Und dann muss das ja wohl per tls verschlüsselt sein. Was ist dabei zu beachten? Wie implementiere ich das?

Vielleicht wäre das für dich das einfachste: https://www.gratis-kontaktformular.de
 
Hast du denn SSL bereits eingerichtet? Für ein Formular brauchst du SSL aus rechtlichen Gründen.

______________________
Kurz und knapp via Smartphone
 
Xero261286 schrieb:
Es gibt über Google.de tausende Antworten zu deiner Frage, nutze es!

Hast du nen Link zu einem (verständlichen) Tutorial? Ich finde da leider gar nichts.

Weil wenn ich mir z.B. den Swiftmailer anschaue, finde ich diese beiden "Anleitungen":
http://www.php-rocks.de/thema/91-html-e-mails-versenden-mit-dem-swiftmailer.html
und
http://swiftmailer.org/docs/introduction.html

Leider geht's da schon los, dass ich absolut keine Ahnung habe, was ich überhaupt machen soll?
z.B:
Installation
The recommended way to install Swiftmailer is via Composer:

$ composer require "swiftmailer/swiftmailer:^6.0"
wft? Wo gebe ich den die Zeile ein? Also die "composer require "swiftmailer/swiftmailer:^6.0""?

Und dann auch der Code, der unter "Basic usage" steht:
require_once '/path/to/vendor/autoload.php';

// Create the Transport
$transport = (new Swift_SmtpTransport('smtp.example.org', 25))
->setUsername('your username')
->setPassword('your password')
;

// Create the Mailer using your created Transport
$mailer = new Swift_Mailer($transport);

// Create a message
$message = new Swift_Message('Wonderful Subject')
->setFrom(['john@doe.com' => 'John Doe'])
->setTo(['receiver@domain.org', 'other@domain.org' => 'A name'])
->setBody('Here is the message itself')
;

// Send the message
$result = $mailer->send($message);

Wo kommt das hin? In meine index.html oder wo?

Sorry, da bin ich halt völlig blank und ich hab keine Ahnung, wo ich mal ein Einstiegs-Tutorial für die absoluten Grundlagen finde...
 
Zuletzt bearbeitet:
ok. also nochmal langsam :-)

swiftmailer installiere ich über ssh/putty mit "composer require "swiftmailer/swiftmailer:^6.0", richtig?

dann habe ich in meiner html-Datei das Formular mit folgenden Daten:
Code:
          <form id="contactform" method="POST">
           <div class="row">
            <div class="6u">
             <input class="text" type="text" name="name" id="name" value="" placeholder="Euer Name" />
            </div>
            <div class="6u">
             <input class="text" type="text" name="_replyto" id="email" value="" placeholder="Eure Email" />
            </div>
           </div>
           <div class="row">
            <div class="12u">
             <input class="text" type="text" name="_subject" id="subject" value="" placeholder="Betreff" />
            </div>
           </div>
            <div class="row">
             <div class="12u">
              <textarea name="message" id="message" placeholder="Eure Nachricht"></textarea>
              <input type="text" name="_gotcha" style="display:none" />
              <input type="hidden" name="_next" value="/danke.html" />
             </div>
            </div>
            <div class="row">
             <div class="12u">
              <ul class="actions">
              <li><input type="submit" value="Senden" /></li>
              <li><input type="reset" class="style3" value="Inhalt l&ouml;schen" /></li>
              </ul>
             </div>
            </div>
           </form>

die php-Datei ist ja dann prinzipiell so aufgebaut:
Code:
// SwiftMailer Autoloader einbinden
include_once __DIR__ . '/swiftmailer/swift_required.php';

// Das Transport-Objekt
$oTransport = Swift_SmtpTransport::newInstance( 'mail.example.com', 587 );
$oTransport->setUsername( 'auth@example.com' );
$oTransport->setPassword( 'yourpassword' );

// Das Message-Objekt
$oMessage = Swift_Message::newInstance();
$oMessage->setFrom( 'phprocks@example.com' );
$oMessage->setTo( 'max.mustermann@example.com', 'Max Mustermann' );
$oMessage->setCc( 'maria.mustermann@example.com', 'Maria Mustermann' );
$oMessage->setSubject( 'PHProcks! Tutorials - less time to learn more' );
$oMessage->setBody( '<h1>PHProcks!</h1><h2>Tutorial: HTML E-Mail senden mit SwiftMailer</h2>', 'text/html' );
$oMessage->addPart( strip_tags($oMessage->getBody()), 'text/plain' );

// Das Mailer-Objekt
$oMailer = Swift_Mailer::newInstance( $oTransport );

// Versenden der Mail und prüfen, auf Versendet
if ( !$oMailer->send($oMessage) ) {

    echo 'Something\'s went wrong!';
    exit;

}


echo 'Yes! First Mail with SwiftMailer sent successfully!';

So. Zu dem php-Teil:
Code:
// Das Transport-Objekt
$oTransport = Swift_SmtpTransport::newInstance( 'mail.example.com', 587 );
$oTransport->setUsername( 'auth@example.com' );
$oTransport->setPassword( 'yourpassword' );
Da kommen die Daten/Anmeldedaten von meinem Email-Hoster (also Strato) rein. Im Endeffekt versendet ja das php-Skript von meiner Strato-Emailadresse an meine Strato-Emailadresse (also "an sich selbst") das Formular.

Code:
// Das Message-Objekt
$oMessage = Swift_Message::newInstance();
$oMessage->setFrom( 'phprocks@example.com' );
$oMessage->setTo( 'max.mustermann@example.com', 'Max Mustermann' );
$oMessage->setCc( 'maria.mustermann@example.com', 'Maria Mustermann' );
$oMessage->setSubject( 'PHProcks! Tutorials - less time to learn more' );
$oMessage->setBody( '<h1>PHProcks!</h1><h2>Tutorial: HTML E-Mail senden mit SwiftMailer</h2>', 'text/html' );
$oMessage->addPart( strip_tags($oMessage->getBody()), 'text/plain' );

setFrom: Da müssen irgendwie die Daten des Absenders rein. Also der Inhalt der Zeile "<input class="text" type="text" name="_replyto" id="email" value="" placeholder="Eure Email" />" aus der html-Datei.

setTo: Da kommt meine Adresse rein

setSubject: Da müssen irgendwie die Daten des Betreffs rein. Also der Inhalt der Zeile <input class="text" type="text" name="_subject" id="subject" value="" placeholder="Betreff" /> aus der html-Datei.

setBody: Da müssen irgendwie die Daten des Textfelds rein. Also der Inhalt der Zeile <textarea name="message" id="message" placeholder="Eure Nachricht"></textarea> aus der html-Datei.


Wie übergebe ich diese Daten vom html- an das php-File?
 
Für ein einfaches Kontaktformular ist Swiftmailer imo mit Kanonen auf Spatzen zu schießen.
Ein einfacher PHP mail() Befehl hätte es auch getan und wäre einfacher umzusetzen.
http://php.net/manual/de/function.mail.php

Aber gut, sei es drum.


Wie übergebe ich diese Daten vom html- an das php-File?
Das ist auch ganz einfach. Du musst deiner Form eine action geben:
Code:
<form action="form.php" id="contactform" method="POST">

Im PHP kommst du dann so an die Variablen dran:
Code:
$name = filter_input(INPUT_POST, 'name');
$email = filter_input(INPUT_POST, 'email');
$message = filter_input(INPUT_POST, 'message');

Das kannst du dann bspw so in den Content der Mail einfügen:
Code:
$oMessage->setBody(  nl2br( $message ), 'text/html' );
 
Danke, WhiteShark für die Hilfe bisher!

Jetzt habe ich mal folgendes gebastelt, aber noch ein paar fragen dazu:

Html-code ändern:
Code:
<form id="contactform" method="POST">
ÄNDERN IN:
Code:
<form action=“form.php”  id="contactform" method="POST">

Dann erstelle ich eine "form.php", die wie folgt aufgebaut ist und folgende Werte übergeben bekommen soll:
„name“ – Euer name
„_replyto“ – Eure Email
“_subject” – Betreff
“message” – Eure Nachricht
“_gotcha” – muss leer sein

Code:
form.php
<?php
error_reporting(0);

//Wird auf der Seite https://www.webmaster-tipps.de/sichere-formulare-mit-php-teil-1/ empfohlen (Schutz vor Full Path Disclosure)


Code:
// SwiftMailer Autoloader einbinden
include_once __DIR__ . '/swiftmailer/swift_required.php';


// Daten übergeben (reicht das als Filter?) Oder brauche ich sowas noch:
https://www.webmaster-tipps.de/sichere-formulare-mit-php-teil-1/
https://www.php-kurs.com/e-mail-und-sicherheit.htm

Code:
$name = filter_input(INPUT_POST, 'name', FILTER_SANATIZE_EMAIL);
$replyto= filter_input(INPUT_POST, '_replyto', FILTER_SANATIZE_EMAIL);
$subject = filter_input(INPUT_POST, '_subject', FILTER_SANATIZE_EMAIL);
$message = filter_input(INPUT_POST, 'message', FILTER_SANATIZE_EMAIL);
$gotcha = filter_input(INPUT_POST, '_gotcha');

Abfrage einfügen: Abbruch, wenn gotcha nicht leer!

Code:
If ($gotcha != "")
{
echo 'Es ist ein Fehler aufgetreten! ';
Exit;
}

Code:
// Das Transport-Objekt -> Hier kommen meine Email-Daten rein
$oTransport = Swift_SmtpTransport::newInstance( 'mail.example.com', 587 );
$oTransport->setUsername( 'auth@example.com' );
$oTransport->setPassword( 'yourpassword' );

Code:
// Das Message-Objekt
$oMessage = Swift_Message::newInstance();
$oMessage->setFrom( $replyto );
$oMessage->setTo( 'max.mustermann@example.com', 'Max Mustermann' );
Frage: Setto und setfrom: Wo muss meine Adresse rein und wo muss die “replyto” rein?
Das replyto in "setfrom" und meine Adresse in "setto", oder?

Code:
$oMessage->setSubject($subject);
$oMessage->setBody(nl2br( $message ), 'text/html');
$oMessage->addPart( strip_tags($oMessage->getBody()), 'text/plain' );

Wo/wie bringe ich den „name“ noch mit rein?
Als 1. Satz im Body eingefügt: „Nachricht von $name“ - Wie geht das?

Code:
// Das Mailer-Objekt
$oMailer = Swift_Mailer::newInstance( $oTransport );

20. 
// Versenden der Mail und prüfen, auf Versendet
if ( !$oMailer->send($oMessage) ) {
 
    echo 'Es ist ein Fehler aufgetreten';
    exit;
 
}
//Hier muss die Weiterleitung auf die “Danke”-Seite rein, oder ist das im html-Teil schon erledigt? 

?>

Und dann müsste doch eigentlich alles passen, oder?
 
Probier doch bitte mal den Formular Generator aus, den ich oben verlinkte hatte.
Da hast du dann auch gleich eine Sicherheitsabfrage mit drin (zB reCAPTCHA) etc.
 
Bin noch nicht zum testen gekommen, aber vielleicht vorab nochmal eine Frage:

Bei dem Formular-Generator von Dragon Sun:

Der Quelltext, der mit von dem Generator ausgegeben wird:
Code:
<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>formular</title>

  <style>
  body, textarea {
   font-family: Verdana, Sans-Serif;
   font-size: 14px;
  }

  span.pflichtfeld {
   font-size: 12px;
   color: Red;
  }

  span.hilfetext {
   font-size: 10px;
   font-style: Oblique;
  }
  </style>

 </head>
<body>

<?php
/*
   Aktion: Formulardaten als E-Mail mit dem PHPMailer versenden.
   Formular - PHP 5.4+, Zeichenkodierung: UTF-8

   Erstellt mit dem Formular Generator (01.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)

// Datei einbinden nach dem absenden des Formulars
// Relativer Pfad zur Datei:
$Include = "danke.htm";
// Wenn die E-Mail nicht versendet werden konnte:
$IncludeError = "fehler.htm";

// 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 . " &#43; &#" . (48 + $Z2) . ";";
$Schutz = md5($Z1 + $Z2);

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

<h3>formular</h3>

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

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

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

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

<p>
 <label> Sicherheitsabfrage: 
 <span class='pflichtfeld'>&#10034; " . $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'>&#10034;</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("whoto@example.com", "John Doe");

  // 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()) {

   // Datei einbinden
   include $Include;
  }
  else {

   // Fehler-Datei einbinden
   include $IncludeError;
  }
 }
 else {

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

 // Formular ausgeben
 echo $Formular;
}
?>

</body>
</html>

Also php-Teil als Inhalt/Teil der html-Datei.

Wenn ich aber den Quelltext der Seite anschaue (also rechtsklick und Quelltext anzeigen),
ist das ganze deutlich verkürzt, weil der php-Teil in eine separate Datei ausgelagert ist:
Code:
!DOCTYPE html>
<html lang="de">
 <head>
  <meta http-equiv="pragma" content="no-cache">
  <title>formular</title>

  <style>
  body, textarea {
   font-family: Verdana, Sans-Serif;
   font-size: 14px;
  }

  span.pflichtfeld {
   font-size: 12px;
   color: Red;
  }

  span.hilfetext {
   font-size: 10px;
   font-style: Oblique;
  }
  </style>

 </head>
<body>


<form action='/Webbausteine-Formular-Generator/data/u_188_164_235_31_144220.php' method='post'>

<h3>formular</h3>

<p>
 <label> Name:
<span class='pflichtfeld'>&#10034; </span><br>
  <input type='text' name='name' value='' size='35'>
 </label>
</p>

<p>
 <label> E-Mail:
<span class='pflichtfeld'>&#10034; </span><br>
  <input type='email' name='email' value='' size='35'>
 </label>
</p>

<p>
 <label> Betreff:
<span class='pflichtfeld'>&#10034; </span><br>
  <input type='text' name='betreff' value='' size='45'>
 </label>
</p>

<p>
 <label> Nachricht:
 <span class='pflichtfeld'>&#10034; </span><br>
 <textarea name='nachricht' cols='40' rows='8'></textarea>
 </label>
</p>

<p>
 <label> Sicherheitsabfrage: 
 <span class='pflichtfeld'>&#10034; </span><br>
 <em>6 &#43; &#53;</em> = 
 <input type='text' name='zip' size='4' autocomplete='off'>
 </label>
 <input type='hidden' name='zip2' value='6512bd43d9caa6e02c990b0a82652dca'>
 <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'>&#10034;</span>
 markierten Felder ausfüllen.</small>
</p>

</form>

</body>
</html>

Siehe hier diese Zeile:
Code:
<form action='/Webbausteine-Formular-Generator/data/u_188_164_235_31_144220.php' method='post'>

Was ist denn sinnvoller/besser? Separate php-Datei oder alles in einem?
 
Zuletzt bearbeitet:
Bei mir wird, egal was ich auswähle, immer die Datei angezeigt, in der sich der Code befinden.
Ich habe keine separate Datei.
 
ich bastel gerade und bin dabei auf folgendes Problem gestoßen:

Ich verwende den HTML-Editor "Phase 5".
Jetzt taucht in dem Code folgende Zeile auf:
Code:
$Mailer->CharSet = "UTF-8";
Dieses Zeichen ">" vor CharSet führt jetzt dazu, dass mit der Editor alles bis zu einem nächsten "<"-Zeichen ausgraut.
Warum?


Das aktuelle Elend kann unter https://vr-diefotografin.de/indexphp.html besichtigt werden
 
Zuletzt bearbeitet:
Die Datei mit dem Formular heißt indexphp.html. Da es eine .html Datei ist, wird PHP nicht geparst. Du musst die also bspw in index.php umbenennen, dann geht das auch.

Phase 5 war mal ein toller Editor. Wird aber seit 2008 nicht mehr aktualisiert. Dementsprechend kennt der noch keine PHP-Objekte und kann das nicht vernünftig highlighten. Da müsstest du einen anderen Editor nehmen. Bspw Notepad++.
 
Also prinzipiell funktionierts jetzt.
Code:
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?
 
Zuletzt bearbeitet:
Zurück
Oben