wie könnte man aber nochmal etwas feilen.
Mit „etwas feilen“ ist es bei dem Skript dieses selbst ernannten „cloud, devops, and full stack design & development professional“ nicht getan. Der Typ hat WIRKLICH ALLES falsch gemacht. Das Zeug ist auch kein Punk, keine Kunst - das muss ganz weg.
Ein einfaches (sic: einfaches!) Skript für den Versand einfachster Kontakt-Nachrichten nur an Dich selbst, bei denen auch keine Nicht-ASCII-Zeichen im Subjekt oder den Mailheadern auftauchen dürfen, könnte so aussehen:
<?php
/*
* Dieses Skript setzt voraus, dass die PHP-Funktion
* mail() -> https://www.php.net/manual/de/function.mail.php
* durch den Hoster ordnungsgemäß konfiguriert wurde.
*/
# *** Konfiguration ***
# Wohin soll die Nachricht gehen?
define( 'Email_TO', 'DeineAdresse@example.com' );
# Bei manchen Hostern ist die Angabe einer Maiadresse des selben Hosters(!) erforderlich:
define( 'Email_FROM', 'formailer@example.com' );
# Das Subjekt bestimmst Du selbst. Keine Umlaute! (sonst wird es komplizierter).
define( 'Email_SUBJECT', 'Nachricht via Kontaktformular' );
# Was soll nach dem Mailversand angezeigt werden?
define( 'new_URL', '/danke.html' );
# *** In der Regel nicht zu ändern:
/*
* https://www.php.net/manual/de/function.mail sagt:
* Hinweis:
* Wenn E-Mails nicht ankommen, versuchen Sie bitte, nur das LF-Zeichen (\n) zu verwenden.
* Einige UNIX-MTAs (mail transfer agents) (ganz besonders » qmail) ersetzen leider LF
* durch CRLF (\r\n) automatisch (wodurch das CR-Zeichen verdoppelt wird, wenn CRLF
* verwendet wird).
* Dies sollte aber nur in Ausnahmefällen geschehen, da es gegen » RFC 2822 verstößt.
*/
define( 'Smtp_EOL', "\r\n" );
define( 'Charset', "UTF-8" );
# *** Programm:
if (
$_SERVER['REQUEST_METHOD'] == 'POST'
and isset( $_POST['name'] )
and isset( $_POST['email'] )
and isset( $_POST['message'] )
) {
# Kurzer Prozess bei häufigem Angriffsversuch:
foreach ( ['email', 'name'] as $item ) {
if ( false !== strpos( "\n", $_POST[ $item ] ) ) {
http_response_code( 410 );
echo '<h1>Nice Try!</h1><hr><p>Your message was not sent.</p>';
exit;
}
}
# Kurzer Prozess mit Spam:
/*
* Spamfilter
* https://code.fastix.org/Projekte/PHP:Spam-Erkennung%20f%c3%bcr%20Mail-%20und%20Kontaktformulare/
* Dateien herunterladen und installieren
* Erforderlich:
* File: known_spam.txt (kann/muss angepasst/ergänzt werden)
* File: SpamDetector.php
*/
require_once ( 'SpamDetector.php' );
$spamdetector = new SpamDetector();
foreach ( ['message', 'email', 'name'] as $item ) {
if ( $spamdetector -> detect( $_POST[ $item ] ) ) {
http_response_code( 403 );
echo '<h1>Sorry! Spam detected.</h1><hr><p>Your message was not sent.</p>';
exit;
}
}
# Ist also vermutlich kein Spam. Dann senden wir das Zeug mal...
$headers = [];
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-Transfer-Encoding: 8bit';
$headers[] .= 'From: '. Email_From;
$headers[] .= 'Content-Type: text/plain; charset=' . Charset;
$headers = implode( Smtp_EOL, $headers );
$body = $_POST['name'] . '( ' . $_POST['email'] . ' ) schrieb: ' . Smtp_EOL . Smtp_EOL;
$body .= $_POST['message'];
# Mail versenden:
mail( Email_TO, Email_SUBJECT, $body, $headers );
# Zur Danke-Seite:
header( 'Location: ' . new_URL );
} else {
/*
* Formular für Eingabe von
* Name (input name='name')
* Mailadresse für Antwort (input name='email'),
* Nachricht (textarea name='message')
* Angabe des target nicht erforderlich.
*/
readfile( 'kontakt-formular.html' );
# oder, wenn PHP erforderlich:
# require 'kontakt-formular.php';
}