PHP rocks! wünscht allen Mitgliedern einen guten Rutsch ins neue Jahr 2017 !!!
Hinweis: Das Forum zieht um! Um keine Datenverluste zu haben, schalten wir zwecks Übernahme der Daten das Forum am Sonntag, den 24.04.2016 um ca. 21:00 Uhr offline und passen anschliessend die DNS-Einträge an.
www.php-rocks.de wird euch dann nach den Aktualisierungen der DNS-Server wieder wie gewohnt uneingeschränkt zur Verfügung stehen.
Danke für euer Verständnis!

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
PHP & E-Mail HTML Mail versenden mit PHPMailer
#1
HTML E-Mail mit dem PHPMailer versenden
Eine Mail mit PHP-Boardmitteln zu versenden kann schnell echte Probleme bereiten. Das liegt nicht zwingend an der mail()-Funktion selbst, die PHP bietet, sondern eher daran, daß man selber verantwortlich für die korrekte Formatierung nach RFC-Standards ist. RFC's ( Request For Comments ) beschreiben den Aufbau einer Mail und die Verbindung zum Mail-Server. Um eine Mail selbst zu versenden benötigen wir Kenntnisse über folgende RFC's: Wie jeder sehen kann, ist das eine Menge Stoff, nur um eine Mail zu senden.
Aber halten wir uns nicht daran oder richten uns zumindest danach, geht der Mail-Versand ganz schnell schief. Im schlimmstem Fall werden wir sogar als SPAM gewertet und landen auf einer Blacklist.

Damit das nicht passiert und wir problemlos RFC-konforme Mails senden können, gibt es Mailerklassen, die uns die ganze Arbeit abnehmen.
Eine von den bekannteren ist der PHPMailer, mit dem wir uns hier kurz befassen wollen.
Hinweis
Natürlich gibt es nicht nur den PHPMailer. Wer bspw. lieber den SwiftMailer einsetzen möchte, sollte sich das äquivalente Tutorial zu dieser Mailer-Klasse ansehen: HTML E-Mails versenden mit dem SwiftMailer

Wie implementiere ich PHPMailer?
Tipp
Der folgende Abschnitt erklärt das Einbinden des PHPMailer Version 5. Es ist zu empfehlen, aktuell die Version 6 zu verwenden. Download: https://github.com/PHPMailer/PHPMailer/archive/master.zip
Wie das Einbinden mit der Version 6 auf ähnlich einfache Weise funktioniert, habe ich hier beschrieben: PHPMailer Version 6 erfolgreich einbinden
Nachdem ihr wie dort beschrieben die Version 6 erfolgreich eingebunden habt, ist die grundlegende Handhabung wieder gleich, so dass ihr beim nächsten Abschnitt ( "Wie verwende ich das jetzt?" ) fortfahren könnt
Aus dem Package, das wir hier ( Achtung: Version 6! siehe Tipp oben ) runterladen können, benötigen wir zum Versand nur die class.phpmailer.php und class.smtp.php, da wir unsere Mails direkt über SMTP versenden wollen. Das Package enthält zusätzlich eine Datei PHPMailerAutoload.php, die dafür sorgt, daß die von uns genutzte Klassen automatisch geladen werden.
Diese drei Dateien legen wir auf unserem Webspace in einem beliebigen Verzeichnis ab. Für unser Beispiel nennen wir das Verzeichnis phpmailer/.
Das war alles, was an Vorbereitung notwendig ist.

Wie verwende ich das jetzt?
Die Verwendung ist im Prinzip ganz einfach. Zunächst müssen wir den Autoloader einbinden und direkt eine Instanz des PHPMailer erstellen:
PHP-Code:
include_once 'phpmailer/PHPMailerAutoload.php'// Hinweis für die Version 6, einen Abschnitt zuvor beachten !!!
$oMailer = new PHPMailer;
$oMailer->CharSet 'UTF-8'
Hinweis
Um keine CharsetEncoding-Fehler zu bekommen, teilen wir dem PHPMailer-Objekt direkt nach der Instanziierung über die Eigenschaft CharSet mit, dass wir UTF-8 verwenden.
Dies muss zwingend direkt nach der Instanziierung stattfinden, da ansonsten bereits Mail-Header geschrieben sein könnten.
Und schon sind wir vorbereitet und können loslegen. Als erstes sollten wir die für das SMTP-Protokoll erforderlichen Parameter setzen:
PHP-Code:
// SMTP aktivieren
$oMailer->isSMTP();

// SMTP-Server
$oMailer->Host 'smtp.example.com';

// SMTP Authentifizierung aktivieren
$oMailer->SMTPAuth true;

// SMTP Benutzer
$oMailer->Username 'phprocks@example.com';

// SMTP Benutzer Passwort
$oMailer->Password 'foobar';

// Verbindungssicherheit setzen ( SSL und TLS möglich )
$oMailer->SMTPSecure 'tls';

// Verbindungsport festlegen
$oMailer->Port 587
Den SMTP-Benutzer benötigen wir, um uns am Mailserver zu authentifizieren, sofern erforderlich. Diese Daten sollten wir kennen oder über unseren Provider in Erfahrung bringen.
Damit ist unsere Verbindung festgelegt und wir kümmern uns um die wichtigsten Header-Daten. Hier legen wir den/die Empfänger und Absender-Daten fest.
PHP-Code:
// Absender Adresse setzen
$oMailer->From 'phprocks@example.com';

