Не могу настроить кодировку для функции MAIL()

псаломщик

Новичок
Написал скрипт для отправки с формы сайта почтового сообщения. Письма отправляются - все доходит. Сложность в том, что тема письма видна в первом и во втором случае, в третьем (с windows-1251) - приходят кракозебры. Тело письма приходит с кракозебрами во всех трех случаях (и в utf-8, и в koi8-r, и в windows-1251). Что поправить?
PHP:
<?
//сохраняем данные из пост в простые переменные, которые мы выбираем сами
if (isset($_POST['FIO'])) {$FIO =$_POST['FIO']; };
if (isset($_POST['firm'])) {$firm =$_POST['firm'];};
if (isset($_POST['telefon'])) {$telefon=$_POST['telefon']; };
if (isset($_POST['mail'])) {$mail =$_POST['mail']; };
if (isset($_POST['address'])) {$address=$_POST['address']; };
if (isset($_POST['order'])) {$order =$_POST['order']; };
if (isset($_POST['code'])) {$code =$_POST['code']; };
$to='[email protected]';
$subject='Заказ';
$from='[email protected]';

$charset='utf-8';
$subject.=' utf-8';
$subject='=?'.$charset.'?b?'.base64_encode($subjec t).'?=';
$body='Имя: '.$FIO.'\nFirm: '.$firm.'\nPhone: '.$telefon.'\nE-mail: '.$mail."\nAddress: ".$address."\nOrder:\n".$order;
$from='=?'.$charset.'?b?'.base64_encode($from).'?= ';
$headers ="Content-type: text/plain; charset='.$charset.'\r\n";
$headers.='From: <'.$from.'>\r\n';
$headers.='MIME-Version: 1.0\r\n';
$headers.='Date: '.date('D, d M Y h:i:s O').'\r\n';
$headers ="Content-type: text/plain; charset='.$charset.'\r\n";
mail($to,$subject,$body,$headers);

$subject='Заказ';
$charset='koi8-r';
$subject.=' koi8-r';
$subject=convert_cyr_string($subject,"w","k");
$subject='=?'.$charset.'?b?'.base64_encode($subjec t).'?=';
$body='Имя: '.$FIO.'\nFirm: '.$firm.'\nPhone: '.$telefon.'\nE-mail: '.$mail."\nAddress: ".$address."\nOrder:\n".$order;
$body=convert_cyr_string($body,"w","k");
$from=convert_cyr_string($from,"w","k");
$headers ="Content-type: text/plain; charset='.$charset.'\r\n";
$headers.='From: <'.$from.'>\r\n';
$headers.='MIME-Version: 1.0\r\n';
$headers.='Date: '.date('D, d M Y h:i:s O').'\r\n';
$headers ="Content-type: text/plain; charset='.$charset.'\r\n";
mail($to,$subject,$body,$headers);

$subject='Заказ';
$charset='windows-1251';
$subject.=' windows-1251';
$subject='=?'.$charset.'?b?'.base64_encode($subjec t).'?=';
$body='Имя: '.$FIO.'\nFirm: '.$firm.'\nPhone: '.$telefon.'\nE-mail: '.$mail."\nAddress: ".$address."\nOrder:\n".$order;
$from='=?'.$charset.'?b?'.base64_encode($from).'?= ';
$headers ="Content-type: text/plain; charset='.$charset.'\r\n";
$headers.='From: <'.$from.'>\r\n';
$headers.='MIME-Version: 1.0\r\n';
$headers.='Date: '.date('D, d M Y h:i:s O').'\r\n';
$headers ="Content-type: text/plain; charset='.$charset.'\r\n";
mail($to,$subject,$body,$headers);

header('Location: index.php');
?>
в основном файле кодировка задана через
PHP:
header('Content-type: text/html; charset=utf-8');
 

С.

Продвинутый новичок
Для начала неплохо бы открыть полученное письмо в "сыром" виде и исследовать, что же там приходит.
 

псаломщик

Новичок
С., каким образом предлагаешь исследовать?

В составе проблемы при отправке E-mail есть некоторые изменения:
Файл скрипта для формы отправки сообщения был в ANSI. Пересохранил его в UTF-8 - ситуация зеркально отобразилась - теперь тема сообщения читается только в первом случае (при кодировке UTF-8). В остальных случаях в теме выходят кракозебры. Но беда в том, что в теле письма по-прежнему во всех трех случаях получаются кракозебры...
 

С.

Продвинутый новичок
С., каким образом предлагаешь исследовать?
Путем визуального осмотра зрительными сенсорами, расположеными на фронтальной части головы.
Вот только один сомнительный кусок кода, а что там может быть еще?
PHP:
$headers ="Content-type: text/plain; charset='.$charset.'\r\n";
$headers.='From: <'.$from.'>\r\n';
$headers.='MIME-Version: 1.0\r\n';
$headers.='Date: '.date('D, d M Y h:i:s O').'\r\n';
$headers ="Content-type: text/plain; charset='.$charset.'\r\n";
Дополнительное замечание: кодировку надо ставить ту, в которой реально находится текст, а не перебирать, абы попадешь.
 

псаломщик

Новичок
С., хорошее зрение! Со зрительными сенсорами у вас все в порядке :)
Я тоже примерно в это же время обратил внимание на этот кусок. Неаккуратно проставленные двойные и одинарные кавычки приводили к тому, что $charset не читалась как переменная PHP, а шла текстом - в результате кодировка письма вообще проставлена не была. Но я пришел к этому другим путем - изучая параметры доставленных писем - в них неправильно ставилась кодировка...

Интересная особенность в строке
PHP:
$body='Имя: '.$FIO.'\nFirm: '.$firm.'\nPhone: '.$telefon.'\nE-mail: '.$mail."\nAddress: ".$address."\nOrder:\n".$order;
при чтении письма символ \n в одинарных кавычках игнорируется и строка идет себе дальше, а при двойных все нормально - осуществляется перенос строки...
 

псаломщик

Новичок
PHP:
  $headers ='Content-type: text/plain; charset='.$charset.' \r\n';     
  $headers.='From: <'.$from.'>\r\n'; 
  $headers.='MIME-Version: 1.0\r\n'; 
  $headers.='Date: '.date('D, d M Y h:i:s O').'\r\n';
  $headers.='Content-type: text/plain; charset='.$charset.' \r\n';
теперь вроде бы нет...
 

С.

Продвинутый новичок
А если протереть сенсоры и на переферии, то еще ошибки можно увидеть.
 

псаломщик

Новичок
Пойду протирать сенсоры. Заменил одинарные кавычки на двойные - письма стали читаться на сервере mail.ru, где до этого не читались.
PHP:
  $headers ="Content-type: text/plain; charset=$charset\r\n";     
  $headers.="From: <$from>\r\n"; 
  $headers.="MIME-Version: 1.0\r\n"; 
  $headers.="Date: ".date('D, d M Y h:i:s O')."\r\n";
  $headers.="Content-type: text/plain; charset=$charset\r\n";
 

Игорь Z

Новичок
Помогите пожалуйста:
с формы на сайте введенные данные отправляются на мейл. Но кодировка - абакадабра...

PHP:
  $phone =  substr(htmlspecialchars(trim($_POST['phone'])), 0, 32);
  $adress = substr(htmlspecialchars(trim($_POST['adress'])), 0, 200);
  $datetime = substr(htmlspecialchars(trim($_POST['datetime'])), 0, 100);

$message = "$phone \n$adress \n$datetime";
$message = "=?windows-1251?B?" . base64_encode($message) . "?=";

 mail($mailto, "$sitename $name",  $message, "From: $email");
	header("Location: " . $returnpage);
Приходит текст:
=?windows-1251?B?=?windows-1251?B?MDk5IDE1MS02NS0xMSAKw+7j7uv/IDLiIAoxMS8wMi8yMDEzIDEzOjQz?=

Если без base64_encode($message) и в Outlook я меняю кодировку на Windows, то все ОК, но мне эта пересылка и на мобильный дублируется а там никак не прочитать...
 

Игорь Z

Новичок
Пробовал:
вместо base64_encode($message)
PHP:
$message = iconv("windows-1251", "KOI8-R",$message);
Тогда оутлук читатет сразу, но на мобильном все-равно иероглифы

Помогите пожалуйста..
 

Gremboloid

инженера Гр...
С какой целью вы производите шаманские действия над $message перед отправкой?
 

Игорь Z

Новичок
С какой целью вы производите шаманские действия над $message перед отправкой?
Да мне сообщение должно продублироватся на мобилиный по смс. Но без шаманских действий приходят иероглифы вместо русских букв. Вот никак и не разберусь что нужно написать для правильного русского текста в мобильном смс.
 

Gremboloid

инженера Гр...
Ну вы же писали что на телефон приходят иероглифы.
Как смс на телефон у вас связано с отправкой почты?
Какие требования к кодировке текста предъявляет используемый вами сервис отправки смс?
 

Игорь Z

Новичок
Ну вы же писали что на телефон приходят иероглифы.
Как смс на телефон у вас связано с отправкой почты?
Какие требования к кодировке текста предъявляет используемый вами сервис отправки смс?
У Киевстар (Украина) есть сервис приема смс с почты. Для этого адрес получателя пишу "38096041ХХХХ@sms.kyivstar.net"? Какие требования - это у Киевстара мне нужно узнать ? Вы это имеете ввиду.
 

Gremboloid

инженера Гр...
1. Узнать какие требования есть к письмам отправляемые на ms.kyivstar.ne
2. Отправить самому себе просто корректное письмо, чтобы в Outlook открывалось и читалось без смены кодировки и других манипуляций
 

Игорь Z

Новичок
1. Узнать какие требования есть к письмам отправляемые на ms.kyivstar.ne
2. Отправить самому себе просто корректное письмо, чтобы в Outlook открывалось и читалось без смены кодировки и других манипуляций
Когда сам пишу с Outlook, то приходит отлично на русском, а с кода ПХП искажается. Сообщение и будет приходить только на один мой номер..

Как же правильно отправить (так как отправляет Outlook)?
 

Gremboloid

инженера Гр...
Outlook не делает лишних телодвижений типа:
PHP:
$message = "=?windows-1251?B?" . base64_encode($message) . "?=";
1. Кодировка тела письма указывается с помощью заголовка (Content-type ...) , было ранее в теме.
2. Кодировка указанная в Content-type должна совпадать с кодировкой текста в $message
2. Если тело письма должно быть закодировано в base64 само тело кодируется ( $message = base64_encode($message) ; ) а в заголовки письма добавляется информация о том что тело закодировано с помощью заголовка ( Content-Transfer-Encoding: base64 )
 
Сверху