PHP Maniac

Das PHP Blog für PHP-Profis und alle die es werden wollen

Mailen mit PHP – Über das automatisierte Versenden von Emails

2 Juli, 2009 (15:49) | Allgemein, Grundlagen, Sicherheit | Von: PHP Maniac

Nachdem sich mein letzter Artikel mit dem automatischen Generieren von Passwörtern beschäftigt hat und ich als Beispiel die Benutzerregistrierung erwählte, möchte ich euch heute gerne zeigen wie ihr die erstellen Passwörter (oder auch beliebige andere Informa-tionen) per Mail an den Benutzer senden könnt. Zunächst wollen wir uns hierfür die von PHP mitgebrachte mail() Funktion näher anschauen, die einen schnellen Versand von einfachen Emails ermöglicht.

Einfach nur Mailen

Wie eingangs erwähnt bringt PHP von Haus aus eine Funktion für den Emailversand mit, die PHP mail() Funktion:

bool mail(string $an, string $betreff, string $text);

Wie ihr seht ist der Umgang mit der Mail Funktion sehr einfach. Ein Aufruf genügt und schon versendet PHP das Email für euch an die angegebene Adresse. Emails an mehrere Empfänger sind auch kein Problem, es können mehrere Adressen an die Funktion über-geben werden, wenn die Adressen durch ein Komma getrennt werden. Da der Rückga-betyp bool ist, können wir auch direkt in einer if-Abfrage prüfen ob der Versand erfolg-reich war:

if(mail("user@email.de", "Testnachricht", "Hallo! Dies ist ein Test!"))
{
	echo "Nachricht erfolgreich versendet!";
}
else
{
	echo "Das Senden der Nachricht ist fehlgeschlagen!";
}

Wenn ihr euch mit dem obigen Skript mal ein Email sendet, wird euch aber schnell auf-fallen, dass z.B. der Absender etwas abenteuerlich ausschaut. Wie genau ist von Fall zu Fall unterschiedlich, da der Standardabsender von der Serverkonfiguration abhängt. Damit wollen wir uns aber natürlich nicht zufrieden geben und daher bietet die mail() Funktion eine Möglichkeit eine eigene Absenderadresse festzulegen. Leider ist dies nicht so einfach wie wir es sonst von PHP gewöhnt sind, aber kompliziert ist es auch nicht.

Eigene Absender festlegen

Die mail() Funktion bietet für einen optionalen Parameter an, mit dem sich bestimmte Header-Einstellungen für das Email umsetzen lassen. Hierrüber lässt sich der Absender, die Antwortadresse und vieles mehr einstellen:

$header = 'From: mirko@phpmail.de' . "\r\n" .
	  'Reply-To: kai@javamail.com' . "\r\n";

if(mail("user@email.de", "Testnachricht", "Hallo! Dies ist ein Test!", $header))
{
	echo "Nachricht erfolgreich versendet!";
}
else
{
	echo "Das Senden der Nachricht ist fehlgeschlagen!";
}

Das Beispielskript versendet nun ein Mail von der Adresse mirko@phpmail.de, da dies durch den „From“ Eintrag im Header festgelegt wird. Jedes Feld im Header muss durch einen doppelten Zeilenumbruch mit „\r\n“ abgeschlossen werden, wie wir es schon von unseren Headern bei den http Requests gelernt haben. Klickt der Empfänger jetzt auf Antworten um auf unser Email zu antworten, so wird sein Emailprogramm eine Antwort an kai@javamail.com senden. Dies lässt sich über den Header-Eintrag Reply-To festlegen. Dies sind nur zwei der vielen Möglichen Einstellungen für die Email-Header, aber es sind sicherlich die wichtigsten.

Sicherheitsaspekte

Die einfache Anwendung der mail() Funktion ist gleichzeitig auch ihre große Schwäche. Nur zu leicht kann man durch schlecht programmierte Skripte Spammern ein perfektes Werkzeug in die Hand geben um den eigenen Server zum Versenden von tausenden von Emails zu verwenden. Daher möchte ich an dieser Stelle ganz besonders auf einige wichtige Aspekte bei der Verwendung der mail() Funktion hinweisen:

1) Wenn die Empfängeradresse eine Benutzereingabe in eurem Skript ist, so solltet ihr diese sehr genau prüfen. So wie ihr Emails an mehrere Empfänger versenden könnt, so kann es auch jeder Besucher eurer Webseite, indem er mehrere Adres-sen durch ein Komma trennt.

2) Solltet ihr Benutzereingaben im Headerfeld zulassen, z.B. um eine Absenderad-resse zu ermöglichen, so solltet ihr noch vorsichtiger sein. Kann der Benutzer beliebigen Text in den Header einfügen, so ist es mögliche das Email komplett zu verändern. Über den Header können rein theoretisch auch Anhänge oder ein neuer Nachrichtentext realisiert werden.

Viele Server erlauben heutzutage zwar keine Absenderadressen für Domains mehr, für die sie nicht zuständig sind, jedoch kann man sich darauf nicht verlassen. Ich empfehle daher möglichst viele Parameter der Mail-Funktion statisch selbst vorzugeben. Wollt ihr z.B. ein Kontaktformular erstellen, dann muss die Emailadresse des Benutzers ja nicht unbedingt die Absenderadresse des Emails sein. Ihr könnt sie auch in den Nachrichten-text einbauen und somit zumindest Benutzereingaben im Headerbereich der Email ver-meiden.
Ein erster Schritt um wenigstens eine gewisse Grundsicherheit zu erreichen ist das Er-setzen der Steuerzeichen für Header und Adressen:

$benutzer_an = str_replace(',', '', $benutzer_an);
$benutzer_header = str_replace("\n", '', $benutzer_header);
$benutzer_header = str_replace("\r", '', $benutzer_header);

Selbstverständlich müssen die Ersetzungen nur auf die Benutzereingaben angewendet werden und nicht auf den gesamten Header. Andernfalls würden durch das Ersetzen auch die von uns gewünschten Einstellungen unwirksam.

Welche Sicherheitsmaßnahmen im Einzelfall noch nötig sind, muss separat geprüft werden, aber mit den oben genannten Ersetzungen wird schon einmal das schlimmste verteilt und man macht es einem möglichen Angreifer nicht all zu leicht.

Soviel zur PHP mail() Funktion, für anspruchsvollere Aufgaben im Bereich des automa-tisierten Mailings werde ich in nächster Zeit noch eine Email-Klasse vorstellen, die auch gut mit HTML Emails oder Anhängen zu recht kommt und ebenfalls sehr einfach zu bedienen ist. Bis dahin, viel Spaß mit der mail() Funktion!

Be Sociable, Share!

Kommentare

Pingback von Datei-Uploads mit PHP – Hochladen leichtgemacht – PHP Maniac – Das PHP Blog
Datum 6. Juli 2009 um 12:10 Uhr

[…] ich in meinem letzten Beitrag erläutert habe, wie ihr Informationen per Email an eure Besucher versenden könnt, stelle ich heute einen Weg vor, wie Ihr Dateien von den Besuchern in Form von Datei Uploads […]

Schreibe einen Kommentar