Artikelformat

Schreib mal wieder

Diesen Slogan nutze die Post in meiner Jugend. Inzwischen werden statt Briefe eher Emails verschickt und das wollen wir jetzt auch mal mit PHP machen. Eine Mail mit PHP zu versenden ist grundsätzlich einfach. Man benutzt einfach die mail-Funktion. Diese ist aber nicht ganz so übersichtlich und es ist auch nicht so einfach eine schöne Email zusammenzubauen, die Anhänge und sowohl Html als auch Plain-Text enthält. Um diese Erstellung zu vereinfachen existieren einige Bibliotheken. Beispielhaft schauen wir uns Swiftmailer an.

Swiftmailer ist eine Bibliothek die objektorientiert entwickelt wurde. Die Hauptbestandteile sind eine Message, ein Transport und der Mailer. Man baut sich also eine Email zusammen, erstellt sich einen Transport und sendet die Email über den Transport. Der letzte Schritt wird vom Mailer übernommen. Das Erstellen einer Email funktioniert auf 2 mögliche Arten. Entweder herkömmlich durch den Aufruf diverser Setter, die auf einem Swift_Message Objekt arbeiten oder man nutzt das Fluent Interface und kann die Methoden verketten (Chaining).

1
2
3
4
5
6
7
8
9
10
11
12
// Message Objekt erzeugen
$message = Swift_Message::newInstance();
// Subjekt setzen
$message->setSubject("PM Test");
// Mail Text setzen (hier in Html)
$message->setBody("<i>Dies</i> ist ein <u>Test</u>","text/html");
// alternativen Mailtext hinzufuegen (hier Plaintext)
$message->addPart("Dies ist ein Test","text/plain");
// Absender setzen
$message->setFrom("[email protected]");
// Empfaenger setzen
$message->setTo("[email protected]");

Um einen Dateianhang hinzuzufügen bietet Swiftmailer die Swift_Attachment-Klasse an. Damit lassen sich Dateien und auch Daten aus einer Variable als Anhang in ein Swift_Message-Objekt integrieren. Wenn man das obige Beispiel in der Fluent Interface Variante nutzt sieht das dann so aus:

1
2
3
4
5
6
7
8
$message2 = Swift_Message::newInstance()
    ->setSubject("PM Test 2")
    ->setBody("<i>Dies</i> ist ein <u>Test</u>","text/html")
    ->addPart("Dies ist ein Test","text/plain")
    ->attach(
          Swift_Attachment::fromPath("run.php", "text/plain")->setFilename("test.php"))
    ->setFrom("[email protected]")
    ->setTo("[email protected]");

Die generierte Email kann man als String ausgeben. So hat man auch die Möglichkeit zu kontrollieren, ob die Mail das gewünschte Ergebnis liefern wird.

1
echo $message->toString();

Diese Mail soll nun auch noch verschickt werden. Hierfür benötigt man zuerst einen Transport. Beispielhaft ist hier der Swift_SmtpTransport vorgestellt. Interessant an dieser Sache ist, dass man den Transport bspw per Dependency Injection einbinden und somit sehr einfach wechseln kann – falls notwendig.

1
2
3
$transport = Swift_SmtpTransport::newInstance('smtphost', 25)
  ->setUsername('username')
  ->setPassword('password');

Jetzt muss man Transport und Message nur noch verbinden, um die Email auch zu versenden. Dies übernimmt die Swift_Mailer-Klasse. Der Mail-Versand kann dann mit einer einfachen Zeile realisiert werden.

1
$mailer = Swift_Mailer::newInstance($transport)->send($message);

Weitere Informationen findet man in der recht ordentlichen Doku des Swiftmailers.

3 Kommentare

    • Hm, phpmailer hatte ich noch nicht bewusst registriert. Ich hatte Kontakt mit Pear::Mail. Diese Bibliothek konnte mich nicht so ganz überzeugen, da ich die Array-Konfiguration nicht mochte. Auch ist das ganze zu PHP4.

      Wenn die Beispiele der phpmailer Seite repräsentativ für die Nutzung sind, kann ich dir einen Unterschied bereits nennen. Beim Swiftmailer sind die einzelnen Komponenten einer Mail auch entsprechend in Klassen aufgeteilt. Die Beispiele vom phpmailer zeigen immer ein Objekt, das mit sämtlichen Informationen gefüllt wird. Wenn man den Transportweg mal eben ändern will muss man im schlimmsten Fall jede Stelle, an der eine Email gebaut wird, anfassen. Beim Swiftmailer kann man einfach eine Transport-Factory nutzen und diese anpassen. OOP ist somit beim Swiftmailer effektiver genutzt. Zumindest ist das mein Eindruck nach einem kurzen Blick in die Beispiele.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.