2007-09-20

Outlook, Emails und der tägliche Wahnsinn

Gestern und heute morgen habe ich ja “kurz” über ein paar Kleinigkeiten berichtet, die mich derzeit im Tagesgeschäft beschäftigt haben. Jetzt nehm ich mir auch mal die Zeit, und geh auf die eigentliche Ursache der Probleme und die schliesslichen Lösungsansätze mal näher ein. Denn ich kann meinen Arsch darauf verpfänden, das wir darüber nochmal stolpern werden :D.

Die Situation war (oder ist), das ein, im Rahmen eines Kundenprojektes, regelmässiger Versand von Emails angestossen werden soll. Diese Emails bestehen aus einer einfachen Plain-Text Nachricht, einer überlangen (20 bis >100 Zeichen) Betreffszeile sowie einen Dateianhang, der ebenfalls einen überlangen Namen besitzt.

Angestossen wird dieser Service über eine nette, kleine PHP Konstruktion auf Kommandozeilenebene.

Da wir CakePHP im Bereich Webanwendungen hierfür nutzten, haben wir dieses auf den Einsatz auf der Kommandozeile etwas getrimmt, damit wir die Bequemlichkeit sowie einigen Programmcode (Komponenten, Models, Vendors) weiter nutzen konnten. Da nur die Pfade in dem auszuführende Skript angepasst und der Dispatcher umgangen werden musste, war das schnell gemacht.

Zum erstellen und versenden von Emails über CakePHP nutzen wir die SwiftMail-Komponente, die auf die bewährte Swiftmail-Bibliothek aufsetzt. Bis auf den, meiner Ansicht nach gravierenden, Bug, das der Controller im Startup-Event (CakePHP Component) als Referenz übergeben wird, ist das eigentlich eine sehr sexy und bequeme Form valide Emails (inkl. Header, Mimetype, etc) zu erstellen und zu verschicken.

Bis gestern.

Vorneweg, das Problem liegt nur indirekt bei Swift! ;)

Gestern sass ich Honk also vor Outlook und hab dort das erste mal die verschickten Emails begutachtet. (dafür das der beschriebene Service bisher noch nie auf einem größeren Testsystem lief, lief er super. … bis auf Outlook).

Was hat mich also da umgehaun? Nun, 2 Sachen:

  1. die angehangene Datei in einer Email bekam plötzlich ein “.dat” an den Dateinamen angehangen

  2. die angehangene Datei in einer Email bekam nach dem fixen von 1) ein “.txt” an den Dateinamen angehangen ;)

Krabelkäfer Nummer 1) war relativ schnell lokalisiert. Bei dem Dateinamen (der aus einer externen Property-Datei kam) hat sich ein Zeilenumbruch reingeschlichen. Aus die Maus.

Doch jetzt wurde es knifflig. Ein “.txt”-Anhang. Wie, was, wo, wann. Zunächst hab ich erstmal geschaut, ob das bei jeder Datei auftrat. War nicht so. Ich fand einen Fall, bei dem die angehangene Datei korrekt abgebildet wurde. Es lag an der Dateilänge.

Logischer nächster Schritt: nach diesem Problemansatz bei Google schaun. … Ich holte mir also einen Kaffee und … hab erstmal geschaut bei wieviel Zeichen schluss ist: 60.

Dann ging es an’s eingemachte, ich hab mir die Parameter, Header, Mime-Type und Nachricht angesehen. Sah alles sauber aus. Mein ungeschultes Auge in diesen Dingen erkannten nichts auffälliges. Was, zurückblickend, daran lag das es nichts falsches gab.

Jetzt kam dann Google dran ;). Ein Stündchen Suchsession brachte mich dann auf einen etwas älteren Bug im Thunderbird, der aber genau das abbildete was auch bei uns hier Probleme bereitete.

Die Ursache des dortigen Problems war, das Thunderbird einen anderen Standard für das einbetten von Dateianhängen nutzt, als Outlook. Und Outlook hat demnach wohl probleme, neuere Standards richtig zu lesen. Thunderbird: (RFC2231), Outlook (RFC2047). Und leider handelt es sich bei diesen Unterschied um recht gravierende Einschnitte.

Anschliessendes kurzschliessen mit den Jungs hinter Swiftmail haben meine Vermutung dann komplett bestätigt. Und leider unterstützt Swiftmail die älteren RFC-Standards nicht.

Puh. Tja, also was nun.

Bis dafür eine Lösung auftaucht hab ich also in den sauren Apfel gebissen, und bin zu PHPMailer (samt leicht modifierzierte Komponente) gewechselt. Aufgrund des Alters dieser Biblitothek bin ich einfach mal davon ausgegangen das dort die RFC-Standards ebenso alt sind ;).

Es klappt. Nach aussen hin, also bei dem nutzen der Komponente, fallen hier in unserem Fall nur sehr wenige Unterschiede auf. Aber trotzdem wäre mir eine passende Swift-Implementierung lieber. Allen vorran weil ich bei dieser keine Dateianhänge zunächst erst physikalisch erzeugen muss :/

Home Writing Rides Travel Photos Journal