The symfony Cookbook

eMails aus symfony verschicken

Be trained by symfony experts
Dec 10: Paris (1.1 - Francais)
Dec 10: Atlanta (1.1 - English)
Dec 17: Montreal (1.1 - Francais)
Jan 21: Paris (1.1 - Francais)
Feb 18: Paris (1.1 - Francais)
and more...

About

You are currently reading "The symfony Cookbook" which is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License license.

Search


powered by google

Chapter Content

Überblick

Installation

Konfiguration

eMail Inhalt erstellen

Eine HTML eMail versenden

Eine multipart eMail verschicken

Verschiedene Verbindungseinstellungen benutzen

Google Mail SMTP Server benutzen

Bilder einfügen

Dateianhänge

Empfängerlisten

eMails aus einem Task verschicken

Weitere Dokumentation

You are currently browsing "The symfony Cookbook" in German for the 1.1 version. Switch to another version: Switch to another language:
Creative Commons License This work is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Translation of this work into another language is explicitly allowed.

Überblick

Das Versenden von Mails ist eine Standardaufgabe vor der jeder Webentwickler einmal steht. Dank symfony 1.1 und Swift Mailer ist dies so einfach wie nie zuvor.

Swift Mailer ist eine durchdachte Klassenbibliothek welche 120% aller Mailbedürfnisse abdeckt.

Sie ist als getaggte version aus dem SVN Repository verfügbar, was verhindert, daß Projekte durch Änderungen im Swift Mailer Projekt beinflusst werdem. Die benutzte Version kann dadurch auch sehr leicht gewechselt werden.

Symfony's Art eMails zu verschicken ist recht einfach. Man erstellt ein Partial oder eine Komponente, welche dann als eMail Inhalt gerendert wird. Swift verschickt das Ergebnis dann auf die gewünschte und flexibel konfigurierbare Art.

Installation

Wenn das Projekt bereits SVN benutzt kann Swift Mailer ganz einfach über das svn:externals Property eingebunden werden:

$ cd /path/to/symfony/project
$ mkdir -p lib/vendor
$ svn propedit svn:externals .

Folgende Zeile muss dafür eingefügt werden:

swift http://swiftmailer.svn.sourceforge.net/svnroot/swiftmailer/tags/php5/3.3.3/lib/

Wenn das Projekt kein SVN benutzt kann anstelle dessen ein Checkout des gewüschten Swift Mailer Versionstags benutzt werden:

$ cd /path/to/symfony/project
$ mkdir -p lib/vendor
$ svn checkout http://swiftmailer.svn.sourceforge.net/svnroot/swiftmailer/tags/php5/3.3.3/lib/ swift

Nach dem Löschen des Caches mittels symfony cc findet das symfony Autoloading die neuen Klassen und Swift Mailer ist einsatzbereit.

Konfiguration

Es gibt keine Swift Mailer spezifische Konfigurationsdateien. Etwaige Konfiguration findet im Code statt.

Allerdings sollte man, um das Projekt flexibel zu halten, die app.yml Konfigurationsdatei benutzen um projektbezogene eMailadressen und Server zu definieren. Dadurch können in verschiedenen Umgebungen andere Versender- oder Empfängeradressen genutzt werden. Auch ist es sehr leicht bei Änderungen diese an einer Stelle zu ändern anstelle sie im kompletten Projekt suchen zu müssen (ganz getreu dem DRY Prinzip).

eMail Inhalt erstellen

Seit symfony 1.1 RC2, können Partials und Komponenten ganz einfach von einer Action aus gerendert und als Text, zum Beispiel für die eMail, verwendet werden:

$mailBody = $this->getPartial('mailBody', array('name' => 'John Doe'));
 

oder:

$mailBody = $this->getComponent('mail', 'mailBody', array('name' => 'John Doe'));
 

Eine HTML eMail versenden

Danach wird die soeben gerenderte Mail mit Swift versandt:

try
{
  // Erzeuge ein neues Swift (Verbindung) und Swift Message (eMail) Objekt
  $mailer = new Swift(new Swift_Connection_NativeMail());
  $message = new Swift_Message('Betreff als Text', $mailBody, 'text/html');
 
  // verschicken
  $mailer->send($message, $mailTo, $mailFrom);
  $mailer->disconnect();
}
catch (Exception $e)
{
  $mailer->disconnect();
 
  // weitere Fehlerbehandlung
}
 

Eine multipart eMail verschicken

Manche eMail Programme oder Anwender mögen keine HTML eMails, insofern ist es eine gute Idee eine eMail auch als "plain text" mitzuschicken. Die Kombination von HTML und Text bezeichnet man auch als Multipart.

