8.2 Mail_Mime 

Besprochene Version: 1.2.1 | Lizenz: PHP |
Klassendatei(en): Mail/mime.php |
Eine einfache E-Mail zu versenden ist mit PHP kein Problem. Möchten Sie aber eine E-Mail im MIME-Format versenden, was zum Beispiel dann zum Tragen kommt, wenn Sie einen Dateianhang verschicken wollen, dann ist der Aufwand schon recht groß. Die korrekte Kodierung und das Einfügen von Boundaries ist nicht immer unproblematisch.
Mail_mime [Auch wenn es ein wenig ungewöhnlich ist, wird mime wirklich kleingeschrieben. Bitte beachten Sie das beim Inkludieren der Paket-Datei. ] stellt Ihnen Methoden zur Verfügung, um eine Mail entsprechend der MIME-Vorgaben korrekt aufzubauen. Allerdings sind keine Möglichkeiten zum Versand vorgesehen. Dazu können Sie die PHP-Funktion mail() nutzen oder auf PEAR::Mail zurückgreifen.
Die Konstruktor benötigt keine Parameter, Sie können ihm allerdings einen String mit auf den Weg geben, der definiert, wie der Zeilenumbruch darzustellen ist. Im RFC 2045 [http://www.faqs.org/rfcs/rfc2045.html ] ist definiert, dass ein Zeilenumbruch mit einem CRLF (ASCII-Code 13 und 10) dargestellt werden soll. Wenn Sie keinen Parameter übergeben, wird diese Zeichensequenz auch genutzt. Allerdings gibt es immer mal einen Mailserver, der eine andere Kodierung bevorzugt. Falls Sie PEAR::Mail für den Versand nutzen, sollten Sie die Zeilenumbrüche mit '\n' darstellen.
Nachdem Sie ein Mail_mime-Objekt abgeleitet haben, können Sie damit anfangen, die E-Mail zu erstellen. Die Bestandteile einer E-Mail, die nur einmal in einer E-Mail vorkommen können, werden jeweils mit Methoden hinzugefügt, die mit set beginnen. Methoden, die mehrfach aufgerufen werden können, beginnen jeweils mit add.
Der Absender wird an die Methode setFrom() übergeben, und die Betreffzeile können Sie mit setSubject() festlegen. Da eine E-Mail häufig nicht nur an einen Empfänger geschickt wird, können Sie mit den Methoden addCc() und addBcc() noch weitere Empfänger hinzufügen. Bei jedem Aufruf der Methoden kann eine E-Mail-Adresse mit in den Kreis der Empfänger aufgenommen werden. Die Bcc-Variante unterscheidet sich von der Cc-Variante dadurch, dass die Adressen der Bcc-Empfänger den anderen Empfängern nicht mitgeteilt werden.
Auch der eigentliche Inhalt der E-Mail wird mit einer solchen Methode definiert. Allerdings müssen Sie sich an dieser Stelle entscheiden, ob Sie die E-Mail im Text- oder im HTML-Format verschicken wollen. Wenn Sie Ihre Nachricht an setHTMLBody()übergeben, geht das Paket davon aus, dass es sich um eine Mail handelt, die im HTML-Format verschickt werden soll. Bitte beachten Sie, dass es sich dann um ein komplettes HTML-Dokument inklusive aller relevanten Tags handeln sollte.
Die Methode ist auch in der Lage, eine Datei einzulesen. In diesem Fall übergeben Sie als ersten Parameter den Dateinamen und als zweiten Wert true. Die Methode setTXTBody() übernimmt den übergebenen Text als Körper einer Text-E-Mail. Auch ihr können Sie den Namen einer Datei übergeben, die dann automatisch eingelesen wird. Auch hier ist als zweiter Parameter die Konstante true zu übergeben. In diesem Fall können Sie noch einen dritten Wert, der auch vom Datentyp Boolean ist, übergeben, um der Methode mitzuteilen, ob der übergebene Text an einen bestehenden Textkörper angefügt werden soll (true) oder ob der bestehende Text überschrieben wird (false), was der Standardeinstellung entspricht.
Auch das Hinzufügen von Datei-Anhängen ist kein Problem. Der Methode addAttachment() können Sie den Namen einer Datei übergeben, die dann automatisch an die E-Mail angehängt wird. Optional können Sie der Methode noch vier weitere Parameter übergeben. Der zweite Wert definiert den MIME-Type, der für die Datei genutzt werden soll. Standard ist der Typ 'application/octet-stream'. Danach können Sie den Namen angeben, unter dem die Datei in die E-Mail eingefügt werden soll. Übergeben Sie hier keinen Namen oder einen leeren String, übernimmt die Methode den Originalnamen. Übergeben Sie an erster Stelle keinen Dateinamen, sondern direkt die Daten, die angehängt werden sollen, müssen Sie an der vierten Stelle den Wert true übergeben. Mit dem letzten Parameter können Sie festlegen, wie der Dateianhang in der Mail kodiert werden soll. Üblicherweise wird hierzu eine Base64-Kodierung genutzt, die diese Methode per Default vorsieht. Die Methode unterstützt die Strings '7bit', '8bit', 'quoted-printable' oder 'base64', um die gleichnamigen Kodierungen zu selektieren. Ich würde Ihnen allerdings empfehlen, bei Base64 zu bleiben.
Beim Versand von E-Mails auf HTML-Basis können Sie Bilder auch direkt in der E-Mail darstellen. Zum Einbinden der Datei ist die Methode addHTMLImage() vorgesehen. Die Parameter sind mit denen von addAttachment() identisch, wobei Sie die Kodierung nicht selektieren können. Des Weiteren benötigen Sie in dem HTML-Code, der verschickt wird, natürlich ein <img />-Tag an der Stelle, an der die Grafik erscheinen soll. Der Name der Datei, den Sie nach src= angeben, muss mit dem Namen der Datei identisch sein, die Sie mit addHTMLImage() hinzufügen. Darüber stellt das System die Verknüpfung her.
Da Mail_mime selbst keine Mail verschicken kann, müssen Sie dazu auf PEAR::Mail oder die Funktion mail() zurückgreifen. Um die Mail nun aber versenden zu können, benötigen Sie die Header und den Körper der E-Mail. Den Körper der E-Mail können Sie mit get() auslesen. Wichtig ist, dass der Aufruf von get() vor dem Auslesen der Header erfolgen muss.
Wenn Sie E-Mail mit PEAR::Mail versenden, bietet sich die Methode headers() an. Sie gibt die Header in Form eines assoziativen Arrays zurück, so dass das Array dann an die send()-Methode von PEAR::Mail übergeben werden kann. Benötigen Sie zusätzliche Header, so können Sie diese in Form eines assoziativen Arrays an die header()-Methode übergeben. Diese Informationen werden dem zurückgelieferten Array dann eins zu eins hinzugefügt. Das Array muss jeweils den Namen des Headers als Schlüssel enthalten und auf den dazugehörigen Wert verweisen. Der Doppelpunkt, der den Namen des Headers und den Wert trennt, wird automatisch durch das System eingefügt.
Falls Sie allerdings direkt die Funktion mail() nutzen, benötigen Sie die Header in Form eines Strings. In diesem Fall bietet sich txtHeaders() an. Auch diese Methode akzeptiert ein Array mit zusätzlichen Headern, liefert die Daten aber als String zurück, der direkt an mail() übergeben werden kann.
Wenn Sie eine HTML-E-Mail verschicken, sollten Sie beachten, dass das System den Header "Content-type: text/html; charset=iso-8859–1" nicht selbstständig generiert. Dieser muss von Ihnen ergänzt werden. In Listing 8.2 finden Sie ein Beispiel, wie PEAR::Mail und Mail_mime kombiniert werden können.
require_once('Mail/mime.php'); require_once('Mail.php'); // Zeichen fuer Zeilenumbruch $eol="\n"; // Hier Ihre Daten eintragen $options = array ( 'host' => 'smtp.example.com', 'auth' => true, 'username' => 'user', 'password' => 'geheim' ); // Mail-Objekt ableiten $mailer = Mail::factory('smtp',$options); if (true === PEAR::isError($mailer)) { die ($mailer->getMessage()); } // Empfaenger-Adresse $empfaenger = 'Carsten Moehrke <cmoehrke@netviser.de>'; // Neues Mail_mime-Objekt mit Zeilenumbruch definieren $mail = new Mail_mime($eol); // Absender festlegen $mail->setFrom ('Absender <info@example.com>'); // Betreff der Mail festlegen $mail->setSubject('Test-Mail mit PEAR'); // Den Inhalt der Mail definieren // Bitte beachten Sie das img-Tag $mail->setHTMLBody('<html><body bgcolor="#006600"> <h2 style="color:white; font-family:sans-serif;">Hallo</h2> <img src="pearsmall.gif" /> </body></html>'); // Grafik hinzufuegen, die in der E-Mail gezeigt werden soll $mail->addHTMLImage('pearsmall.gif'); // Koerper der Mail auslesen $body = $mail->get(); // Zusaetzliche Header definieren $extra_header=array ('Content-type'=> 'text/html; charset=iso-8859–1', 'To' => $empfaenger); // Header ergaenzen und auslesen $headers = $mail->headers($extra_header); // Mail verschicken $res=$mailer->send($empfaenger,$headers,$body); if (true === PEAR::isError($res)) { die ($res->getMessage()); }
Listing 8.2 Versenden einer Mail mit Mail_mime und PEAR::Mail
Abbildung 8.1 Darstellung der E-Mail in Microsoft Outlook
Das Paket enthält auch noch eine Erweiterung zur Analyse von empfangenen E-Mails im MIME-Format. Da die Entwickler allerdings ausdrücklich empfehlen, andere Funktionen oder Pakete zu nutzen, werde ich diese Funktionalitäten hier nicht erläutern.