Учим WordPress правильно кодировать письма в UTF-8

Решение проблемы битых заголовков в email

Те, кто используют русскоязычную версию WordPress, наверняка не раз сталкивались с проблемой битого заголовка Subject в уведомлениях WordPress. Навреное, проще проиллюстрировать: Очевидно, что это не хорошо Более того, битая кодировка может служить критерием для определения письма спамом. Для того, чтобы убедиться, что такое отображение письма — это не ошибка почтового клиента, я написал маленький тестовый скрипт, который [...]

← Вернуться к полной версии записи «Учим WordPress правильно кодировать письма в UTF-8»…

Вложения:

Автор: ; опубликовано в: Патчи; метки: PHP Mailer, utf8, WordPress, ошибка, патч
27
Сен
2008

RSS Комментарии к статье «Учим WordPress правильно кодировать письма в UTF-8» (31)  »

  1. Ivan1986

    Блин, извращенцы, руки оторвать

    [-]
    View Code PHP
    $encoded = mb_encode_mimeheader($encoded, 'utf-8');
    • Иван, а потом как разбивать этот UTF-8 на блоки по 78 байт? По сути старая версия PHP Mailer применяла подход, похожий на Ваш, после чего в заголовках и стали попадаться кракозябры (когда символ UTF-8 бился посередине).

      Собственно, приведённое извращение и борется с проблемой разбивки по блокам в соответствии с RFC.

      • Ivan1986

        По сути функция сама бьет строку на кодированные блоки по 78 байт.
        Только в отличие от старого вордпресса корректно.

        • Ага, дошло, невнимательно посмотрел.

          Только она требует mbstring, а разработчики WordPress не ставят mbstring в минимальные требования для WordPress. Поэтому на серверах без расширения mbstring работать не будет.

          Да, и еще один момент: This function isn’t designed to break lines at higher-level contextual break points (word boundaries, etc.). This behaviour may clutter up the original string with unexpected spaces.

          • Ivan1986

            Конечно не ставят, для леммингов ведь в частности делается, а в таких поделках как денвер мбстринг по умолчанию не установлен, а поставить – это ведь думать нужно, лемминги не думают. Им проще реализовать дополнительную кривую функцию, которая будет работать везде, чем отбиваться от пачки запросов почему не работает.

            Вообще я не понимаю ситуации – на хостинге не установлено что-то, раз не установлено, так надо поставить, да и дубаю что mbstring будет установлен на всех по крайне мере русских хостингах, иначе это уже не хостинг, а так, детский сад.

            По поводу «This function…
            Я так понял могут появляться лишние пробелы при кодировании переводов строк или что-то еще
            Сейчас проверил – многостроковая тема корректно кодируется и потом корректно раскодируется в кмайле, и в случае попадания пробела между котированными частями на перевод строки тоже.

        • Ну WordPress-то не в России разрабатывают.

          Они всё не могут оставить в покое хладный труп PHP4, а тут mbstring :-)

          Вообще насколько я знаю ситуацию на америкосовских хостингах, заставить хостера поставить что-нибудь на работающий (во всех смыслах) сервер — это очень тяжело.

          Я помню, как клиент неделю(!) уговаривал хостеров подключить mod_rewrite(!!!).

          По-видимому, это одна из причин, по которой разработчики не хотят создавать дополнительные зависимости.

          • Ivan1986

            А, ну если PHP4 не закопали, то тогда все понятно :)
            (поубивал бы :)

            Я тоже с поддержкой PHP 5.2 в своем движке несколько вещей добавил, которые бы писались проще в 5.3, а в 5.2 не работают, но чтобы PHP4

      • Ivan1986
        [-]
        View Code PHP
        $s = 'Ну очень очень длинная тема Ну очень очень длинная тема Ну очень очень длинная тема Ну очень очень длинная тема';
        echo $s."\n";
        echo mb_encode_mimeheader($s, 'utf-8')."\n";

        echo "\n\n\n";
        $s = 'Ну_очень_очень_длинная_тема_без_пробелов_Ну_очень_очень_длинная_тема_без_пробелов_Ну_очень_очень_длинная_тема_без_пробелов';
        echo $s."\n";
        echo mb_encode_mimeheader($s, 'utf-8')."\n";
        [-]
        View Code Text
        Ну очень очень длинная тема Ну очень очень длинная тема Ну очень очень длинная тема Ну очень очень длинная тема
        =?UTF-8?B?0J3RgyDQvtGH0LXQvdGMINC+0YfQtdC90Ywg0LTQu9C40L3QvdCw0Y8g0YI=?=
         =?UTF-8?B?0LXQvNCwINCd0YMg0L7Rh9C10L3RjCDQvtGH0LXQvdGMINC00LvQuNC90L0=?=
         =?UTF-8?B?0LDRjyDRgtC10LzQsCDQndGDINC+0YfQtdC90Ywg0L7Rh9C10L3RjCDQtNC7?=
         =?UTF-8?B?0LjQvdC90LDRjyDRgtC10LzQsCDQndGDINC+0YfQtdC90Ywg0L7Rh9C10L0=?=
         =?UTF-8?B?0Ywg0LTQu9C40L3QvdCw0Y8g0YLQtdC80LA=?=



        Ну_очень_очень_длинная_тема_без_пробелов_Ну_очень_очень_длинная_тема_без_пробелов_Ну_очень_очень_длинная_тема_без_пробелов
        =?UTF-8?B?0J3Rg1/QvtGH0LXQvdGMX9C+0YfQtdC90Yxf0LTQu9C40L3QvdCw0Y9f0YI=?=
         =?UTF-8?B?0LXQvNCwX9Cx0LXQt1/Qv9GA0L7QsdC10LvQvtCyX9Cd0YNf0L7Rh9C10L0=?=
         =?UTF-8?B?0Yxf0L7Rh9C10L3RjF/QtNC70LjQvdC90LDRj1/RgtC10LzQsF/QsdC10Ldf?=
         =?UTF-8?B?0L/RgNC+0LHQtdC70L7Qsl/QndGDX9C+0YfQtdC90Yxf0L7Rh9C10L3RjF8=?=
         =?UTF-8?B?0LTQu9C40L3QvdCw0Y9f0YLQtdC80LBf0LHQtdC3X9C/0YDQvtCx0LXQu9C+?=
         =?UTF-8?B?0LI=?=
  2. Артур

    А у меня знаки вопроса вместо букв появляются в анонсах комментариев, которые отображаются на главной странице?

  3. Евгений

    Добрый день, Владимир.
    Проблема кодировки писем актуальна по сей день. Ты -единственный, кто пролил свет на этот злой глюк. Скажи пожалуйста, как следует понимать это сообщение?

    «Итак, патч в формате unified diff (должен применяться к файлу wp-includes/class-phpmailer.php»

    Просто скопировать этот файл в директорию с файлом class-phpmailer.php ? Или как-то нужно выполнять команду diff? Запутался.
    Пожалуйста, объясни. Буду очень признателен.

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Учим WordPress правильно кодировать письма в UTF-8»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा