Versionsinformation: Die Funktionen send_mail und form_mail, sowie die Klasse form_mailer wurden in Version 2.8 umbenannt in sendMail, formMail und formMailer, um der Namenskonvention des Frameworks zu entsprechen. Die Funktion sendMail ist ab Version 2.8 eine statische Funktion der Klasse Mailer. Die Funktion formMail ist ab Version 2.8 eine statische Funktion der Klasse FormMailer.
Das Framework bietet die Funktion Mailer::mail() zum Versand von Mails. Diese Funktion implementiert eine Reihe von Sicherheitsvorkehrungen, zum Schutz vor verschiedenen Arten von Header-Injection.
Die Funktion "Mailer::mail" ist eine gegen Missbrauch und "Header-Injection" abgesicherte Variante der nativen PHP-Funktion "mail". Anders als "mail" werden alle Eingabedaten geprüft und auch nicht alle Header-Informationen, welche "mail" prinzipiell gestattet sind erlaubt.
Es wird "true" zurückgegeben, wenn die Mail versandt werden konnte, "false" sonst. Der Wert "true" bedeutet jedoch nicht, dass die Mail erfolgreich zugestellt wurde. Er bedeutet lediglich, dass die Eingabedaten im Sinne dieser Funktion syntaktisch korrekt waren.
Die Funktion erzeugt im Header der Mail die zusätzlichen Einträge "x-yana-php-header-protection" und "x-yana-php-spam-protection".
Wenn Sie eine Mail empfangen, die über YANA versendet wurde, können Sie im Header der Mail die entsprechenden Einträge prüfen, um zu sehen ob das Framework im Nachrichtentext Unregelmäßigkeiten entdeckt hat.
Aus Sicherheitsgründen gelten folgende Einschränkungen.
Empfänger:
$recipient
Der Parameter muss eine gültige Mailadresse sein gemäß des regulären
Ausdrucks (Perl-Syntax)
/^[äöüß\w\d-_\.]{1,}\@[äöüß\w\d-_\.]{2,}\.[\w\d-_\.]{2,}$/i
Betreff:
$subject
Alle Sonderzeichen außer "()äÄüÜöÖß[]", alle Tags sowie alle
Zeilenumbrüche werden still (ohne Warnung) entfernt. Bei einer Länge
von mehr als 128 Zeichen werden alle nachfolgenden Zeichen still
entfernt.
Nachrichtentext:
($text)
Alle '@'-Zeichen werden still durch die Zeichenkette "[at]" ersetzt.
Bei Textnachrichten erfolgt ein automatischer Zeilenumbruch nach
spätestens 70 Zeichen. Bei HTML-Nachrichten werden einige potentiell
gefährliche Tags still entfernt (Blacklist-Ansatz).
Header:
$header
Dieser Parameter ist ein assoziatives Datenfeld. Es darf beliebige
X-Header-Daten enthalten, sowie einige unkritische Header-Informationen
(Whitelist-Ansatz).
Die Liste der von Header akzeptierten Parameter lautet:
Parameter | Typ | Default | Beschreibung |
---|---|---|---|
from |
|
n/a |
Eine gültige Mailadresse |
return-path |
|
n/a |
Eine gültige Mailadresse |
cc |
mixed |
n/a |
Entweder eine gültige Mailadresse oder ein numerisches Datenfeld mit mehreren Mailadressen. An alle angegebenen Adressen wird eine Kopie der Nachricht versandt. Anders als bei "bcc" ist die Liste der Empfänger jedoch für alle Empfänger sichtbar. |
content-type |
string |
text/plain; |
Bestimmt den MIME-Type der Nachricht. Nur MIME-Type und Charset sind als Eingaben erlaubt. Andere Werte werden ignoriert. |
mime-version |
float |
1.0 |
Angabe muss entsprechend folgendes regulären Ausdrucks erfolgen (Perl-Syntax): /^\d\.\d$/ |
content-transfer-encoding |
string |
n/a |
Angabe muss entsprechend folgendes regulären Ausdrucks erfolgen (Perl-Syntax): /^\d{,2}bit$/i |
gültige Belegungen für den Parameter $header der Funktion Mailer::mail()
Die Verwendung von "BCC" ist aus Sicherheitsgründen nicht gestattet.
<?php
$recipient = "meineMail@domain.tld";
$subject = "Benachrichtigung";
$mailer = new Mailer("skins/mein_skin/beispiel.mail");
$mailer->subject = $subject;
$mailer->sender = $ARGS["mail"];
$mailer->insert("NAME", $ARGS["name"]);
$mailer->insert("NACHRICHT", $ARGS["nachricht"]);
$mailer->insert("IP", $_SERVER["REMOTE_ADDR"]);
$test = $mailer->send($recipient);
if ($test === true) {
print "Versand erfolgreich";
} else if ($test === false) {
print "Versand nicht erfolgreich";
}
?>
<?php
$recipient = "meineMail@domain.tld";
$subject = "Benachrichtigung";
$mailer = new Mailer("skins/mein_skin/beispiel.mail");
$mailer->subject = $subject;
$mailer->sender = $ARGS["mail"];
$mailer->insert("NAME", $ARGS["name"]);
$mailer->insert("NACHRICHT", $ARGS["nachricht"]);
$mailer->insert("IP", $_SERVER["REMOTE_ADDR"]);
$test = $mailer->send($recipient);
if ($test === true) {
print "Versand erfolgreich";
} else if ($test === false) {
print "Versand nicht erfolgreich";
}
?>
Eine versandte Mail könnte dann wie folgt aussehen: Anmerkung: vor dem Versand der E-Mail prüft die Funktion $mailer->send() die Eingabedaten automatisch auf Versuche von Header-Injection und säubert alle Eingaben. Es kann jedoch absolut nichts schaden, wenn Sie die Syntax der Eingabedaten trotzdem auch in Ihrem Skript noch einmal überprüfen bevor Sie die Funktion aufrufen.
<?php
$formMailer = new FormMailer();
// Betreff
$formMailer->subject = "Benachrichtigung";
// Kopf- und Fusszeile
$formMailer->headline = "Inhalte des Kontaktformulars:\n\n"
$formMailer->footline = "\n\nYANA formmailer at ".$_SERVER['SERVER_NAME'];
// Formularinhalt
$formMailer->content = $_POST;
$test = $formMailer->send("meineMail@domain.tld");
if ($test === true) {
print "Versand erfolgreich";
} else if ($test === false) {
print "Versand nicht erfolgreich";
}
?>
Eine versandte Mail könnte dann wie folgt aussehen: Thomas Meyer, www.yanaframework.net