1

Тема: Проблема с кодировкой в почтовых уведомлениях

Приходит примерно такое:

Subject: Сообщение в теме: 'мЮПСВМХЙХ'
User написал ответ в теме '', на которую Вы, в своё время, подписались на форуме.

Как быть? Сборка ваша.

Поделиться

2

Re: Проблема с кодировкой в почтовых уведомлениях

Тож самое, тока сборка своя, но юзаю UTF-8. Как понимаю, надо перебодяжить функцию отправки сообщения, чтоб в заголовок(точнее в тему, которая subj) добавлять кодировку?

Поделиться

3

Re: Проблема с кодировкой в почтовых уведомлениях

Кстати, тема сообщения в уведомлении с этого форума пришла нормальная сейчас, но отправитель такой: PunBB ??-?????? ???????? ????? <hcs @ mail.ru>

Поделиться

4

Re: Проблема с кодировкой в почтовых уведомлениях

Исправления в нашей сборке затрагивают конвертирование темы в кои-8. Эти изменения еще не вошли в архив.
Изменения отправителя пока не проводились вообще.

Сайт hcs

Поделиться

5

Re: Проблема с кодировкой в почтовых уведомлениях

Нельзя ли их выложить здесь, раз в архив пока не вошли?

Поделиться

6

Re: Проблема с кодировкой в почтовых уведомлениях

include/email.php
заменить функцию  pun_mail на этот вариант:

//
// Wrapper for PHP's mail()
//
function pun_mail($to, $subject, $message, $from = '')
{
    global $pun_config, $lang_common;

    // Default sender/return address
    if (!$from) {
        $from = '"'.str_replace('"', '', $pun_config['o_board_title'].' '.$lang_common['Mailer']).'" <'.$pun_config['o_webmaster_email'].'>';
// BEGIN FIX FOR UTF-8 ENCODING
        $from = iconv("UTF-8", "KOI8-R", $from);
// END FIX
    }
    // Do a little spring cleaning
    $to = trim(preg_replace('#[\n\r]+#s', '', $to));

// BEGIN FIX FOR UTF-8 ENCODING
// ORIGINAL:
//    $subject = trim(preg_replace('#[\n\r]+#s', '', $subject));
//    testing:
    $subject = '=?KOI8-R?B?'.base64_encode(iconv("UTF-8", "KOI8-R", trim(preg_replace('#[\n\r]+#s', '', $subject))))."?=\n";
// END FIX

    $from = trim(preg_replace('#[\n\r:]+#s', '', $from));

    $headers = 'From: '.$from."\r\n".'Date: '.date('r')."\r\n".'MIME-Version: 1.0'."\r\n".'Content-transfer-encoding: 8bit'."\r\n".'Content-type: text/plain; charset='.$lang_common['lang_encoding']."\r\n".'X-Mailer: PunBB Mailer';

    // Make sure all linebreaks are CRLF in message
    $message = str_replace("\n", "\r\n", pun_linebreaks($message));

    if ($pun_config['o_smtp_host'] != '')
        smtp_mail($to, $subject, $message, $headers);
    else
    {
        // Change the linebreaks used in the headers according to OS
        if (strtoupper(substr(PHP_OS, 0, 3)) == 'MAC')
            $headers = str_replace("\r\n", "\r", $headers);
        else if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN')
            $headers = str_replace("\r\n", "\n", $headers);

        mail($to, $subject, $message, $headers);
    }
}

Сайт hcs

Поделиться

7

Re: Проблема с кодировкой в почтовых уведомлениях

Большое спасибо, буду пробовать.

Поделиться

8 (10.03.2007 22:53 отредактировано niikto)

Re: Проблема с кодировкой в почтовых уведомлениях

hcs
Большое тебе спасибо!

имею дело с 2-мя сборками, и вот немного изменил опытным путем твою доделку:

В сборке Dexus есть выбор для пользователя - либо ему придет просто уведомление о новом посте в теме, на кою он подписан, либо ему придет и содержание поста либо ему придет содержание в виде html

так вот я поэкспериментировал, и оказалось сперва, что в денвере у меня iconv не работает smile - поэтому пришлось экспериментировать уже на сервере.

В при веденом выше коде есть 2 интересующих места:

// BEGIN FIX FOR UTF-8 ENCODING
        $from = iconv("UTF-8", "KOI8-R", $from);
// END FIX

и

// BEGIN FIX FOR UTF-8 ENCODING
// ORIGINAL:
//    $subject = trim(preg_replace('#[\n\r]+#s', '', $subject));
//    testing:
    $subject = '=?KOI8-R?B?'.base64_encode(iconv("UTF-8", "KOI8-R", trim(preg_replace('#[\n\r]+#s', '', $subject))))."?=\n";
// END FIX

первое переводит отправителя в koi8 второе - тему.
Я выяснил что Тему переводить - надо, а вот отправителя -нет. иначе он приходит так: жПТХН бЧФПЛПНРМЕЛУБ тЕБЛФПТ З. пНУЛ. mailer вместо Форум Автокомплекса Реактор г. Омск. mailer.

