Тема: email.php pun_email()
Продолжаем делиться кодом.
Ничего не поделаешь, по мере причёсывания форума для ресурса приходится изменять код. Не в моих правилах скрывать хорошие решения.
В оригинале функции (из всё той же сборки) была просто жуть какая-то, и по почте не меньшая жуть приходила. В коде двойное перекодирование: вначале в 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);
}
}