Не работает mail(...) при кодировании темы в base64 с разбитием на части

Kela

Новичок
Не работает mail(...) при кодировании темы в base64 с разбитием на части

PHP Version 5.2.6
magic_quotes_gpc On
register_globals On

Столкнулся с такой проблемой на одном из хостингов. Уже два дня переписываюсь со службой поддержки, но результата ноль.
Суть проблемы: имеется скрипт, который отправляет письмо. Тема письма кодируется в base64. При этом, если следовать самым жестким стандартам RFC-2822 (Internet Message Format) и делать строки длиной не более 78 символов, то mail(...) письмо не отправляет и возвращает false. Если же не разбивать строки, то все работает прекрасно!

Хочу заметить, что тот же скрипт на другом хостинге с такой же версией PHP работает в обоих случаях. Вот скрипт ():

PHP:
<?
// $subject_= "Это немного длинная тема сообщения";

echo "Если не разбивать тему, а отправлять все одним куском: ";

$subject = "=?UTF-8?B?0K3RgtC+INC90LXQvNC90L7Qs9C+INC00LvQuNC90L3QsNGPINGC0LXQvNCwINGB0L7QvtCx0YnQtdC90LjRjw==?=";

$message ="это мегатестовое сообщение";

$header="To: [email protected]\n";
$header.="Subject: ".$Subject."\n";
$header.="Mime-Version: 1.0\n";
$header.="Content-Type: text/plain; charset=\"UTF-8\"\n";
$header.="Content-Transfer-Encoding:base64\n";

$body.=base64_encode($message)."\n";

if( mail("[email protected]",$subject,$body,$header)) { echo "<b style=\"color: green;\">send!</b>"; } else {echo "<b style=\"color: red;\">not send!</b>";}

echo "<br />";

/////////////////////////////////////////////////////

$subject = "=?UTF-8?B?0K3RgtC+INC90LXQvNC90L7Qs9C+INC00LvQuNC90L3QsNGPINGC0LXQvNCw?=";
$subject .= "\n";
$subject .= "=?UTF-8?B?INGB0L7QvtCx0YnQtdC90LjRjw==?=";

$message ="это мегатестовое сообщение";

$header="To: [email protected]\n";
$header.="Subject: ".$Subject."\n";
$header.="Mime-Version: 1.0\n";
$header.="Content-Type: text/plain; charset=\"UTF-8\"\n";
$header.="Content-Transfer-Encoding:base64\n";

$body.=base64_encode($message)."\n";

echo "Разбиваем тему сообщения на части, каждая из которых не привышает 78 байт: ";

if( mail("[email protected]",$subject,$body,$header)) { echo "<b style=\"color: green;\">send!</b>"; } else {echo "<b style=\"color: red;\">not send!</b>";}

?>
Буду благодарен за любую информацию!
 

DiMA

php.spb.ru
Команда форума
1. разбивать действительно надо
2. не через \n, как у тебя, а через пробел или иной разделитель (могу ошибиться, не помню уже, логика в 78 символах - сделать как раз новую строку)

Запусти Бат, напиши себе письмо с длинной темой, посмотри исходник письма и разберись самостоятельно (неужели не допереть?)
 

Crys

Двинутый новичок
2. не через \n, как у тебя, а через пробел или иной разделитель (могу ошибиться, не помню уже, логика в 78 символах - сделать как раз новую строку)
Через \n
 

DiMA

php.spb.ru
Команда форума
не \n, иначе бы работало
нафиг спорить, я же сказал, как ответ найти

вот правильный ответ

PHP:
function mail_str_decode($str) {
    preg_match_all("!=\?([a-z\d-]+)\?(.)\?([\\x20-\\x7E]*?)\?=([ \r\n\t]+(?==\?))?!is",$str,$ok);
    if (count($ok[1]))
    foreach ($ok[1] as $k=>$v) {
        if (sl($ok[2][$k])=='b') $text=base64_decode($ok[3][$k]);
        elseif (sl($ok[2][$k])=='q') $text=quoted_printable_decode($ok[3][$k]);
        else continue;
        normal_charset($ok[1][$k], &$text);
        $str=str_replace($ok[0][$k], $text, $str);
    }
    $str=preg_replace("![ \r\n\t]+!is"," ",$str);
    return $str;
}

function mail_str_encode($str) {
    $str=trim($str);
    if (preg_match("!^[\\x20-\\x7E]+$!is",$str) || $str=="") return $str;
    $out="";
    for ($i=0; $i<strlen($str); $i+=60) {
        $tmp=substr($str,$i,60);
        if ($i>0) $out.="\r\n\t";
        $out.="=?Windows-1251?b?".base64_encode($tmp)."?=";
    }
    return $out;
}
 

Crys

Двинутый новичок
DiMA
Угу.. Я сразу не понял, что ты имел ввиду. Подумал, что строки не нужно через \n разделать.. Потом дошло, что ты имел ввиду то, что после него должен идти пробел/таб..

-~{}~ 25.03.09 23:58:

DiMA
Тока у меня к тебе вопросы по твоим функциям - почему разбивка идет по 100 символов, а не по 78 и насколько я помню спецификацию, имена полей тоже должны входить в эту длину.
Типа,
Subject: 78символов - это уже не по спеке...
 

Kela

Новичок
Автор оригинала: DiMA
Запусти Бат, напиши себе письмо с длинной темой, посмотри исходник письма и разберись самостоятельно (неужели не допереть?)
Спасибо за эмоциональный ответ! Но ФАКи я читать умею. Кроме того, вы не внимательно прочили мое исходное сообщение: на других хостингах приведенный скрипт работает без проблем!
Хостер решил проблему и сейчас этот скрипт работает без каких-либо изменений! Я попросил поделиться рецептом решения, если они это сделают - я не замедлительно выложу его здесь.
В любом случае, спасибо вам, что не остались безразличны!
 

DiMA

php.spb.ru
Команда форума
Crys
где ты 100 нашел?
60 после base64 выдаст больше 78? хм...

Kela
> вы не внимательно прочили мое исходное сообщение: на других хостингах приведенный скрипт работает без проблем!

Да мне по барабану че ты там делаешь и где оно работает... Я сказал - как сделать правильно. Все остальное - в топку. Либо делаешь правильно (подсматриваешь за почтовиком и повторяешь как он), либо споришь в корзине.
 

Kela

Новичок
DiMA
Ответ от хостреа: "Это был была проблема в самом php. Сейчас мы обновили php и все заработало".
 
Сверху