Тема письма, кодировка и вылазящие знаки вопроса в ПО с открытым кодом.

Если вы пользуетесь форумами, социальными сетями, и прочими сервисами Рунета, то могли заметить письма со знаками вопроса в заголовках.
Знаки вопроса в заголовке
Такое происходит, если программист явно не указал кодировку в самом поле Subject в письме. Да, в поле Content-type кодировка явно стоит, но, засада вылазит, если заголовок пустили скажем в windows-1251 или utf-8 без предварительной обработки. Так как сайты в русском сегменте Сети в основном делают на PHP,  а PHP явным образом не предполагает такой работы с электронной почтой, да и не предлагает программисту никаких дополнительных инструментов кроме функции mail(), то тому, кто пытается научить свои скрипты отсылать почтовые уведомления, следует правильно форматировать поле Subject.

Формат будет примерно такой:
=?кодировка?способ кодирования?закодированный текст?=

Кодировка  -  обозначение кодировки, которую вы использовали("windows-1251", "koi8-r", "utf-8") .

Способ кодирования указывает, каким именно символы заголовка будут преобразованы в безопасный набор. Есть разные способы кодирования, как правило используют 2 способа: Quooted-Printable(обозначается буквой Q) и Base64(обозначается буквой B)

Примеры на PHP:

$subject = '=?utf-8?b?' . base64_encode($subject) . '?=';
Или, если Вы полностью перешли на UTF-8, можно воспользоваться функцией библиотеки mb_string - mb_encode_mimeheader():
$subject = mb_encode_mimeheader($subject, 'UTF-8', 'B');

Таким образом, пользователь больше не увидит позорных знаков вопросов в письмах.

Комментарии

Submitted by Анонимный польз... (не проверено) on

Супер информация, то что нужно.

Только вот замечено, что в OutExp 2003 v 11.6568.6568 (SP2) в такой вариации
через base64 показывается не пойми что.

Кто знает в чем может быть проблема?

Submitted by Анонимный польз... (не проверено) on

Да непойми что только в windows-1251, В УТФ8 все нормально, поэтому это как вариант решения. Но все же хотелось как-то заставить Майкрософт понять и нужную кодировочку.