try
{
  // Erzeuge ein neues Swift (Verbindung) und Swift Message (eMail) Objekt
  $mailer = new Swift(new Swift_Connection_NativeMail());
  $message = new Swift_Message('Betreff als Text');
 
  // Erstelle die Nachrichtenteile
  $mailContext = array('name' => 'John Doe');
  $message->attach(new Swift_Message_Part($this->getPartial('mail/mailHtmlBody', $mailContext), 'text/html'));
  $message->attach(new Swift_Message_Part($this->getPartial('mail/mailTextBody', $mailContext), 'text/plain'));
 
  // Verschicken
  $mailer->send($message, $mailTo, $mailFrom);
  $mailer->disconnect();
}
catch (Exception $e)
{
  $mailer->disconnect();
 
  // weitere Fehlerbehandlung
}
 

Verschiedene Verbindungseinstellungen benutzen

Bei der Erstellung ders Swift Objektes können verschiedene Swift_Connection Objekte übergeben werden welche zur Konfiguration des Mail Servers dienen.

Google Mail SMTP Server benutzen

Einen gmail Zugang zum Versand von eMails zu benutzen bietet eine Reihe von Vorteilen?

Allerdings existieren folgende Beschränkungen

Bei Benutzung von gmail muss das Swift Objekt wie folgt konfiguiert werden:

$connection = new Swift_Connection_SMTP('smtp.gmail.com', 465, Swift_Connection_SMTP::ENC_SSL);
$connection->setUsername('romain@gmail.com');
$connection->setPassword('SuperSecurePassword');
 
$mailer = new Swift($connection);
 

Bilder einfügen

Um Bilder in eMails einzufügen müssen eMail relative URLS von den einzufügenden Objekten erstellt werden bevor der Inhalt gerendert werden kann. Das folgende Beispiel illustriert dies:

// Erzeuge ein neues Swift (Verbindung) und Swift Message (eMail) Objekt
$mailer = new Swift(new Swift_Connection_NativeMail());
$message = new Swift_Message('Test mail subject');
 
// Eingebettete Bilder
$images = array();
$images['symfony'] = new Swift_Message_Image(new Swift_File(sfConfig::get('sf_web_dir').'/images/symfony.gif'));
$images['swift']   = new Swift_Message_Image(new Swift_File(sfConfig::get('sf_web_dir').'/images/swift.jpg'));
 
$imageReferences = array();
foreach ($images as $name => $image)
{
  $imageReferences[$name] = $message->attach($image);
}
 
// Erstelle die Nachrichtenteile
$mailContext = array('name' => 'John Doe', 'images' => $imageReferences);
$message->attach(new Swift_Message_Part($this->getPartial('mail/mailHtmlBody', $mailContext), 'text/html'));
$message->attach(new Swift_Message_Part($this->getPartial('mail/mailTextBody', $mailContext), 'text/plain'));
 
// Versenden
$mailer->send($message, $mailTo, $mailFrom);
$mailer->disconnect();
 

In dem Partial / in der Komponente können die eingebetteten Bilder ganz leicht mittels folgendem Codes angezeigt werden:

<img src="<?php echo $images['symfony']; ?>" alt="Symfony Project" />
<img src="<?php echo $images['swift']; ?>" alt="Swift Mailer" />

Dateianhänge

Dateien an eMails anzuhängen ist ebenfalls sehr einfach:

$message->attach(new Swift_Message_Attachment(new Swift_File($file), $filename, $mime_type));
 

Empfängerlisten

Oft soll eine eMail an mehrere Empfänger gehen. Dabei wird zwischen Empfängern (to), Kopien (cc) und Blindkopien (bcc), welche für andere Empfänger nicht sichtbar sind, unterschieden. Dies kann mit der Swift_RecipientList konfiguriert werden.

$recipients = new Swift_RecipientList();
$recipients->addTo($to);
$recipients->addCc($cc);
$recipients->addBcc($bcc);
 

Allerdings muss darauf geachtet werden die $recipients Liste mittels ->flush() zu leeren wenn in einer Schleife e-Mails verschickt werden sollen, da andernfalls die vorherigen Empfänger noch in der Liste enthalten sind und so doppelte oder falsch adressiere eMails versandt werden.

eMails aus einem Task verschicken

Aus Tasks können eMails genau wie aus Actions versandt werden. Allerdings kann das rendering der Action nicht mehr direkt benutzt werden.

Anstatt der sfAction::getPartial() und sfAction::getComponent() Methoden müssen die get_partial() und get_component() Funktionen aus dem PartialHelper verwendet werden.

Weitere Dokumentation

Auf der SwiftMailer Webseite finden sich eine gute Dokumentation und verständliche Tutorials.

Ausserdem ist die vollständige API Referenz verfügbar.

Questions & Feedback

If you find a typo or an error, please register and open a ticket.

If you need support or have a technical question, please post to the user mailing-list or to the forum.