Странная кодировка при отсылке через mail()

Pustota

Новичок
Странная кодировка при отсылке через mail()

При переезде хостинга возникла такая проблема:
При отправке писем в формате HTML, письмо приходит с битой кодировкой. В поле "Тема", где встречаются русские буквы, все русские символы заменяются на знаки "XXXXX". А в теле письма все русские символы меняются на "???????". Причём, это видно и в web-mail'е, и в почтовой программе типа Outlook.
Вот кусок кода, но на предыдущем хостинге он работал корректно. Всё отображалось правильно.
PHP:
$message='<html><head><title>&nbsp;</title></head><body>Заказ номер '.$id.'
<table cellpadding="2" cellspacing="0" border="01" bordercolor="#00619C" width="50%" align="center">
<tr valign="top" bgcolor="#63A6FF">
<td colspan="2" class="h_td">Контактная информация</td>
</tr>
<tr>
    <td><b>ФИО</b></td>
    <td>'.$k_f.'</td>
</tr>
<tr>
    <td><b>Тел.</b></td>
    <td>'.$k_t.'</td>
</tr>
<tr>
    <td><b>E-mail</b></td>
    <td>'.$k_e.'</td>
</tr>
<tr>
    <td><b>Примечание</b></td>
    <td>'.$k_p.'</td>
</tr>
</table></body>
</html>';

$headers = "MIME-Version: 1.0\r\n";
$headers.= "Content-type: text/html; charset=windows-1251\r\n";
$headers.= "To: info <[email protected]>\r\n";
$headers.= "From: $k_f <$k_e>\r\n";
$subject = "Заказ с сайта";
mail("$email", $subject, $message, $headers);
Грешу на неправильно собранный PHP. Может, что-то забыл при сборке?

OC: Fedora Core 2, PHP 5.1.2, Apache 2.0.
 

Nogrogomed

Новичок
Откуда берутся данные?
Пробовал менять кодировку полученного письма?
 

440hz

php.ru
Pustota
а покажи заголовки пришедшего битого письма или отправь это письмо мне на мыло? [email protected]. вернее пусть скрипт отправит письмо?
 

Pustota

Новичок
Кодировку менял - не помогает. Данные из скрипта берутся. Я просто опустил оставшуюся часть.

Сейчас отправил себе на другой email. Пришло всё нормально. Не значит ли это, что проблема в почтовом сервере, а совсем не в PHP?
 

sidor

Новичок
Вообщето в заголовок письма нельзя пихать 8-битные символы. Читай rfc. Надо кодировать в base64 или quoted-printable Отсюда и XXXXXXX Некоторые почтовые системы заменяют все 8-битные символы на XXXXXXX Чтобы так не было - сделай
$subject = "=?Windows-1251?B?".base64_encode("Заказ с сайта")."?=";
и точно так же
$headers.= "From: =?Windows-1251?B?".base64_encode($k_f)."?= <$k_e>\r\n";
И еще добавь
$headers .= "Content-Transfer-Encoding: 8bit";
 

Pustota

Новичок
sidor
А само тело письма кодировать не надо? Там у меня тоже везде ????? вместо руссих символов.
И ещё, грешу на почтовый сервер (тоже сам ставил ;) ). Пробовал отослать на другое мыло - там все эти 8-битные символы нормально отобразились.
 

sidor

Новичок
Не надо само тело.
$headers .= "Content-Transfer-Encoding: 8bit";
Вот это уберет тебе знаки вопросов
А на почтовый сервер грешить не надо. Он все правильно делает :)
 

Pustota

Новичок
PHP:
$message='<html><head><title>&nbsp;</title>
<META content="text/html; charset=windows-1251" http-equiv=Content-Type>
</head><body>Заказ номер '.$id.'
<table cellpadding="2" cellspacing="0" border="01" bordercolor="#00619C" width="50%" align="center">
<tr valign="top" bgcolor="#63A6FF">
<td colspan="2" class="h_td">Контактная информация</td>
</tr>
<tr>
    <td><b>ФИО</b></td>
    <td>'.$k_f.'</td>
</tr>
<tr>
    <td><b>Тел.</b></td>
    <td>'.$k_t.'</td>
</tr>
<tr>
    <td><b>E-mail</b></td>
    <td>'.$k_e.'</td>
</tr>
<tr>
    <td><b>Примечание</b></td>
    <td>'.$k_p.'</td>
</tr>
</table></body>
</html>';

$headers = "MIME-Version: 1.0\r\n";
$headers.= "Content-type: text/html; charset=windows-1251\r\n";
$headers.= "Content-Transfer-Encoding: 8bit\r\n";
$headers.= "To: info <[email protected]>\r\n";
$headers.= "From: siteuser <$k_e>\r\n";
$subject = "=?Windows-1251?B?".base64_encode("Заказ с сайта")."?=";
mail($email, $subject, $message, $headers);
Переделал вот под такой вид.
Тема теперь отображается правильно, но сообщение всё равно состоит из одних ?????????.
И к тому же HTML не преобразует. И заголовки показывает в теле сообщения.
Есть вероятность, что всё это из-за того, что сообщение в headers запихивается. Но вроде синтаксис функции mail() я правильно написал...
Посмотрите, может кто что посоветует...
 

