Möglichkeit 1: Debug-Einstellung setzen
Eine einfache Möglichkeit, um das Versenden von Emails in CakePHP 2.x zu testen, ist die Debug-Einstellung der Email Konfiguration. Dabei genügt das Setzen der Transport-Einstellung auf ‘Debug’ und schon wird der Inhalt der Email an der entsprechenden Stelle angezeigt:
<?php // app/Config/email.php class EmailConfig { public $default = array( 'transport' => 'Debug', // ...
Dies funktioniert allerdings nur, wenn man sich die Ausgabe des aufgerufenen Scripts anzeigen lassen kann. Bei Cronjobs beispielsweise wird dies schon schwieriger.
Möglichkeit 2: eine eigene Transport-Klasse verwenden
Verwendet man eine eigene Transport-Klasse, dann lassen sich für Debug-Zwecke alle Emails an beliebiger Stelle ausgeben, abspeichern oder die Inhalte der Email uneingeschränkt weiterverarbeiten. Im nachfolgenden Beispiel sollen dazu alle Emails an eine vorher festgelegte Email-Adresse gesendet werden. Dies ermöglicht ein Debuggen aller Emails unabhängig vom Aufruf (Cronjob, HTTP-Request, …), da diese richtig versendet werden.
Die Verwendung einer eigenen Transport-Klasse ist ganz simpel. Im folgenden wird die eigene Transportklasse mit Beta
benannt. Man erstellt sich eine Datei BetaTransport.php
, speichert diese unter app/Network/Email/BetaTransport.php
ab und füllt die Datei mit folgendem Inhalt:
<?php // app/Network/Email/BetaTransport.php App::uses('AbstractTransport', 'Network/Email'); class BetaTransport extends AbstractTransport { public function send(CakeEmail $email) { // EmailTransport for beta tests. Send all emails to webmaster. $email->subject('[BETA to: '.array_shift($email->to()).'] '.$email->subject()); $email->to('webmaster@example.com'); // Send email $email->transport('Mail'); return $email->send(); } }
Die Klasse BetaTransport
überschreibt nun den Empfänger der ursprünglichen Email und setzt diesen (für Debug-Zwecke) in den Betreff der Email. Die Transportklasse ist einsatzbereit, sobald diese in der Email-Konfiguration aktiviert wird:
<?php // app/Config/email.php class EmailConfig { public $default = array( 'transport' => 'Beta', // ...
Ich verwende mit meiner EmailLib (http://www.dereuromark.de/2012/03/30/introducing-the-emaillib/) den automatischen Ansatz. Sobald der Debug modus an ist (>0), gehen die mails nicht mehr raus, sondern werden weggeloggt (in /logs/email_trace.log). Aber Transport-Klassen sind ein schöner neuer Weg, dies zu ermöglichen 🙂