E-Mail-Versand
In PHP wird die Funktion mail()
dazu verwendet, E-Mails zu versenden. Dabei kann es sich um eine Text-Nachricht,
eine HTML-Nachricht oder sogar um eine „Multipart Message“ (damit ist zumeist eine E-Mail mit Anhang gemeint) handeln. Beim
Versenden von E-Mails mit Anhängen wird jedoch gerne auf die Library PHPMailer
zurückgegriffen, da das
Zusammenbauen der E-Mail-Header für solche komplexe E-Mails komplizierter ist. Der Funktion mail()
müssen der
Empfänger, der Betreff und der Inhalt übergeben werden. Zusätzlich können E-Mail-Header und Parameter (für das E-Mail-Programm)
übergeben werden.
Die Angabe des Empfängers enthält die E-Mail-Adresse und ggf. einen Anzeigenamen (welcher z. B. von E-Mail-Clients verwendet wird). Gibt es mehrere Empfänger, so werden diese durch Komma getrennt. Eine detaillierte Spezifikation finden Sie in RFC 2822. Hier sind einige Beispiele für gültige Empfängerangaben:
<?php $toEinfach = 'info@example.com'; $toEinfachMitName = 'Example GmbH <info@example.com>'; $toMehrfach = 'info@example.com, vertrieb@example.com'; $toMehrfachMitName = 'Example GmbH <info@example.com>, Example GmbH - Vertrieb <vertrieb@example.com>';?>
Der Betreff kann „direkt“ als Zeichenkette angegeben werden. Enthält die Zeichenkette Sonderzeichen (z. B. Ä, Ö oder Ü), so muss diese speziell formatiert werden, da andernfalls der Betreff falsch dargestellt wird. Grund dafür ist, dass der SMTP-Header (in welchem sich der Betreff verbindet) nur ASCII-Zeichen enthalten darf. Eine Möglichkeit, wie der Betreff formatiert werden kann, ist die Konvertierung in eine BASE64-Zeichenkette (siehe 2. Beispiel). Eine genaue Beschreibung zu den Möglichkeiten der Betreff-Formatierung bzw. -Konvertierung finden Sie in RFC 2047.
<?php $betreff = 'Frage zum Hosting-Angebot'; $betreffMitSonderzeichen = '=?UTF-8?B?'.base64_encode('Frage zu Homepage-Baukästen').'?=';?>
Der Nachrichteninhalt selbst stellt keine Besonderheit dar. Die Nachricht kann nur aus Zeichen oder, wenn es sich um eine HTML-E-Mail handelt, HTML-Code enthalten.
Der Parameter für den E-Mail-Header (auch Kopfzeilen genannt) kann dazu genutzt werden, einige erweiterte Informationen
(z. B. CC- oder BCC-Adressen) anzugeben. Dabei muss darauf geachtet werden, dass jede Header-Angabe mit \r\n
abgeschlossen sein muss. Eine Header-Angabe setzt sich immer aus dem Namen der Header-Eigenschaft, einem Doppelpunkt, einem
Leerzeichen, dem Wert, der Eigenschaft und einem Zeilenumbruch mittels \r\n
zusammen. Grundsätzlich ist es zu
empfehlen, immer einen E-Mail-Header mit anzugeben, in welchem die Eigenschaften From
(Absender), To
(Empfänger), Reply-To
(Antwort-Adresse) und Content-Type
sowie, wenn benötigt, Cc
und
Bcc
angegeben werden.
<?php $kopfzeilen = "From: Max Mustermann <max-mustermann@example.com>\r\n"; $kopfzeilen .= "To: Katrin Meyer <katrin-meyer@example.com>\r\n"; $kopfzeilen .= "Cc: Tom Dreher <tom-dreher@example.com>\r\n"; $kopfzeilen .= "Bcc: Daniel Busch <daniel-busch@example.com>\r\n"; $kopfzeilen .= "Reply-To: Max Mustermann <max-mustermann@example.com>\r\n"; $kopfzeilen .= "Content-Type: text/plain; charset=utf-8\r\n"; ?>
Übrigens: Die Eigenschaften From
, To
und Reply-To
können so angegeben werden,
wie bereits weiter oben für den Empfänger-Parameter beschrieben. Üblicherweise wird im Empfänger-Parameter lediglich die
E-Mail-Adresse mitgegeben, wohingegen im E-Mail-Header eine formatierte Angabe (mit Name und E-Mail-Adresse) verwendet wird.
Des Weiteren muss darauf geachtet werden, dass die Namen im E-Mail-Header ggf. speziell formatiert werden müssen (z. B.
mit BASE64), sofern diese Sonderzeichen enthalten.
Der letzte Parameter, welcher ebenfalls optional ist und dazu genutzt wird, dem E-Mail-Programm einen Parameter mitzugeben,
wird z. B. bei Verwendung des Programms sendmail
dazu genutzt mittels der Option -f
, dem Programm
die Absenderadresse zu übergeben. Dadurch weiß das Programm, mit welchem Absender die E-Mail verschickt werden soll. Je
nachdem, welches Programm zum Versand der E-Mails auf Ihrem Webserver verwendet wird, können sich die notwendigen Optionen
unterscheiden. Zumeist ist es jedoch nicht notwendig, diesen Parameter mit anzugeben.
Wichtig: Um den E-Mail-Versand mittels XAMPP zu testen, kann das Programm mailtodisk
verwendet werden.
Dieses ist bereits standardmäßig konfiguriert und führt dazu, dass die E-Mails in den Ordner mailoutput
des
XAMPP-Installationsverzeichnisses in Textdateien geschrieben werden. Wer den E-Mail-Versand zusammen mit einem E-Mail-Client
testen möchte, kann den in XAMPP integrierten E-Mail-Server Mercury nutzen, welcher zuvor eingerichtet werden muss.
Text E-Mail
Der Inhalt einer Text E-Mail ist nichts Besonderes, sie enthält eben, wie der Name schon sagt, Text. Einen Zeilenumbruch in
einer Textnachricht können Sie mittels \r\n
erzeugen. Im folgenden Beispiel haben Sie die Möglichkeit, eine
E-Mail-Adresse anzugeben und sich mit dem Klick auf den Button, eine Test-Nachricht zuschicken zu lassen:
<?php if (isset($_POST['email'])) { $kopfzeilen = "From: Homepage-Webhilfe Test <test-webseite@homepage-webhilfe.de>\r\n"; $kopfzeilen .= "To: ".$_POST['email']."\r\n"; $kopfzeilen .= "Reply-To: Homepage-Webhilfe Test <test-webseite@homepage-webhilfe.de>\r\n"; $kopfzeilen .= "Content-Type: text/plain; charset=utf-8\r\n"; $nachricht = "Hallo,\r\n\r\n"; $nachricht .= "wenn Sie diese E-Mail in Ihrem Postfach gefunden haben, dann hat der Test-Versand funktioniert.\r\n\r\n"; $nachricht .= "Mit freundlichen Grüßen\r\n"; $nachricht .= "Homepage-Webhilfe\r\n\r\n"; $nachricht .= "Diese E-Mail wurde von ".$_SERVER['REMOTE_ADDR']." versendet!"; if (mail($_POST['email'], 'Test-E-Mail von Homepage-Webhilfe', $nachricht, $kopfzeilen)) echo 'E-Mail-Versand erfolgreich!'; else echo 'E-Mail-Versand fehlgeschlagen!'; } else echo '<form method="post">E-Mail-Adresse: <input type="text" name="email" /> <input type="submit" value="Test E-Mail senden" /></form>'; ?>
HTML E-Mail
Eine HTML E-Mail unterscheidet sich von einer Text E-Mail im Großen und Ganzen nur dadurch, dass es sich beim Nachrichteninhalt
um einen HTML-Code handelt. Zusätzlich muss der Wert der Content-Type
-Eigenschaft angepasst und die
Eigenschaft MIME-Version
mit dem Wert 1.0
angegeben werden. Beim HTML-Code einer E-Mail muss
darauf geachtet werden, dass keine „neuen“ HTML-Elemente sowie CSS-Eigenschaften verwendet werden sollten. Die
meisten E-Mail-Clients haben einen sehr eingeschränkten Rendering-Engine und sperren auf Grund von Sicherheitseinstellungen
u. U. externe Inhalte (wie z. B. Bilder). Das Verwenden von aktiven Inhalten (wie JavaScript) sollte vollständig unterlassen
werden. Des Weiteren ist das Laden von Stylesheets aus dem Internet (z. B. von der eigenen Webseite) ebenfalls nicht zu
empfehlen. Einige Clients ignorieren sogar den Inhalt des head
-Elements. Die „beste“ Lösung für HTML E-Mails
scheint daher das Layouten und Designen mittels Tabellen zu sein, da dies von den meisten E-Mail-Clients korrekt
dargestellt wird. Bevor Sie also HTML E-Mails produktiv verschicken möchten, sollten Sie sich überlegen, ob sich der Aufwand
lohnt und falls ersteres der Fall ist, ausführliche Tests mit unterschiedlichen E-Mail-Clients durchführen, um „sicherzustellen“,
dass die E-Mail, bei dem der die E-Mail erhält, richtig angezeigt wird. Das folgende Beispiel funktioniert gleich wie
das von oben, verschickt jedoch eine HTML E-Mail mit einfacher Text-Auszeichnung:
<?php if (isset($_POST['email'])) { $kopfzeilen = "From: Homepage-Webhilfe Test <test-webseite@homepage-webhilfe.de>\r\n"; $kopfzeilen .= "To: ".$_POST['email']."\r\n"; $kopfzeilen .= "Reply-To: Homepage-Webhilfe Test <test-webseite@homepage-webhilfe.de>\r\n"; $kopfzeilen .= "MIME-Version: 1.0\r\n"; $kopfzeilen .= "Content-Type: text/html; charset=utf-8\r\n"; $nachricht = "<!Doctype html><html><head></head><body>"; $nachricht .= "Hallo,<br />"; $nachricht .= "wenn Sie diese <i>E-Mail in Ihrem Postfach gefunden</i> haben, dann hat der <b>Test-Versand funktioniert</b>.<br /><br />"; $nachricht .= "Mit freundlichen Grüßen<br />"; $nachricht .= "Homepage-Webhilfe<br /><br />"; $nachricht .= "Diese E-Mail wurde von ".$_SERVER['REMOTE_ADDR']." versendet!"; $nachricht .= "</body></html>"; if (mail($_POST['email'], 'Test-E-Mail von Homepage-Webhilfe', $nachricht, $kopfzeilen)) echo 'E-Mail-Versand erfolgreich!'; else echo 'E-Mail-Versand fehlgeschlagen!'; } else echo '<form method="post">E-Mail-Adresse: <input type="text" name="email" /> <input type="submit" value="Test E-Mail senden" /></form>'; ?>