Mb encode mimeheader: примеры (PHP)

Функция 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-битной передачи.

Аргументы функции

Функция принимает до пяти параметров:

  1. string (обязательный) - строка для кодирования.
  2. charset (необязательный) - указывает кодировку, в которой представлена строка. По умолчанию определяется внутренней кодировкой mbstring.
  3. transfer_encoding (необязательный) - метод кодирования передачи. Допустимые значения: 'B' (Base64) или 'Q' (Quoted-Printable). По умолчанию 'B'.
  4. linefeed (необязательный) - символ перевода строки, который будет вставлен для разбивки длинных строк (согласно RFC 2047). По умолчанию '\r\n'.
  5. indent (необязательный) - целое число, указывающее отступ для второй и последующих строк в кодированном результате. По умолчанию 0.

Примеры использования

Базовое кодирование
echo mb_encode_mimeheader('Привет мир!', 'UTF-8');
=?UTF-8?B?0J/RgNC40LLQtdGCINC80LjRgCE=?=
Кодирование в Quoted-Printable
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

Функции imap_8bit и imap_qprint работают с кодировками Quoted-Printable, но не формируют заголовок 'encoded-word'. Они предназначены для кодирования тела сообщения. Для формирования MIME-заголовков предпочтительнее использовать mb_encode_mimeheader.

iconv_mime_encode

Функция iconv_mime_encode предоставляет больше контроля над процессом кодирования MIME-заголовков, позволяя настраивать схему кодирования, длину строки и другие параметры. Она сложнее в использовании, но более гибкая для нестандартных задач.

Типичные ошибки

Неверная кодировка исходной строки
// Строка в Windows-1251, но указана UTF-8
$str = iconv('UTF-8', 'Windows-1251', 'Тест');
echo mb_encode_mimeheader($str, 'UTF-8');
Корректный результат не гарантирован, возможны искажения.
Использование недопустимого transfer_encoding
echo mb_encode_mimeheader('Текст', 'UTF-8', 'X');
Будет использовано значение по умолчанию 'B'.
Забытая активация модуля mbstring
// Если модуль 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 не было внесено изменений, специфичных для этой функции. Рекомендуется всегда указывать кодировку явно для избежания неоднозначностей.

Расширенные примеры

Кодирование адреса отправителя
Пример php
$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>
Обработка длинных строк с переносом
Пример php
$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=?=
Совместное использование с mail()
Пример php
$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().

Альтернативы в других языках

Python: email.header.Header
from email.header import Header
header = Header('Привет мир!', 'utf-8')
print(header.encode())
=?utf-8?b?0J/RgNC40LLQtdGCINC80LjRgCE=?=
JavaScript (Node.js): libmime

В Node.js можно использовать библиотеку libmime или встроенный модуль 'mailcomposer' для кодирования заголовков. Прямого аналога в стандартной библиотеке нет.

MySQL: нет прямой замены

В MySQL нет встроенной функции для кодирования MIME-заголовков. Обычно такая обработка выполняется на стороне приложения.

PHP mb_encode_mimeheader function comments

En
Mb encode mimeheader Encode string for MIME header