Datum: 18.11.2008
, Kategorie:
PHP
Bei einem Kundenprojekt empfängt und verarbeitet die Anwendung E-Mails mit Hilfe der IMAP-Funktionen von PHP. Dabei wird auch der Zeichensatz ausgelesen und die E-Mail bei Bedarf konvertiert. Der Konverter hat nicht besonders viel zu tun, da die Anwendung iso-8859-1 nutzt und die meisten E-Mails ebenfalls in iso-8859-1 oder ähnlichem daherkommen.
Kürzlich gab es Probleme mit utf-8-kodierten E-Mails, die jedoch nicht als solche erkannt wurden. Stattdessen behauptete imap_fetchstructure() steif und fest, die E-Mail wäre US-ASCII. Allerdings nur auf dem live Linux-Server. Auf unserem lokalen Server (Windows) wurden die E-Mails korrekt als utf-8-kodiert erkannt.
In den Kommentaren zu imap_fetchstructure() lässt sich ein Hinwis dazu finden:
If you are getting CHARSET as US-ASCII even if the header has a Content-Type: field, make sure the header also has a MIME-Version: field.
For example, the following header will correcty report charset as KOI8-R
MIME-Version: 1.0
Content-Type: text/plain; charset="koi8-r"
Without the MIME-Version it will be reported as US-ASII
Und tatsächlich. Folgendes Script hat den Beweis erbracht.
$headers = "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/plain; charset=\"utf-8\"";
mail('info@example.com', 'Subject', 'Text', $headers);
Mit der Kopfzeile MIME-Version: 1.0 in der E-Mail hat der Server den Zeichensatz korrekt als utf-8 erkannt. Ohne die Zeile nicht.