Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Приходит примерно такое:
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
Редактировался niikto (2007-03-11 09:53:15)
Внимательно прочитал эту тему, но вопрос у меня все же остался.
У меня стоит стандартная сборка, кодировка 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?'
Редактировался mesemb (2007-06-13 11:30:29)
Действительно, с кодировками надо что-то делать. Стоит клиентом полный Аутглюк, так мало того, что в поле "From:" сплошные крокозяблы, он еще и UTF-8 не понимает автоматом в теле письма (там вааще ужос), приходится его ручками перетыкивать. Хорошо, если человек понимает, что надо сделать... Но ведь есть юзера при виде такой мессаги у которых крыша поедет -)
Вот как бы эту проблему побороть ?
потестируйте, пожалуйста, как ходят почтовые сообщения с http://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 секунды:
И вообще, сложно это изменить?
Редактировался BrokenBrake (2007-08-27 05:22:59)
текст 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.
Высказывайтесь пожалуйста.