iconv_mime_decode_headers
(PHP 5)
iconv_mime_decode_headers — Декодирует несколько полей заголовка MIME
Описание
Возвращает ассоциативный массив с полями MIME-заголовка, переданного параметром encoded_headers , или FALSE в случае ошибки.
Каждый ключ элемента возвращаемого массива представляет отдельное имя поля, а сам элемент - его значение. если в заголовке несколько полей с одинаковым именем, они помещаются в подчинённый массив с числовыми индексами.
Параметр mode определяет поведение в случае обнаружения неправильного поля заголовка. можно указать любую комбинацию следующих битовых масок.
Значение | Константа | Описание |
---|---|---|
1 | ICONV_MIME_DECODE_STRICT | Строго следовать стандартам, определённым в » RFC2047. К сожалению, много проприетарных програм электронной почты не следуют стандартам, и, чтобы потокать им, этот режим по умолчанию отключён. |
2 | ICONV_MIME_DECODE_CONTINUE_ON_ERROR | Попытаться продолжить обработку в случае обнаружения ошибки. |
Если параметр charset опущен, предполагается, что кодировка строки string равна iconv.internal_charset.
Пример #1 Пример iconv_mime_decode_headers()
<?php
$headers_string = <<<EOF
Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=
To: example@example.com
Date: Thu, 1 Jan 1970 00:00:00 +0000
Message-Id: <example@example.com>
Received: from localhost (localhost [127.0.0.1]) by localhost
with SMTP id example for <example@example.com>
Thu, 1 Jan 1970 00:00:00 +0000 (UTC)
(envelope-from example-return-0000-example=example.com@example.com)
Received: (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000
EOF;
$headers = iconv_mime_decode_headers($headers_string, 0, "ISO-8859-1");
print_r($headers);
?>
Результат выполнения данного примера:
Array ( [Subject] => Prьfung Prьfung [To] => example@example.com [Date] => Thu, 1 Jan 1970 00:00:00 +0000 [Message-Id] => <example@example.com> [Received] => Array ( [0] => from localhost (localhost [127.0.0.1]) by localhost with SMTP id example for <example@example.com>; Thu, 1 Jan 1970 00:00:00 +0000 (UTC) (envelope-from example-return-0000-example=example.com@example.com) [1] => (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000 ) )
См. также iconv_mime_decode(), mb_decode_mimeheader(), imap_mime_header_decode(), imap_base64() и imap_qprint().
Коментарии
If you need lower-case header-names (as I read the documentation case is not guranteed) try something like
<?php
$headers_string = <<<EOF
Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=
To: example@example.com
Date: Thu, 1 Jan 1970 00:00:00 +0000
Message-Id: <example@example.com>
Received: from localhost (localhost [127.0.0.1]) by localhost
with SMTP id example for <example@example.com>;
Thu, 1 Jan 1970 00:00:00 +0000 (UTC)
(envelope-from example-return-0000-example=example.com@example.com)
Received: (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000
EOF;
$headers = iconv_mime_decode_headers($headers_string, 0, "ISO-8859-1");
$headers = array_combine(array_map("strtolower", array_keys($headers)), array_values($headers));
print_r($headers);
?>
Just in case this catches anyone else: If your headers string has any leading linebreaks, this function will reject it and return an empty array. If that might apply to your input, sanitise it with ltrim().
Trailing empty lines are tolerated/ignored.
Other quirks I noticed just now:
1. Leading whitespace (" " or "\t") in the *first* line will be included in the header's key name in the returned array. ltrim() will prevent that too.
2. Leading whitespace in any subsequent header (before the key) will cause that line to be appended to the preceding header's value, as though it were a run-on of that header.