14.3 Weitere Möglichkeiten 

In diesem Kapitel haben Sie den Umgang mit der Mail-Komponente kennengelernt. Neben dem Versand von einfachen E-Mails mittels der ezcMailMtaTransport-Klasse haben Sie gelernt, wie Sie eine Verbindung zu einem SMTP-Server direkt herstellen, um E-Mails zu versenden. Auch komplexere E-Mail-Strukturen waren Thema in diesem Kapitel im Zusammenhang mit der Verarbeitung empfangener E-Mails. Sie haben gesehen, welche Bestandteile eine geparste E-Mail enthalten kann und was diese bedeuten.
14.3.1 IMAP-Flags 

Die Benutzung von Flags mit dem IMAP-Transporter haben Sie im letzten Abschnitt schon kurz kennengelernt, als die zur Löschung markierten E-Mails explizit bereinigt wurden. Innerhalb des IMAP-Servers bedeutet eine Markierung zum Löschen nichts anderes, als dass die betroffene E-Mail mit dem Flag DELETED markiert wird.
Flags dienen dazu, den Status einer E-Mail im Postfach des Servers zu beschreiben. Dadurch, dass IMAP – im Gegensatz zu POP – für die Online-Aufbewahrung von E-Mails konzipiert wurde, ist es nötig festzuhalten, ob eine E-Mail noch neu ist oder bereits gelesen (SEEN) wurde. Es existiert eine Vielzahl weiterer Flags wie DRAFT, um einen Entwurf zu kennzeichnen, oder ANSWERED für bereits beantwortete E-Mails.
Mit Hilfe dieses Flag-Systems ist es möglich, dass Ihr E-Mail-Client auch bei E–Mails, die auf einem IMAP-Server lagern, korrekt den Status anzeigt, wie Sie es gewohnt sind. Auch in der Mail-Komponente können Sie mit diesen Flags arbeiten und diese manipulieren.
Die Methode fetchByFlag() erlaubt es Ihnen, nur E-Mails, bei denen ein bestimmtes Flag gesetzt ist, abzurufen. So würde der Aufruf $srv->fetchByFlag( 'DELETED' ); alle E-Mails zurückliefern, die zuvor zum Löschen markiert wurden, bisher aber noch nicht durch einen Aufruf von expunge() endgültig vernichtet wurden. Übergeben Sie der Methode fetchFlags() ein Array von Nachrichten-Nummern, erhalten sie ein Array zurück, das für jede dieser Nachrichten die Menge ihrer Flags beschreibt. Schließlich können Sie setFlag() mit einer Nachrichten-Nummer und einem Flag-Namen aufrufen, um ein Flag explizit zu setzen.
Weitere Methoden zum Umgang mit Flags wie clearFlags(), um alle Flags einer Nachricht zurückzusetzen, stehen außerdem bereit und sind in der Dokumentation beschrieben.
14.3.2 IMAP-Postkästen 

Ein weiteres Konzept, das nur in IMAP-Servern zu finden ist, ist das Bereithalten mehrerer Postfächer unter einem Benutzer-Account. Sie erinnern sich, dass in Abschnitt 14.2.2, »E-Mail-Empfang«, zunächst ein Postfach selektiert werden musste, um den Empfang von E-Mails zu ermöglichen. In der passenden Konfigurationsdatei email.ini wurde vorher der Name für diese Mailbox definiert: Inbox. In diesem speziellen Postkasten landen standardmäßig neue E-Mails.
Allerdings wird es Benutzern von IMAP-Accounts meist ermöglicht, dass sie eigene Mailboxen erstellen und E-Mails sortieren dürfen. Manche E-Mail-Clients stellen diese Struktur sogar als verschachtelten Ordnerbaum dar, obwohl diese Darstellung eigentlich nicht ganz korrekt ist.
Der IMAP-Transporter bietet Ihnen entsprechende Möglichkeiten, mit Mailboxen auf IMAP-Servern umzugehen. Neben der Methode selectMailbox(), die bereits vorher in diesem Kapitel zur Auswahl eines bestimmten Postfachs verwendet wurde, gibt es noch weitere nützliche Methoden zu Postfächern: listMailboxes() gibt Ihnen eine Liste aller verfügbaren Postfächer zurück und erlaubt Ihnen, ähnlich der Platzhaltersuche im Dateisystem, Suchkriterien zu definieren, nach denen die Postkästen gefiltert werden sollen.
Die Methoden createmailbox() und deletemailbox() dienen zum Erstellen eines neuen beziehungsweise zum Löschen eines bestehenden Postfachs. Weiterhin können Sie, was bei POP-Servern ebenfalls nicht möglich ist, E-Mails auf den Server hochladen und mit der Methode append() einer Mailbox hinzufügen. Der Befehl copyMessage() erlaubt es Ihnen, Kopier- und Verschiebe-Operationen direkt auf dem Server auszuführen, ohne die betroffene E-Mail vorher heruntergeladen zu haben.
14.3.3 Zeichencodierungen 