поэтому я закомментировал первую строчку, и вставил эти же куски в следующую функцию function pun_mail_html , которая идет сразу же после function pun_mail

Сайт niikto

Поделиться

9

Re: Проблема с кодировкой в почтовых уведомлениях

Внимательно прочитал эту тему, но вопрос у меня все же остался.
У меня стоит стандартная сборка, кодировка win1251, но в сообщениях с уведомлениями о новых постах тема всегда нечитабельна. Подскажите, как исправить это? Если возможно привести прямо строчки кода, буду благодарен -- в php не понимаю ничего.

Сайт Itomonster

Поделиться

10

Re: Проблема с кодировкой в почтовых уведомлениях

а ты чем почту получаешь?
ато зебат касячит то что понимает мозилла тундерберд

Сайт niikto

Поделиться

11

Re: Проблема с кодировкой в почтовых уведомлениях

 $subject = '=?KOI8-R?B?'.base64_encode(trim(preg_replace('#[\n\r]+#s', '', $subject)))."?=\n";

Сайт hcs

Поделиться

12

Re: Проблема с кодировкой в почтовых уведомлениях

Почту проверяю Оперой. Действительно, Tunderbird читает те же письма нормально, и интерфейс Gmail, кстати, тоже. Так что возможно, что это косяк самой программы.

hcs, прошу прощения, ну куда это нужно вставлять? :-)

P.S. Кстати, уведомление с вашего форума пришло вот от такого адресата: "=?KOI8-R?B?IlB1bkJCINDPLdLV09PLySDwz97Uz9fZyiDSz8LP1CIgPGhjc0BtYWlsLnJ1Pg==?=@wwwhosting.tomica.ru". Это нормально?

Сайт Itomonster

Поделиться

13

Re: Проблема с кодировкой в почтовых уведомлениях

smile Надоела мне уже эта почта.

Сайт hcs

Поделиться

14 (13.06.2007 00:30 отредактировано mesemb)

Re: Проблема с кодировкой в почтовых уведомлениях

Только лучше не

'=?KOI8-R?B?'

а

'=?'.$lang_common['lang_encoding'].'?B?'

Поделиться

15

Re: Проблема с кодировкой в почтовых уведомлениях

Действительно, с кодировками надо что-то делать. Стоит клиентом полный Аутглюк, так мало того, что в поле "From:" сплошные крокозяблы, он еще и UTF-8 не понимает автоматом в теле письма (там вааще ужос), приходится его ручками перетыкивать. Хорошо, если человек понимает, что надо сделать... Но ведь есть юзера при виде такой мессаги у которых крыша поедет -)

Вот как бы эту проблему побороть ?

Поделиться

16

Re: Проблема с кодировкой в почтовых уведомлениях

потестируйте, пожалуйста, как ходят почтовые сообщения с master.1wd.ru/
зарегистрируйтесь и тестируйте.

для русского языка использую конвертацию в koi8-r ( через iconv() )

еще есть вот такое:

    $subject = '=?'.$encoding.'?B?'.base64_encode($subject).'?=';

здесь $encoding == 'koi8-r' для русского языка, для нерусского utf-8 smile работает вродебы в обоих случаях smile

Сайт artoodetoo

Поделиться

17

Re: Проблема с кодировкой в почтовых уведомлениях

Честно говоря, так и не вкурил, что и как надо делать sad И почему так модна устаревшая KOI.
Мне (и, наверно, всем пользователям форума) письма приходят вот так:

http://turan4oks.googlepages.com/mp_send_gmail.png

Причем, некоторые письма вообще пустые. В частности вот там верхнее, у которого тема тоже так коряво.
Жуть. Кстати, это если в Gmail смотреть, а в Thunderbird почти нормально, только почему-то часть служебной информации появляется в теле письма.

http://turan4oks.googlepages.com/mp_send_thunderbird.png

Вот такие пироги. Я сам бы попробовал всё исправить, но что-то туплю. Вы не могли бы мне просто подсказать, где мне копать? Как вообще в движке организована функция отправки писем?

P.S. А нельзя ли организовать отправку через GMAIL, а не через основной SMTP? Пробовал подставлять логины-пароли - не работает. Вроде бы на официальном форуме где-то находил, что это потому что надо по защищенному протоколу подцепляться, и выкладывали там какую строчку изменить. Изменения эти вносил, но так и не заработало, к сожалению.

Сайт BrokenBrake

Поделиться

18 (26.08.2007 18:22 отредактировано BrokenBrake)

Re: Проблема с кодировкой в почтовых уведомлениях

Вот еще, видимо, чтобы жизнь малиной не казалась smile Послал себе email через форум...

http://turan4oks.googlepages.com/mail_from_mp_gmail.png

То же самое письмо в Thunderbird...

http://turan4oks.googlepages.com/mail_from_mp_thunderbird.png

