Тема: Проблема с кодировкой в почтовых уведомлениях
Приходит примерно такое:
Subject: Сообщение в теме: 'мЮПСВМХЙХ'
User написал ответ в теме '', на которую Вы, в своё время, подписались на форуме.
Как быть? Сборка ваша.
|
Фонд моральной поддержки |
|
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
PunBB по-русски → Установка и настройка → Проблема с кодировкой в почтовых уведомлениях
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Приходит примерно такое:
Subject: Сообщение в теме: 'мЮПСВМХЙХ'
User написал ответ в теме '', на которую Вы, в своё время, подписались на форуме.
Как быть? Сборка ваша.
Тож самое, тока сборка своя, но юзаю UTF-8. Как понимаю, надо перебодяжить функцию отправки сообщения, чтоб в заголовок(точнее в тему, которая subj) добавлять кодировку?
Кстати, тема сообщения в уведомлении с этого форума пришла нормальная сейчас, но отправитель такой: PunBB ??-?????? ???????? ????? <hcs @ mail.ru>
Исправления в нашей сборке затрагивают конвертирование темы в кои-8. Эти изменения еще не вошли в архив.
Изменения отправителя пока не проводились вообще.
Нельзя ли их выложить здесь, раз в архив пока не вошли?
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
Большое тебе спасибо!
имею дело с 2-мя сборками, и вот немного изменил опытным путем твою доделку:
В сборке Dexus есть выбор для пользователя - либо ему придет просто уведомление о новом посте в теме, на кою он подписан, либо ему придет и содержание поста либо ему придет содержание в виде html
так вот я поэкспериментировал, и оказалось сперва, что в денвере у меня iconv не работает
- поэтому пришлось экспериментировать уже на сервере.
В при веденом выше коде есть 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
Внимательно прочитал эту тему, но вопрос у меня все же остался.
У меня стоит стандартная сборка, кодировка win1251, но в сообщениях с уведомлениями о новых постах тема всегда нечитабельна. Подскажите, как исправить это? Если возможно привести прямо строчки кода, буду благодарен -- в php не понимаю ничего.
а ты чем почту получаешь?
ато зебат касячит то что понимает мозилла тундерберд
$subject = '=?KOI8-R?B?'.base64_encode(trim(preg_replace('#[\n\r]+#s', '', $subject)))."?=\n";Почту проверяю Оперой. Действительно, Tunderbird читает те же письма нормально, и интерфейс Gmail, кстати, тоже. Так что возможно, что это косяк самой программы.
hcs, прошу прощения, ну куда это нужно вставлять? :-)
P.S. Кстати, уведомление с вашего форума пришло вот от такого адресата: "=?KOI8-R?B?IlB1bkJCINDPLdLV09PLySDwz97Uz9fZyiDSz8LP1CIgPGhjc0BtYWlsLnJ1Pg==?=@wwwhosting.tomica.ru". Это нормально?
Только лучше не
'=?KOI8-R?B?'а
'=?'.$lang_common['lang_encoding'].'?B?'Действительно, с кодировками надо что-то делать. Стоит клиентом полный Аутглюк, так мало того, что в поле "From:" сплошные крокозяблы, он еще и UTF-8 не понимает автоматом в теле письма (там вааще ужос), приходится его ручками перетыкивать. Хорошо, если человек понимает, что надо сделать... Но ведь есть юзера при виде такой мессаги у которых крыша поедет -)
Вот как бы эту проблему побороть ?
потестируйте, пожалуйста, как ходят почтовые сообщения с master.1wd.ru/
зарегистрируйтесь и тестируйте.
для русского языка использую конвертацию в koi8-r ( через iconv() )
еще есть вот такое:
$subject = '=?'.$encoding.'?B?'.base64_encode($subject).'?=';здесь $encoding == 'koi8-r' для русского языка, для нерусского utf-8
работает вродебы в обоих случаях ![]()
Честно говоря, так и не вкурил, что и как надо делать
И почему так модна устаревшая KOI.
Мне (и, наверно, всем пользователям форума) письма приходят вот так:

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

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

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

Добавлено спустя 2 минуты 6 секунд:
Я так понимаю, что "конверт" письма и его содержание отправляются в разных кодировках. Или что? Я вообще с почтой почему-то нифига не разбираюсь. Но разберусь, если вы подскажете, где это все менять. Я лишь примерно представляю.
Добавлено спустя 2 минуты 24 секунды:
И вообще, сложно это изменить?
текст 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',Не понимаю все же, зачем одновременно две кодировки? 8-о
Добавлено спустя 29 секунд:
То есть твой вариант тоже будет заголовки отсылать в одной, а тело в другой?
нет.
1) ты задал вопрос "могут ли", я ответил "да, могут".
2) для экскрементов дал тебе скрипт в котором можно испытать различные кодировки отправлений не меняя кодировки форума. достаточно изменить строку в языковом файле.
может быть какой-то вариант окажется оптимальным.
Понял, спасибо. Попробую.
artoodetoo, огромное спасибо! Работает отлично.
Супер, теперь всё отлично работает и у меня!
Вобщем почтовая функция из поста #19 доказала свою рабочесть
Есть идея для развития — давать кодировку писем на выбор пользователя, так же как часовой пояс или стиль.
Исторически сложилось, что для Рунета главная кодировка писем koi-8r, в то же время если заголовок сформирован правильно, то большинство почтовых клиентов поймут и windows-1251 и utf-8.
Проблемы возникают с веб-клиентыми почты, в первую очередь буржуйскими. Мы не можем сделать одну универсальную настройку на всех, поэтому пусть каждый выбирает сам, такое мое IMHO.
Высказывайтесь пожалуйста.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
PunBB по-русски → Установка и настройка → Проблема с кодировкой в почтовых уведомлениях
Сгенерировано за 0.109 секунды (79% PHP — 21% БД) 11 запросов к базе данных
Технологии с открытым исходным кодом, несомненно, обладают серьезным преимуществом над аналогичными продуктами, распространяемыми по ограниченным лицензиям. И совершенно неважно, что это. Возможно это:
Впрочем, неважно. Что бы это ни было, важно всячески поощрять и поддерживать Open Source в любом виде. Тем более, что вы знаете, PunBB распространяется по лицензии GPL/GNU. И спасибо за внимание.