sidor

Новичок
Давай сюда все заголовки и начало тела письма. Чтоб попали твои заголовки и тег <html>
 

Pustota

Новичок
Вот что сыпется:
Код:
Return-Path: <[email protected]>
Received: from mail.site.ru ([unix socket])
         by hXXXXXXXXXXXXX (Cyrus v2.3.3) with LMTPA;
         Fri, 05 May 2006 13:02:44 +0400
X-Sieve: CMU Sieve 2.3
Received: by mail.site.ru (Postfix, from usXXXXXXXXXXXXXX)
        id 7A714F9E09B; Fri,  5 May 2006 13:02:44 +0400 (MSD)
To: [email][email protected][/email]
Subject: =?Windows-1251?B?x+Dq4Ocg8SBpbnRydXN0LXRvdXIucnU=?=
MIME-Version: 1.0
Message-ID: <cmu-lmtpd-18896-1146819764-0@hXXXXXXXXXXXXX>
Date: Fri, 05 May 2006 13:02:44 +0400

Content-type: text/html; charset=windows-1251
Content-Transfer-Encoding: 8bit
To: info <[email protected]>
From: siteuser <[email protected]>
Message-Id: <[email protected]>
Date: Fri,  5 May 2006 13:02:44 +0400 (MSD)


<html><head><title>.......
Причём, когда просто открываешь письмо, тело начинается со строки "Content-type: text/html; chars...."


Да, ещё странно то, что в web-интерфейсе почты русские символы в теле письма отображаются в знаках вопроса, а при сохранении письма на диск все русские буквы видны нормально.
 

sidor

Новичок
Попробуй убрать $headers = "MIME-Version: 1.0\r\n";
Есть у меня подозрение, что встретив второй заголовок MIME-Version: 1.0 почтовка (или еще кто-то) его заменяют на пустую строку и из-за этого у тебя твои заголовки попадают в тело письма...
 

Pustota

Новичок
Вау. Спасибо тебе огромное. Тепеь намного лучше стало. Теперь начал понимать HTML.
Но ещё в тело письма в самом начале HTML кидает строку:
Код:
Content-Transfer-Encoding: 8bit
To: info 
From: siteuser 
Message-Id: 
Date: Fri,  5 May 2006 13:50:01 +0400 (MSD)
От этого реально избавиться?
 

sidor

Новичок
Так блин...:) То засада, то измена. Давай опять все заголовки и код, как у тебя сейчас хедеры создаются. :)
 

Pustota

Новичок
Это заголовки:
Код:
Return-Path: <[email protected]>
Received: from mail.site.ru ([unix socket])
         by hXXXXXXXXXXXX (Cyrus v2.3.3) with LMTPA;
         Fri, 05 May 2006 13:50:01 +0400
X-Sieve: CMU Sieve 2.3
Received: by mail.site.ru (Postfix, from usXXXXXX)
        id 394BFF9E09B; Fri,  5 May 2006 13:50:01 +0400 (MSD)
To: [email][email protected][/email]
Subject: =?Windows-1251?B?x+Dq4Ocg8SBpbnRydXN0LXRvdXIucnU=?=
Content-type: text/html; charset=windows-1251
Message-ID: <cmu-lmtpd-24947-1146822601-0@hXXXXXXXXXXX>
Date: Fri, 05 May 2006 13:50:01 +0400
А это в начале HTML пришедшего (сделал с просмотра HTML кода):
Код:
Content-Transfer-Encoding: 8bit
To: info <[email protected]>
From: siteuser <[email protected]>
Message-Id: <[email protected]>
Date: Fri,  5 May 2006 13:50:01 +0400 (MSD)


<html>.....
Код:
PHP:
$message='Заказ номер '.$id.'
<table cellpadding="2" cellspacing="0" border="01" bordercolor="#00619C" width="50%" align="center">
<tr valign="top" bgcolor="#63A6FF">
<td colspan="2" class="h_td">Контактная информация</td>
</tr>
<tr>
    <td><b>ФИО</b></td>
    <td>'.$k_f.'</td>
</tr>
<tr>
    <td><b>Тел.</b></td>
    <td>'.$k_t.'</td>
</tr>
<tr>
    <td><b>E-mail</b></td>
    <td>'.$k_e.'</td>
</tr>
<tr>
    <td><b>Примечание</b></td>
    <td>'.$k_p.'</td>
</tr>
</table>';

$headers= "Content-type: text/html; charset=windows-1251\r\n";
$headers.= "Content-Transfer-Encoding: 8bit\r\n";
$headers.= "To: info <[email protected]>\r\n";
$headers.= "From: siteuser <$k_e>\r\n";
$subject = "=?Windows-1251?B?".base64_encode("Заказ с сайта")."?=";
mail($email, $subject, $message, $headers);
 

sidor

Новичок
Теперь попробуй так:
Вертай взад $headers = "MIME-Version: 1.0\r\n";
и в заголовках попробуй поменять все \r\n просто на \n
 

sidor

Новичок
Значит почтовка принимает последовательность \r\n как два перевода строки. Это конечно не есть гуд. Насколько я понял - это не соответствует rfc. Надо бы с почтовкой разбираться.
 
Сверху