Mai
28

Zend_Mail Filestream

Um Zend_Mail zu testen benötigt man keinen Online Mailserver oder einen Webserver auf seinem lokalen Entwicklungssystem. Warum nicht mit einem Transporter arbeiten, der einem die versandten E-Mails in eine Datei schreibt? Und genau das stelle ich hier vor.

Man benötigt zuerst in seiner Library den Transporter

class Zorta_Mail_Transport_File extends Zend_Mail_Transport_Abstract
{
        public function _sendMail()
        {
                $file = APPLICATION_PATH . "/../logs/mails.log";
                $fp = fopen($file, 'a');
                fwrite($fp, $this->header);
                fwrite($fp, "\r\n");
                fwrite($fp, $this->body);
                fwrite($fp, "\r\n\r\n\r\n#############################################################\r\n\r\n\r\n");
                fclose($fp);
        }
} 

Mit diesem Transporter ist es schon fast erledigt. Was wird hier getan? Ganz einfach. Es gibt ein Verzeichnis logs und darin eine Datei mail.log. Diese öffnet der Transporter und gibt den Header und den Body hinein. Mehr Daten benötigt man normalerweise nicht. Falls doch, so kann man den Transporter durchaus erweitern. Zum Beispiel um die Anhänge einer E-Mail usw.

Um nun automatisiert den Transporteu zuzuordnen kann man in der Bootstrap den folgenden Code verwenden.

protected function _initMail()
    {
        if(APPLICATION_ENV == "development")
        {
            $mail_transport = new Zorta_Mail_Transport_File();
            Zend_Mail::setDefaultTransport($mail_transport);
        }
        else
        {
            $mail_conf = Zend_Registry::get('CONFIG')->mail;

            $config = array('auth' => 'login',
                			'username' => $mail_conf->smtp->user,
                			'password' => $mail_conf->smtp->pass);

            $mail_transport = new Zend_Mail_Transport_Smtp($mail_conf->smtp->host, $config);
            Zend_Mail::setDefaultTransport($mail_transport);
        }

    }

Es wird geprüft, ob man im Entwicklungsstadium ist. Die Konstante “APPLICATION_ENV” beinhaltet dies. Wenn man sich in Entwicklung befindet, dann greift er auf den, so eben erstellten, Datei Transporter zu. Ansonsten wird auf den SMTP Transporter zugegriffen. Wie man die Konfiguration des SMTP Transporters initalisiert ist einem selbst überlassen, daher gehe ich hier nicht weiter auf das obige Beispiel ein. Mittels der Methode “setDefaultTransport” wird für das Zend_Mail global der Transporter gesetzt.

Wenn man nun eine E-Mail erstellt und versendet landet sie in angegebener Textdatei und sieht in etwa so aus:

From: Zorta Dateiemail <test@zorta.de>
To: Alberto <denis_zunke@gmx.de>
Subject: Testnachricht
Date: Thu, 28 May 2009 21:51:40 +0200
Content-Type: multipart/alternative; charset="UTF-8";
 boundary="=_5e42e31ef1a7fb8fe32142a32f672f11"
MIME-Version: 1.0

--=_5e42e31ef1a7fb8fe32142a32f672f11
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Textinhalt

--=_5e42e31ef1a7fb8fe32142a32f672f11
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<b>HTML INHALT</b>

--=_5e42e31ef1a7fb8fe32142a32f672f11--

Kommentar schreiben