// Absender Alias setzen
$oMailer->FromName 'PHProcks!';

// Empfänger Adresse und Alias hinzufügen
$oMailer->addAddress'max.mustermann@example.com''Max Mustermann' ); 
Die wichtigsten Einstellungen sind nun vorgenommen, es fehlen nur noch der Betreff und der Nachrichteninhalt. Da wir eine HTML-Mail versenden wollen, müssen wir dies unserem Objekt "mitteilen":
PHP-Code:
// HTML aktivieren
$oMailer->isHTMLtrue );

// Betreff
$oMailer->Subject 'PHProcks! Tutorials - less time to learn more';

// Der Nachrichteninhalt als HTML
$oMailer->Body '<h1>PHProcks!</h1><h2>Tutorial: HTML E-Mail senden mit PHPMailer</h2>';

// Alternaiver Nachrichteninhalt für Clients, die kein HTML darstellen
$oMailer->AltBody strip_tags$oMailer->Body ); 

Hinweis
Für die Clients, die kein HTML darstellen, nutzen wir hier der Einfachheit halber die Funktion strip_tags(). Im produktiven Fall sollte hier allerdings die alternative Nachricht für reine Text-Mails hinterlegt werden.

Wir haben unsere Mail mit Hilfe des PHPMailer nun aufgebaut und können diese versenden. Der PHPMailer kümmert sich dabei um den korrekten Aufbau nach RFC.
Sinnvollerweise möchten wir gerne erfahren, ob die Übergabe an den SMTP-Server funktioniert hat. Dazu prüfen wir den Rückgabewert der send()-Methode:
PHP-Code:
if ( !$oMailer->send() ) {

 
   echo 'Something\'s went wrong!';
 
   exit;

}

echo 
'Yes! First Mail with PHPMailer sent successfully!'

Zusammenfassung
Wie wir gesehen haben, ist es gar nicht so kompliziert, eine HTML-Mail sauber zu versenden, auch ohne großartig professionelle Kenntnisse zu besitzen.
Um den Kern unseres Beispiels im Überblick zusammenzufassen, hier nochmal der gesamte Beispielcode ohne Kommentare und unnötige Formatierungen:
PHP-Code:
include_once 'phpmailer/PHPMailerAutoload.php';
$oMailer = new PHPMailer;
$oMailer->CharSet 'UTF-8';

$oMailer->isSMTP();
$oMailer->Host 'smtp.example.com';
$oMailer->SMTPAuth true;
$oMailer->Username 'phprocks@example.com';
$oMailer->Password 'foobar';
$oMailer->SMTPSecure 'tls';
$oMailer->Port 587;

$oMailer->From 'phprocks@example.com';
$oMailer->FromName 'PHProcks!';
$oMailer->addAddress'max.mustermann@example.com''Max Mustermann' );

$oMailer->isHTMLtrue );
$oMailer->Subject 'PHProcks! Tutorials - less time to learn more';
$oMailer->Body '<h1>PHProcks!</h1><h2>Tutorial: HTML E-Mail senden mit PHPMailer</h2>';
$oMailer->AltBody strip_tags$oMailer->Body );


if ( !
$oMailer->send() ) {

 
   echo 'Something\'s went wrong!';
 
   exit;

}

echo 
'Yes! First Mail with PHPMailer sent successfully!'
Hinweis
In diesem Tutorial verwenden wir das SMTP-Protokoll, um die E-Mails mit dem PHPMailer zu versenden. Voraussetzung dafür ist immer ein gültiger und korrekt konfigurierter SMTP-Account bei einem entsprechenden Anbieter. Wer dies nicht hat, oder es zu Problemen kommt, wenn ihr E-Mails darüber versendet, kann den PHPMailer auch ohne SMTP verwenden. Dazu müssen einfach diese SMTP-Methoden und Eigenschaften weggelassen werden:
PHP-Code:
$oMailer->isSMTP();
$oMailer->Host 'smtp.example.com';
$oMailer->SMTPAuth true;
$oMailer->Username 'phprocks@example.com';
$oMailer->Password 'foobar';
$oMailer->SMTPSecure 'tls';
$oMailer->Port 587
Der PHPMailer nutzt dann als Fallback die PHP interne mail() Funktion. Dadurch, dass der PHPMailer die Daten bzw. die Mail weitesgehend RFC konform vorbereitet, ist dies für Einsteiger immer noch die deutlich bessere Variante, als mail() ohne Kenntnisse roh zu verwenden!
Hinweis
Alternativ zum PHPMailer gibt es noch SwiftMailer. Der SwiftMailer ist zwar etwas komplexer wie PHPMailer, aber ebenso einfach verwendbar und meine persönliche Empfehlung.
Ein kurzes Tutorial darüber findet ihr hier: HTML E-Mails versenden mit dem SwiftMailer


Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  [PHP & E-Mail] PHPMailer Version 6 erfolgreich einbinden Arne Drews 0 18.773 31.01.2018, 01:38
Letzter Beitrag: Arne Drews
  [PHP & E-Mail] HTML E-Mails versenden mit dem SwiftMailer Arne Drews 0 19.715 21.02.2016, 23:00
Letzter Beitrag: Arne Drews

Gehe zu: