Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Отправка email и вредная кодировка


Автор: InfMag 10.1.2008, 20:00
Вот пытаюсь отправить email, но почему-то тема письма на русском отображается иероглифами, а само письмо нормально, посмотрел вот заголовки других писем у себя на ящике, тема там выводится вот так:
Код

Subject: =?windows-1251?B?5+Dq4Oc=?=

Как это понимать??

Код

$email = '[email protected]';
$emlHeaders  = "From: User World <[email protected]>\r\n";
$emlHeaders .= "Reply-To: User World <[email protected]>\r\n";
$emlHeaders .= "Return-Path: User World <[email protected]\n";
$emlHeaders .= "Message-ID: User World <".time()."[email protected]>\r\n";
$emlHeaders .= "Date: ".date("r")."\r\n";
$emlHeaders .= "MIME-Version: 1.0\r\n";
$emlHeaders .= "X-Mailer: User World\r\n";
$emlHeaders .= "Content-Type: text/plain; charset=windows-1251\r\n";
$emlHeaders .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
mail($email, 'Тема письма русскими буквами', 'Текст сообщения', $emlHeaders)


Все ли тут верно??

Добавлено @ 20:03
Хотя постойте... Когда я отправил мессагу на яднекс, то все нормально отобразилось, а вот на серверный мэил нифига. В чем же тут проблема?? Может использовать UTF-8 или что-то в этом духе??

Автор: FractalizeR 11.1.2008, 21:15
Цитата

но почему-то тема письма на русском отображается иероглифами

Где именно она так отображается? Откуда вы ее просматриваете? Тело письма полностью с заголовками приведите здесь

Цитата
Subject: =?windows-1251?B?5+Dq4Oc=?=

Это нормальная ситуация

Автор: InfMag 14.1.2008, 13:19
Я изучил исходники и понял в чем проблема!
Вот то, что передает яндекс:
Код

Subject: =?windows-1251?B?5+Dq4Oc=?=

А вот то, что передает письмо отосланное с пхп
Код

Subject: Привет

Тоесть он не отмечает кодировку, а просто пишет на русском тему письма... Что делать? Как заставить его отмечать кодировку??

Автор: InfMag 14.1.2008, 14:30
Яндекс нормально выводит тему сообщения, наверное берет общую кодировку письма: Content-Type: text/plain; charset=windows-1251   а вот на других почтовых клиентах коракури :'(
Может какие-то свойства у функции mail() есть, чтобы обрабатывать тему письма учитывая кодировку...

Автор: GeneralElectric 14.1.2008, 14:58
InfMag, PHP и не должен  "отмечать кодировку" - он шлет ровно то, что ты ему даешь.
Cледовательно, надо написать код, который будет формировать строку нужного формата. Благо, это нетрудно - между двух последних вопросительных знаков вставить результат bas64_encode('Тема письма русскими буквами')

Автор: InfMag 15.1.2008, 13:20
GeneralElectric, попробовал, не помогло, говорит мол такой функции не знает. пхп 4.4.3 помоему
Код

Call to undefined function: bas64_encode()


Добавлено через 5 минут и 7 секунд
GeneralElectric, догнал, не bas, а base но теперь другая проблема...
Код

=?windows-1251?z+7x8vPv6Osg5+Dq4OcgIzE3ICjv8O7k8+ry7uIg4iDn4Org5+U6IDEp

вот что выводит, когда в меил я задаю тему:
Код

$emlSubject_ADM = '=?windows-1251?'.base64_encode('Поступил заказ #'.$number.' (продуктов в заказе: '.$products_count.')');

Выводит он эту муть в теме сообщения

Добавлено через 10 минут и 40 секунд
GeneralElectric, может приведешь работающий пример?

Автор: GeneralElectric 15.1.2008, 13:31
ну разумеется - ты же не соблюл формат.
посмотри на имеющийся у тебя заголовок повнимательнее.
ну, или перечитай мою рекомендацию

Автор: InfMag 15.1.2008, 13:45
GeneralElectric, не,.. я все внимательно посмотрел, вот гляди:
Если пишу 
Код

$emlSubject_ADM = '=?windows-1251?'.base64_encode('Поступил заказ #'.$number.' (продуктов в заказе: '.$products_count.')');

То выводит: =?windows-1251?z+7x8vPv6Osg5+Dq4OcgIzI1ICjv8O7k8+ry7uIg4iDn4Org5+U6IDEp
Если же 
Код

$emlSubject_ADM = '=?windows-1251?'.base64_encode('Поступил заказ #'.$number.' (продуктов в заказе: '.$products_count.')').'?';
 просто добавив вопросительный знак в конец
То выводит: =?windows-1251?z+7x8vPv6Osg5+Dq4OcgIzI1ICjv8O7k8+ry7uIg4iDn4Org5+U6IDEp??=
И непонятно откуда появляется еще в конце ?=

Автор: GeneralElectric 15.1.2008, 14:25
Нет. Ты невнимательно посмотрел.
И невнимательно прочитал. между двух последних вопросительных знаков 

Автор: InfMag 15.1.2008, 15:48
GeneralElectric, посмотри мой пример, я так и сделал... :(
Цитата

=?windows-1251? тут то самое место между двух вопросительных знаков??? ?=


Добавлено через 1 минуту и 49 секунд
GeneralElectric, хотя погоди, может ты имел виду это:
Цитата

=?windows-1251?B?  !!!  =?=

Автор: InfMag 16.1.2008, 16:17
О ДА! Великое чудо! smile Вот это сработало на ура, что аж плясать хочется:
Код

mail($email, '=?windows-1251?B?'.base64_encode('Поступил заказ #'.$number.' (продуктов в заказе: '.$products_count.')').'=?=', $emlMsg, $emlHeaders);


GeneralElectric, спасибо конечно большое, но жаль неясно разьясняешься, мог бы тыкнуть пальцем нежели чем направить искать между строк. Любой может сразу не догнать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)