Homepage-Webhilfe Event-Banner

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.


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>';
?>
Vorschau

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>';
?>
Vorschau
Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen OK