Добавлено спустя     2 минуты   6 секунд:
Я так понимаю, что "конверт" письма и его содержание отправляются в разных кодировках. Или что? Я вообще с почтой почему-то нифига не разбираюсь. Но разберусь, если вы подскажете, где это все менять. Я лишь примерно представляю.

Добавлено спустя     2 минуты   24 секунды:
И вообще, сложно это изменить?

Сайт BrokenBrake

Поделиться

19

Re: Проблема с кодировкой в почтовых уведомлениях

текст Subject и тело письма могут быть в разных кодировках.
кодировка Subject указывается непосредственнов строке, как "=?***?B?..."
а кодировка текста - в строке заголовка "Content-type: text/plain; charset=***"

вот для энтузиастов мой испробованный вариант функции из include/email.php

function pun_mail($to, $subject, $message, $from = '')
{
    global $pun_config, $lang_common;

    $sender = str_replace('"', '', $pun_config['o_board_title'].' '.$lang_common['Mailer']);
    if (isset($lang_common['mail_encoding']))
    {
        $encoding = $lang_common['mail_encoding'];
        $subject = iconv($lang_common['lang_encoding'], $lang_common['mail_encoding'], $subject);
        $message = iconv($lang_common['lang_encoding'], $lang_common['mail_encoding'], $message);
        $sender = iconv($lang_common['lang_encoding'], $lang_common['mail_encoding'], $sender);
    }
    else
        $encoding = $lang_common['lang_encoding'];

    // Default sender/return address
    if (!$from)
        $from = '"'.'=?'.$encoding.'?B?'.base64_encode($sender).'?=" <'.$pun_config['o_webmaster_email'].'>';

    // Do a little spring cleaning
    $to = trim(preg_replace('#[\n\r]+#s', '', $to));
    $subject = trim(preg_replace('#[\n\r]+#s', '', $subject));
    $from = trim(preg_replace('#[\n\r:]+#s', '', $from));

    $subject = '=?'.$encoding.'?B?'.base64_encode($subject).'?=';

    $headers = 'From: '.$from."\r\n".'Date: '.date('r')."\r\n".'MIME-Version: 1.0'."\r\n".'Content-transfer-encoding: 8bit'."\r\n".'Content-type: text/plain; charset='.$encoding."\r\n".'X-Mailer: PunBB Mailer';

    // Make sure all linebreaks are CRLF in message (and strip out any NULL bytes)
    $message = str_replace(array("\n", "\0"), array("\r\n", ''), pun_linebreaks($message));

    if ($pun_config['o_smtp_host'] != '')
        return smtp_mail($to, $subject, $message, $headers);
    else
    {
        // Change the linebreaks used in the headers according to OS
        if (strtoupper(substr(PHP_OS, 0, 3)) == 'MAC')
            $headers = str_replace("\r\n", "\r", $headers);
        else if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN')
            $headers = str_replace("\r\n", "\n", $headers);

        return mail($to, $subject, $message, $headers);
    }
}

суть в том, что в языковом файле common может быть указана отдельно кодировка почты koi8-r или windows-1251. если ничего не указано - будет использоваться кодировка форума, т.е. скорее всего utf-8.
эксперименты показали, что письма читаются правильно в любом раскладе! на всякий случай у меня
сейчас в lang/*/common.php прописано

'lang_encoding'            =>    'UTF-8',
'mail_encoding'            =>    'koi8-r',

Сайт artoodetoo

Поделиться

20

Re: Проблема с кодировкой в почтовых уведомлениях

Не понимаю все же, зачем одновременно две кодировки? 8-о

Добавлено спустя       29 секунд:
То есть твой вариант тоже будет заголовки отсылать в одной, а тело в другой?

Сайт BrokenBrake

Поделиться

21

Re: Проблема с кодировкой в почтовых уведомлениях

нет.
1) ты задал вопрос "могут ли", я ответил "да, могут".
2) для экскрементов дал тебе скрипт в котором можно испытать различные кодировки отправлений не меняя кодировки форума. достаточно изменить строку в языковом файле.
может быть какой-то вариант окажется оптимальным.

Сайт artoodetoo

Поделиться

22

Re: Проблема с кодировкой в почтовых уведомлениях

Понял, спасибо. Попробую.

Сайт BrokenBrake

Поделиться

23

Re: Проблема с кодировкой в почтовых уведомлениях

artoodetoo, огромное спасибо! Работает отлично.

Сайт BrokenBrake

Поделиться

24

Re: Проблема с кодировкой в почтовых уведомлениях

Супер, теперь всё отлично работает и у меня!

Поделиться

25

Re: Проблема с кодировкой в почтовых уведомлениях

Вобщем почтовая функция из поста #19 доказала свою рабочесть smile

Есть идея для развития — давать кодировку писем на выбор пользователя, так же как часовой пояс или стиль.
Исторически сложилось, что для Рунета главная кодировка писем koi-8r, в то же время если заголовок сформирован правильно, то большинство почтовых клиентов поймут и windows-1251 и utf-8.

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

Высказывайтесь пожалуйста.

Сайт artoodetoo

Поделиться