Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
Тема закрыта
Продолжаем делиться кодом. Ничего не поделаешь, по мере причёсывания форума для ресурса приходится изменять код. Не в моих правилах скрывать хорошие решения.
В оригинале функции (из всё той же сборки) была просто жуть какая-то, и по почте не меньшая жуть приходила. В коде двойное перекодирование: вначале в UTF-8, потом обратно, и зачем-то ещё в KOI8-R. Забористая, видать, трава у разработчиков.
На самом же деле при base64-кодировании достаточно между '=?' и '?B?' прописать кодировку из $lang_common['lang_encoding'], и никакой iconv не понадобится. Работает ведь!
Предложенный способ независим от языка - его можно и в официальную, англоязычную сборку включить. В коде закомментировано прибавление ' Mailer' (или чего у вас?) к названию форума - сильно криво на русском смотрится.
function pun_mail($to, $subject, $message, $from = '')
{
global $pun_config, $lang_common;
// Default sender/return address
if (!$from) {
$from = '=?'.$lang_common['lang_encoding'].'?B?'.base64_encode($pun_config['o_board_title']/*.' '.$lang_common['Mailer']*/).'?= <'.$pun_config['o_webmaster_email'].'>';
}
else
$from = trim(preg_replace('#[\n\r]+#s', '', $from));
// Do a little spring cleaning
$to = trim(preg_replace('#[\n\r]+#s', '', $to));
$subject = '=?'.$lang_common['lang_encoding'].'?B?'.base64_encode(trim(preg_replace('#[\n\r]+#s', '', $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='.$lang_common['lang_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'] != '')
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);
}
}
Редактировался Freeman (2008-01-02 09:08:51)
Да, было дело с этой функцией.
artoodetoo не так давно уже переделал эту функцию, получилось очень хорошо: Проблема с кодировкой в почтовых уведомлениях
Тем не менее, в ответ на обе мои темы от вас пришла примерно такая бНОПНЯ:
[mono]Date: Tue, 01 Jan 2008 20:51:10 -0700
MIME-Version: 1.0
Content-transfer-encoding: 8bit
Content-type: text/plain; charset=utf-8
X-Mailer: PunBB Mailer
hcs ОБРЙУБМ ПФЧЕФ Ч ФЕНЕ 'email.php pun_emal()', ОБ ЛПФПТХА чЩ, Ч УЧПЈ ЧТЕНС, РПДРЙУБМЙУШ ОБ ЖПТХНЕ. ч ЬФПК ФЕНЕ НПЦЕФ ВЩФШ ОЕУЛПМШЛП ПФЧЕФПЧ, ЬФП РЙУШНП СЧМСЕФУС МЙЫШ ХЧЕДПНМЕОЙЕН П ФПН, ЮФП, У НПНЕОФБ чБЫЕЗП РПУМЕДОЕЗП ЧЙЪЙФБ ОБ ЖПТХН, Ч ЬФПК ФЕНЕ РПСЧЙМЙУШ ОПЧЩЕ УППВЭЕОЙС.
уППВЭЕОЙЕ НПЦОП РТПЮЙФБФШ РП БДТЕУХ email.php pun_emal()
чЩ НПЦЕФЕ ПФРЙУБФШУС ПФ РПМХЮЕОЙС ХЧЕДПНМЕОЙК РП БДТЕУХ http://punbb.ru/misc.php?unsubscribe=1937
--
PunBB РП-ТХУУЛЙ рПЮФПЧЩК ТПВПФ
(оЕ ПФЧЕЮБКФЕ ОБ ЬФП УППВЭЕОЙЕ)
[/mono]
В варианте artoodetoo так и не понял нужды иметь две разные кодировки, если заголовки кодируются в base64? Не один чёрт, какой набор байт кодировать? У base64 кодировки нет - ею файлы передают.
Походу, в начальном варианте был ещё один баг: какой-то умник оканчивал служебные строки \n, потом прогонял это через автозамену на \r\n, а при формировании заголовков ещё раз разделял их \r\n. Потому-то и попадают служебные заголовки в тело письма.
А вы сами что, сапожник без сапог? Теперь аж два варианта функции есть, а у вас до сих пор бНОПНЯ.
Теперь работает?
Да, великолепно. А чья версия функции задействована, если не секрет?
Не секрет, твоя ибо лаконичнее, и нуждается в обширных тестах.
Спасибо за мод функции. У меня пока работает нормально. Единственное, что, - я при редактировании съэкономил пару байтов, убрал лишние {}
оригинал
// Default sender/return address
if (!$from) {
$from = '=?'.$lang_common['lang_encoding'].'?B?'.base64_encode($pun_config['o_board_title']/*.' '.$lang_common['Mailer']*/).'?= <'.$pun_config['o_webmaster_email'].'>';
}
else
$from = trim(preg_replace('#[\n\r]+#s', '', $from));
поменял на
// Default sender/return address
if (!$from)
$from = '=?'.$lang_common['lang_encoding'].'?B?'.base64_encode($pun_config['o_board_title']/*.' '.$lang_common['Mailer']*/).'?= <'.$pun_config['o_webmaster_email'].'>';
else
$from = trim(preg_replace('#[\n\r]+#s', '', $from));
Ребят, код писать в какой файл?
Сюда? activate_password.tpl
У меня вот такая проблема http://punbb.ru/viewtopic.php?pid=17567#p17567 поможет это мне?
Ребят, код писать в какой файл?
Код писать в файл email.php в каталоге include за место стоящей там функции function pun_mail($to, $subject, $message, $from = '')
Страницы 1
Тема закрыта