Tom: Kontaktformular PHP - eMail-Inhalt wird nicht angezeigt

Beitrag lesen

Hello,

auf welchem Host (Linux, WinDOS, ...) soll das ablaufen?

Das ist noch nicht geklärt, da die Seite noch nicht online geht.
Gibt es da nichts universelles? =)

Du kannst die Funktion so bauen, dass sie auf unterschiedlichen Systemen (fast immer) läuft. Es wird sicherlich auch dann noch Ausnahmen geben, die händisch und individuell angepasst werden müssen.

Um Vinzenz' Gebetsmühle https://forum.selfhtml.org/?t=201700&m=1361158 noch einen weiteren Schubs zu geben, gehe ich nochmal auf seine berechtigten Einwände ein:

Die Verwendung von $_REQUEST ist deshalb so schädlich, weil sie eine Mischung aus $_GET, $_POST und $_COOKIE darstellt
http://php.net/manual/en/reserved.variables.request.php
Es wäre also möglich, Massenmails einfach per "Linkliste" zu versenden, also durch Request einer parametrisierten URL.

example.com/mail.php?send=1&Name=Thomas&Email=abc@localhost.de&Nachricht=Du+bist+doof&Betreff=Verarschung

So einen Link baut Dir jedes Kind zusammen. Das Formular wird nicht benötigt.
Einen Post-Request zu simulieren ist dann schon ein ganz kleines bisschen aufwändiger. Außerdem kann man den nicht so einfach weiterreichen, während ein Link leicht versendbar ist. Der Grund ist, dass ein Post-Request "on-the-fly" in den üblichen Desktopwerkzeugen nicht vorgesehen ist.

Zum Thema: welche Parameter sollen per Mail übertragen werden.
--------------------------------------------------------------
Sicherlich ist die Verwendung von foreach() heute der von while-list()-each() vorzuziehen. Du solltest aber nicht unbedingt einfach die übertragenen Parameter abscannen (iterieren) mit foreach(), sondern eine Vergleichsliste mit den benötigten und optionalen Parametern durchlaufen. Diese vergleichst Du dann mit den erhaltenen Parametern. Fehlt ein mandativer Parameter, gibt es Alarm. Bleibt am Ende ein Paramter in der Post-Liste übrig (dann wurde er unverlangt mitgesendet), gibt es ebenfalls Alarm. Bei den optionalen musst Du selber entscheiden, was geschehen soll.

Zum Thema: welche Inhalte gehören wohin?
----------------------------------------
Attachments gehören in die "additional Headers", nicht in das Message-Argument der mail()-Funktion. Anders lässt sich eine RFC-konforme Mail mit Attachments nicht aufbauen. Hier war Vinzenz etwas ungenau. Die reine Textnachricht gehört allerdings durchaus ins Message-Argument der Funktion.

Alle Header (To, Subject, Additional Headers) müssen codiert werden. Sie dürfen nur (druckbare) ASCII-Zeichen enthalten. Willst Du andere Zeichen versenden, so musst Du diese codieren.
Dazu eigent sich z.B. die Funktion mb_encode_mimeheader()
http://de.php.net/manual/en/function.mb-encode-mimeheader.php
oder die Funktion iconv_mime_encode()
http://de.php.net/manual/en/function.iconv-mime-encode.php

Dazu musst Du wissen, in welcher Codierung die Daten im Script ankommen, also i.d.R., in welcher Codierung das Formular verfasst wurde, das die Daten entgegen nimmt. Der Browser verwendet dann üblicherweise für den Request dieselbe Codierung.

Zum Thema Kontrolle: Affenformular und Trennung der Datenübertragung und des Mailversands
-----------------------------------------------------------------------------------------
Vinzen hat dir ja schon das Affenformular nahegelegt. In dieses Affenformular solltest Du dann die Parameterprüfung einbauen, wie ich sie Dir vorgeschlagen habe. Erst wenn das Affenformular erfolgreich bedient wurde, reichst Du die (in einem Array) gesammelten Daten an deine eigene sendmail()-Funktion weiter. Trenne also den Datenempfang (mit Dialog mit dem Benutzer) und die Weitersendung sauber in (mindestens) zwei Funktionen auf. Das vermeidet Kummer.

Das Thema Captcha: ganz schlechte Idee
--------------------------------------
Ein Captcha einzubauen, ist eine ganz schlechte Idee.
Ein Zeitfenster hilft meistens auch schon sehr gut gegen Roboter-Mails.
Um ein Zeitfenster bereitzustellen, sendest Du beim Aufruf des Mailformulars einen Parameter vom Server mit, der nur eine gewisse Zeit gültigkeit hat. Dieser muss auch beim Rücksenden wieder vorhanden sein. Üblicherweise wird dieser verschlüsselt, damit er sehr schwer erratbar ist, und beim Auswerten des Requests dann wieder entschlüsselt. Wie du ihn ver-/entschlüsselst, das verrätst Du natürlich niemandem.

Wie eng Du dein Zeitfenster machst, ist Versuchssache. Hotti hat einmal die sehr gute Zusatzanregung gegeben, auch die Eingabezeit für die Mail zu berücksichtigen, also z.B. die ersten acht Sekunden nach Formularaufruf auch auszuklammern. So schnell tippt nur ein Roboter, der sofort antwortet. Meistens sammeln die Roboter aber erst die Formulare ein, werten sie in Ruhe aus und senden dann erst nach Stunden die Spam-Mails. Dann wäre aber das Zeitfenster abgelaufen.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de