Mb encode mimeheader: примеры (PHP)
mb_encode_mimeheader(string $string, ?string $charset = null, ?string $transfer_encoding = null, string $newline = "\r\n", int $indent = 0): stringФункция mb_encode_mimeheader
Функция mb_encode_mimeheader в PHP предназначена для кодирования строк в формат MIME 'encoded-word', который используется в заголовках электронных писем (например, Subject, From, To) для корректного отображения не-ASCII символов. Она особенно полезна, когда необходимо передать текст в кодировках, отличных от ASCII, через почтовые протоколы, требующие 7-битной передачи.
Функция принимает до пяти параметров:
- string (обязательный) - строка для кодирования.
- charset (необязательный) - указывает кодировку, в которой представлена строка. По умолчанию определяется внутренней кодировкой mbstring.
- transfer_encoding (необязательный) - метод кодирования передачи. Допустимые значения: 'B' (Base64) или 'Q' (Quoted-Printable). По умолчанию 'B'.
- linefeed (необязательный) - символ перевода строки, который будет вставлен для разбивки длинных строк (согласно RFC 2047). По умолчанию '\r\n'.
- indent (необязательный) - целое число, указывающее отступ для второй и последующих строк в кодированном результате. По умолчанию 0.
Примеры использования
echo mb_encode_mimeheader('Привет мир!', 'UTF-8');=?UTF-8?B?0J/RgNC40LLQtdGCINC80LjRgCE=?=
echo mb_encode_mimeheader('Тема письма с запятой, и точкой.', 'UTF-8', 'Q');=?UTF-8?Q?=D0=A2=D0=B5=D0=BC=D0=B0 =D0=BF=D0=B8=D1=81=D1=8C=D0=BC=D0=B0 =D1=81 =D0=B7=D0=B0=D0=BF=D1=8F=D1=82=D0=BE=D0=B9, =D0=B8 =D1=82=D0=BE=D1=87=D0=BA=D0=BE=D0=B9.?=
echo mb_encode_mimeheader('Очень длинная строка для демонстрации разбивки по строкам с отступом', 'UTF-8', 'B', "\n", 4);=?UTF-8?B?0J7Rh9C40YHQu9Cw0L3RiyDQtNC70LjQvNCw0L3RgtCwINGB0YLRgNCw0L3Q?=\n =?UTF-8?B?utC+0Lkg0LTQvtC80LAg0YDQtdC20LTQsNC90L3Ri9C5INGA0LDRgdC/0L7Q?=\n =?UTF-8?B?stC40YIg0L7RgiDRgdGC0YDQvtC60Lgg0L7RgiDQvtC00L3QvtCz0L4=?=
Похожие функции в PHP
Функции imap_8bit и imap_qprint работают с кодировками Quoted-Printable, но не формируют заголовок 'encoded-word'. Они предназначены для кодирования тела сообщения. Для формирования MIME-заголовков предпочтительнее использовать mb_encode_mimeheader.
Функция iconv_mime_encode предоставляет больше контроля над процессом кодирования MIME-заголовков, позволяя настраивать схему кодирования, длину строки и другие параметры. Она сложнее в использовании, но более гибкая для нестандартных задач.
Типичные ошибки
// Строка в Windows-1251, но указана UTF-8
$str = iconv('UTF-8', 'Windows-1251', 'Тест');
echo mb_encode_mimeheader($str, 'UTF-8');Корректный результат не гарантирован, возможны искажения.
echo mb_encode_mimeheader('Текст', 'UTF-8', 'X');Будет использовано значение по умолчанию 'B'.
// Если модуль mbstring не загружен
mb_encode_mimeheader('Тест');Fatal error: Uncaught Error: Call to undefined function mb_encode_mimeheader()
Изменения в последних версиях PHP
В PHP 8.0 были улучшения, связанные с обработкой строк и кодировок, но сама функция mb_encode_mimeheader не претерпела значительных изменений в своей сигнатуре или поведении. Однако, в PHP 8.1 и выше усилилась строгость типов, что может повлиять на передачу аргументов.
В PHP 8.2 не было внесено изменений, специфичных для этой функции. Рекомендуется всегда указывать кодировку явно для избежания неоднозначностей.
Расширенные примеры
$from = mb_encode_mimeheader('Иван Петров', 'UTF-8', 'Q') . ' <ivan@example.com>';
echo $from;=?UTF-8?Q?=D0=98=D0=B2=D0=B0=D0=BD =D0=9F=D0=B5=D1=82=D1=80=D0=BE=D0=B2?= <ivan@example.com>
$longSubject = 'Очень длинная тема письма, которая требует разбивки на несколько строк при кодировании';
echo mb_encode_mimeheader($longSubject, 'KOI8-R', 'B', "\r\n", 5);=?KOI8-R?B?79TexM/Ex9fSxSDUxM3FzsvFIMnEz8nE3tLPxSDQ0dfS1M/E19IgwcUgx8Eg?=\r\n =?KOI8-R?B?0dfS0s/E19LFIcHQ0SDX1M/Fz8nFIM3FIM/Fz8nFy8/Uz8Ug0MXU?=\r\n =?KOI8-R?B?0dfS1M/Uz9TSz8U=?=
$to = mb_encode_mimeheader('Анна Смирнова', 'UTF-8') . ' <anna@domain.com>';
$subject = mb_encode_mimeheader('Ваш заказ №12345', 'UTF-8', 'Q');
$headers = "From: $to\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
// mail($to, $subject, $message, $headers);Пример демонстрирует подготовку корректных заголовков для функции mail().
Альтернативы в других языках
from email.header import Header
header = Header('Привет мир!', 'utf-8')
print(header.encode())=?utf-8?b?0J/RgNC40LLQtdGCINC80LjRgCE=?=
В Node.js можно использовать библиотеку libmime или встроенный модуль 'mailcomposer' для кодирования заголовков. Прямого аналога в стандартной библиотеке нет.
В MySQL нет встроенной функции для кодирования MIME-заголовков. Обычно такая обработка выполняется на стороне приложения.