Не могу настроить кодировку для функции 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";
 
Помогите пожалуйста:
с формы на сайте введенные данные отправляются на мейл. Но кодировка - абакадабра...

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, то все ОК, но мне эта пересылка и на мобильный дублируется а там никак не прочитать...
 
Пробовал:
вместо base64_encode($message)
PHP:
$message = iconv("windows-1251", "KOI8-R",$message);

Тогда оутлук читатет сразу, но на мобильном все-равно иероглифы

Помогите пожалуйста..
 
С какой целью вы производите шаманские действия над $message перед отправкой?
 
С какой целью вы производите шаманские действия над $message перед отправкой?
Да мне сообщение должно продублироватся на мобилиный по смс. Но без шаманских действий приходят иероглифы вместо русских букв. Вот никак и не разберусь что нужно написать для правильного русского текста в мобильном смс.
 
Ну вы же писали что на телефон приходят иероглифы.
Как смс на телефон у вас связано с отправкой почты?
Какие требования к кодировке текста предъявляет используемый вами сервис отправки смс?
 
Ну вы же писали что на телефон приходят иероглифы.
Как смс на телефон у вас связано с отправкой почты?
Какие требования к кодировке текста предъявляет используемый вами сервис отправки смс?
У Киевстар (Украина) есть сервис приема смс с почты. Для этого адрес получателя пишу "38096041ХХХХ@sms.kyivstar.net"? Какие требования - это у Киевстара мне нужно узнать ? Вы это имеете ввиду.
 
1. Узнать какие требования есть к письмам отправляемые на ms.kyivstar.ne
2. Отправить самому себе просто корректное письмо, чтобы в Outlook открывалось и читалось без смены кодировки и других манипуляций
 
1. Узнать какие требования есть к письмам отправляемые на ms.kyivstar.ne
2. Отправить самому себе просто корректное письмо, чтобы в Outlook открывалось и читалось без смены кодировки и других манипуляций
Когда сам пишу с Outlook, то приходит отлично на русском, а с кода ПХП искажается. Сообщение и будет приходить только на один мой номер..

Как же правильно отправить (так как отправляет Outlook)?
 
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 )
 
Сверху