Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2008-01-02 01:27:06

Freeman
Гость

email.php pun_email()

Продолжаем делиться кодом. wink Ничего не поделаешь, по мере причёсывания форума для ресурса приходится изменять код. Не в моих правилах скрывать хорошие решения.

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

#2 2008-01-02 06:51:10

hcs
Гость

Re: email.php pun_email()

Да, было дело с этой функцией.
artoodetoo не так давно уже переделал эту функцию, получилось очень хорошо: Проблема с кодировкой в почтовых уведомлениях

#3 2008-01-02 07:16:16

Freeman
Гость

Re: email.php pun_email()

Тем не менее, в ответ на обе мои темы от вас пришла примерно такая бНОПНЯ:

[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. Потому-то и попадают служебные заголовки в тело письма.

А вы сами что, сапожник без сапог? Теперь аж два варианта функции есть, а у вас до сих пор бНОПНЯ.

#4 2008-01-02 08:10:31

hcs
Гость

Re: email.php pun_email()

Теперь работает?

#5 2008-01-02 08:16:19

Freeman
Гость

Re: email.php pun_email()

Да, великолепно. А чья версия функции задействована, если не секрет?

#6 2008-01-02 08:48:36

hcs
Гость

Re: email.php pun_email()

Не секрет,  твоя ибо лаконичнее, и нуждается в обширных тестах.

#7 2008-01-09 22:25:39

roginovicci
Гость

Re: email.php pun_email()

Спасибо за мод функции. У меня пока работает нормально. Единственное, что, - я при редактировании съэкономил пару байтов, убрал лишние {} smile
оригинал

// 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));

#8 2008-03-31 15:26:45

jeder
Гость

Re: email.php pun_email()

Ребят, код писать в какой файл?
Сюда? activate_password.tpl

У меня вот такая проблема http://punbb.ru/viewtopic.php?pid=17567#p17567 поможет это мне?

#9 2008-03-31 16:48:06

Visman
Гость

Re: email.php pun_email()

jeder пишет:

Ребят, код писать в какой файл?

Код писать в файл email.php в каталоге include за место стоящей там функции function pun_mail($to, $subject, $message, $from = '')

Подвал доски

Под управлением FluxBB. Хостинг Hostens