Почтовые стандарты появились, когда письма могли передавать только латинские буквы. Поэтому всё остальное — русская тема, имя отправителя, название вложения, а часто и сам текст — перед отправкой записывается латиницей по особым правилам. Почтовая программа незаметно возвращает тексту обычный вид. Но если открыть исходный текст письма, получить письмо через скрипт или столкнуться с программой, которая ошиблась при разборе, видны строки вроде =?UTF-8?B?0J/RgNC40LLQtdGC?=. Декодер выше превращает их обратно в текст.
filename="=?UTF-8?B?...?=" и filename*=utf-8''%D0%9E%D1%82..., включая длинные имена, разбитые на части filename*0*=, filename*1*=.=D0=9F=D1=80=D0=B8...) и в Base64 (длинные строки из латиницы и цифр). Кодировку текста можно выбрать или оставить определение автоматически.=?UTF-8?B?...?= для скрипта рассылки, разбивая длинную тему на части по правилам стандарта.Закодированный фрагмент состоит из трех частей, разделенных вопросительными знаками: кодировка текста, способ записи и сами данные.
| Фрагмент | Кодировка | Способ | Текст |
|---|---|---|---|
=?UTF-8?B?0J/RgNC40LLQtdGC?= | UTF-8 | B — Base64 | Привет |
=?UTF-8?Q?=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82?= | UTF-8 | Q — коды байтов через «=» | Привет |
=?windows-1251?B?z/Do4uXy?= | Windows-1251 | B — Base64 | Привет |
=?koi8-r?B?8NLJ18XU?= | KOI8-R | B — Base64 | Привет |
Длинная тема делится на несколько фрагментов подряд: стандарт ограничивает длину каждого 75 символами. При этом одна русская буква в UTF-8 может оказаться разрезанной между двумя фрагментами — декодер склеивает их перед раскодированием, поэтому такие буквы не превращаются в «�».
Ctrl+U открывает исходный текст сообщения.Если после раскодирования вместо букв получилось «РџСЂРёРІРµС‚» или похожие кракозябры, значит, отправитель указал в письме не ту кодировку. Скопируйте результат в конвертер кодировок — он определит настоящую кодировку. Подробнее о таких письмах — в инструкции «Кракозябры в электронном письме».
| Где | Заголовок =?…?= | Текст в quoted-printable |
|---|---|---|
| Python 3 | str(email.header.make_header(email.header.decode_header(s))) | quopri.decodestring(b).decode('utf-8') |
| PHP | iconv_mime_decode($s, 0, 'UTF-8') или mb_decode_mimeheader($s) | quoted_printable_decode($s) |
Для обратной задачи в PHP есть mb_encode_mimeheader($subject, 'UTF-8', 'B'), а в Python — email.header.Header(subject, 'utf-8').encode(). Современные библиотеки отправки почты кодируют заголовки сами, достаточно передать им текст в UTF-8.