In Abschnitt 14.2.2, »E-Mail-Empfang«, sind wir stillschweigend davon ausgegangen, dass der extrahierte Text aus einer E-Mail in UTF-8-Codierung vorliegt, denn alle Daten des GP-Blogs sind in dieser Codierung gespeichert. Und das zu Recht, denn der ezcMailParser stellt E-Mails standardmäßig in dieser Codierung bereit. Liegt eine E-Mail mit einer anderen Zeichencodierung vor, verwendet das Parser-Objekt die Klasse ezcMailCharsetConverter zur Konvertierung. Diese stellt bereits eine Methode bereit, welche die PHP-Erweiterung ext/iconv [http://php.net/iconv ] zur Konvertierung des Zeichensatzes verwendet.
Ist diese Erweiterung bei Ihnen nicht installiert oder wollen Sie alternative Methoden der Konvertierung bereitstellen, so können Sie die zur Konvertierung verwendete Funktion oder Methode selbst bestimmen. Der statische Aufruf
ezcMailCharsetConverter::setConvertMethod(
array( 'myConverterClass', 'convertToUtf8' )
);Listing 14.16 Konvertierungsfunktion ändern
bestimmt die Methode convertToUtf8() auf der Klasse myConverterClass zur Konvertierung.
Die von Ihnen implementierte Methode erhält als Parameter den zu konvertierenden Text, weiter wird der Name des aktuellen Zeichensatzes übergeben. Dabei ist zu beachten, dass die Mail-Komponente auch zwei spezielle Zeichensätze namens unknown-8bit für eine nicht erkannte 8-Bit-Codierung und x-user-defined für eine benutzerdefinierte Codierung, die nicht erkannt werden konnte, benutzt. Die ursprüngliche Konvertierungsfunktion behandelt diese Codierungen wie die amerikanische Standardcodierung Latin. Wie Sie in Ihrer Konvertierungsmethode damit umgehen, bleibt Ihnen selbst überlassen.
14.3.4 Kleine Helferlein 

Die Mail-Komponente beinhaltet außerdem eine sehr praktische Klasse, die eine Sammlung kleiner Helfer-Methoden bereitstellt: ezcMailTools. Während die meisten ihrer verfügbaren Methoden für interne Einsatzzwecke bestimmt sind, können Ihnen einige dennoch nützlich sein.
Die Methoden composeEmailAddress() und composeEmailAddresses() erhalten ein Objekt vom Typ ezcMailAddress beziehungsweise ein Array solcher Objekte und geben einen RFC-entsprechenden String zur Repräsentation der E-Mail-Adressen zurück, der zum Senden einer E-Mail verwendet werden kann. Ebenfalls eher für den internen Einsatz gedacht sind die Methoden generateContentId() und generateMassageId(), welche eine eindeutige Content-ID für einen bestimmten E-Mail-Bestandteil beziehungsweise eine eindeutige Message-ID für eine E-Mail generieren.
Auch die Methoden guessContentType() zum Erraten des Inhaltstyps einer Datei, lineBreak() für einen einzelnen Zeilenumbruch und mimeDecode() zur Decodierung eines E-Mail-Bestandteils dürften für Sie von nachrangiger Bedeutung sein.
Hingegen kann es passieren, dass Sie einen Anwendungsfall für die Methoden parseEmailAddress() und parseEmailAddresses() finden. Zwar sind diese Methoden darauf ausgerichtet, eine oder mehrere E-Mail-Adressen aus dem Quellcode einer E-Mail heraus zu parsen; doch ebenso kann auch ein normaler E–Mail-Adress-String damit konvertiert werden kann. Der Methodenaufruf
$addresses = ezcMailTools::parseEmailAddresses(
'Tobias Schlitt <toby@php.net>, Kore Nordmann <kore@php.net>'
);Listing 14.17 E-Mail-Adressen parsen
würde also ein Array mit zwei Objekten vom Typ ezcMailAddress erzeugen, jeweils mit korrekten Namen und E-Mail-Adressen.
Eine weitere praktische Methode ist replyToMail(). Diese Methode erhält zunächst ein E-Mail-Objekt als Parameter sowie ein E-Mail-Adressobjekt. Aus beiden erzeugt die Methode eine Antwort auf die übergebene E-Mail mit der übergebenen Absenderadresse. Alle benötigten Header werden erzeugt, zum Beispiel zur Referenzierung der ursprünglichen E-Mail durch Ihre Message-ID. Optional können Sie als dritten Parameter die Konstante ezcMailTools::REPLY_ALL übergeben, was einem Druck auf den Knopf Reply-All in Ihrem E-Mail-Client gleichkommt. Der Standardwert hier ist REPLY_SENDER, um nur dem ursprünglichen Absender zu antworten. Der vierte Parameter bestimmt optional das Präfix für den Betreff der Antwort-E-Mail; der Standardwert ist hier das altbekannte 'Re:'.




Ihre Meinung






