E-Mails per PHP versenden

Zu einer typischen Dynamik einer Internetseite gehört es, das diese E-Mails versendet.

  • Beim registrieren in einem Portal, muss man die Registrierung über einen Link bestätigen den man per E-Mail erhält.
  • Es wird per E-Mail bestätigt das neue Beiträge auf eine Frage in einem Forum eingegangen sind.
  • Der Shopbetreiber wird per E-Mail über einen neuen Kauf informiert und der Kunde erhält eine Bestätigung per E-Mail darüber.

Auf Grund der vielen Anwendungsfälle werden Mails auf einem Webserver meist dynamisch zusammengesetzt und dann versandt. Die Empfängerinformationen kommen aus einer Datenbank, ein Token wird erzeugt und einem Link angehängt und so weiter und sofort. Und am Ende soll das ganze Aussehen wie aus einem Guss und natürlich bei jedem E-Mail-Programm möglichst fehlerfrei angezeigt werden.

Wie immer in der Programmierung gibt es auch hier diverse Möglichkeit eine Mail zu generieren. Auf den ersten Blick funktionieren die auch alle, doch bin ich immer wieder an einen Punkt gekommen, an dem das eine oder andere Skript dann doch zu Problemen führte. Meistens wurden Umlaut und Sonderzeichen nicht korrekt dargestellt und dadurch gab es dann häufig auch Formatierungs-Fehler. Hier jetzt ein Beispiel mit dem ich bisher die besten Erfahrungen gemacht habe:

$datenbankabfrage = mysql_query ("SELECT * FROM `user` WHERE `id` LIKE '$id'");
 while ($empf = mysql_fetch_assoc($datenbankabfrage))

{
 $empfaenger = $empf[Aspmail] . ',';
 $empfaenger .= 'admin@forum.de' . ',';
 $name = htmlspecialchars($empf[Asp],ENT_COMPAT | ENT_HTML401, "ISO-8859-1");
 }      

$header= "From: Forum Admin <admin@forum.de> ";
 $header.= "Reply-To: moderatoren@forum.de ";
 $header.= "Return-Path: <admin@forum.de> ";
 $header .= "Content-type: text/html; charset=iso-8859-1 ";
 $betreff = "Du hast etwas nicht richtig gemacht";
 $text = '<p>Hallo ' . $name . ',</p><p>Hier würde ganz viel Text erscheinen</p>';
 mail($empfaenger, $betreff, $text, $header);

Ich befürchte das muss ich näher erläutern. Es soll ein in einem Forum vorhandener User angemahnt werden, das er dort nicht mehr trollen soll. Dazu wird der User im Backend ausgewählt und eine Schaltfläche Mahnung 1 betätigt. Mit dieser Schaltfläche wird die ID des Users an das Skript übergeben das die Mail versendet.

Der erste Schritt ist also die Datenbank nach dem Namen und der E-Mail-Adresse des Users zu befragen. Diese werden dann den Variablen $empfaenger und $name zugewiesen. In dem Beispiel ist auch angegeben wie man weitere Empfänger hinzufügt. Das könnte natürlich auch innerhalb einer Schleife stattfinden. Damit Umlaute und Sonderzeichen später richtig dargestellt werden, werden diese mit dem Befehl htmlspecialchars in das von mir bevorzugte ISO-8859-1 Format gewandelt.

Anschließend wird der Header (oder auch Kopfzeile) der Mail erzeugt. Klar… From ist der Absender, Reply-To ist die festgelegte Antwortadresse und an den Return-Path werden Fehlermeldungen (Mail Deaemons) gesandt. Ganz wichtig sind dann der Content-type und das charset. Durch die Angabe text/html kann man die Mail wie eine normale HTML Seite formatieren und mit der Angabe des charset wird wieder dafür gesorgt das alle Clients Sonderzeichen und Umlaut korrekt darstellen.

Jetzt noch den Befehl mail() ausführen und die Variablen in der richtigen Reihenfolge einfügen.