Signatur
Beschreibung
imap_mime_header_decode() analysiert einen MIME-kodierten Header-String gemäß RFC 2047 und zerlegt ihn in seine Bestandteile. Jedes Element enthält den ursprünglichen Zeichensatz (charset) sowie den dekodiert vorliegenden Text (text). Diese Funktion ist besonders nützlich, wenn E-Mail-Header Nicht-ASCII-Zeichen enthalten, die als =?UTF-8?B?...?= oder =?ISO-8859-1?Q?...?= kodiert sind.
Ein typischer Anwendungsfall ist das Dekodieren des Betreffs (Subject) oder des Absendernamens (From) einer E-Mail, bevor der Inhalt dem Benutzer angezeigt oder weiterverarbeitet wird. Die Funktion unterstützt sowohl Base64-Kodierung (Typ B) als auch Quoted-Printable-Kodierung (Typ Q).
Der zurückgegebene Array enthält für jedes erkannte kodierte Wort ein Objekt mit den Eigenschaften charset und text. Nicht kodierte Zeichenketten innerhalb des Headers erhalten als Zeichensatz den Wert default.
Beachte, dass die Funktion nur den Header-Wert selbst entgegennimmt (ohne den Header-Namen wie Subject: ). Außerdem konvertiert sie den Text nicht automatisch in eine andere Zielkodierung – eine anschließende Konvertierung mit iconv() oder mb_convert_encoding() kann notwendig sein.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | Der zu dekodende MIME-kodierte Header-String, z. B. der Wert des Subject- oder From-Feldes einer E-Mail (ohne den Header-Namen). |
Rückgabewert
charset (der Zeichensatz des kodierten Segments, oder default für nicht kodierte Teile) und text (der dekodierte Text des Segments). Bei einem Fehler wird false zurückgegeben.Beispiele
E-Mail-Betreff mit UTF-8-Kodierung dekodieren
<?php
// Simulierter MIME-kodierter Betreff einer E-Mail
$subject = '=?UTF-8?B?QW56YWhsIGRlciBOYWNocmljaHRlbg==?=';
$elements = imap_mime_header_decode($subject);
foreach ($elements as $element) {
echo 'Zeichensatz: ' . $element->charset . PHP_EOL;
echo 'Text: ' . $element->text . PHP_EOL;
}
Gemischten Header mit kodierten und nicht-kodierten Teilen verarbeiten
<?php
// Header, der sowohl kodierte als auch reine ASCII-Anteile enthält
$from = 'Max =?ISO-8859-1?Q?M=FCller?= <max@example.com>';
$elements = imap_mime_header_decode($from);
$fullName = '';
foreach ($elements as $element) {
if ($element->charset !== 'default' && strtolower($element->charset) !== 'utf-8') {
// Konvertierung in UTF-8, falls nötig
$fullName .= iconv($element->charset, 'UTF-8//TRANSLIT', $element->text);
} else {
$fullName .= $element->text;
}
}
echo trim($fullName) . PHP_EOL;
// Wichtig · Fallstricke
Erweiterungsabhängigkeit: Diese Funktion erfordert die IMAP-Erweiterung (ext/imap), die nicht immer standardmäßig aktiviert ist. Sie wurde in PHP 8.4 als missbilligt (deprecated) markiert, da die IMAP-Erweiterung insgesamt veraltet ist. Als Alternative bieten sich Bibliotheken wie ddeboer/imap oder mailparse_rfc822_parse_addresses() an.
Zeichensatzbehandlung: Die Funktion dekodiert den Text, konvertiert ihn aber nicht in eine einheitliche Zielkodierung. Segmente mit unterschiedlichen Zeichensätzen müssen anschließend manuell mit iconv() oder mb_convert_encoding() vereinheitlicht werden, bevor sie ausgegeben oder gespeichert werden.
Sicherheit: Da die Eingabe aus externen E-Mails stammt, sollte der dekodierte Text vor der Ausgabe immer mit htmlspecialchars() oder einem entsprechenden Mechanismus escaped werden, um XSS-Angriffe zu verhindern.