Скрипт на PHP, перестали отправляться сообщения на кириллице с сайта.

Автор Austin, 08-11-2012, 14:46:05

« назад - далее »

AustinTopic starter

Здравствуйте. Собсно, сабж: на некоем сайте имеется простенький скрипт для отправки сообщений из формы сообщений на странице для обратной связи с посетителями. До недавнего времени, сообщения с сайта написанные на кириллице нормально приходили на электронную почту, с недавнего времени, сообщения отправляются только в том случае, если они написаны на латинице. Если пишешь на кириллице, то выдает сообщение "ОШИБКА! Не введено имя", но имя и все обязательные поля заполнены. Возможно, это связано с тем, что хостер провел плановый апгрейд серверов и обновил версию PHP 5.3.13 до версии 5.4.3. Сам в программировании не силен, кто разбирается и кому не трудно, подскажите пожалуйста, что изменить в скрипте, чтобы сообщения написанные на кириллице отправлялись ? Скрипт в спойлере. Заранее благодарен. )

[spoiler] <?
$info = array (
         'name' => "ОШИБКА! Не введено имя.",
         'email' => "ОШИБКА! Неверно введен email.",
         'mess' => "ОШИБКА! Не введен текст сообщения.",);
       
  if(isset($_POST['submit'])) { $submit = $_POST['submit']; }
     if(isset($_POST['mess'])) { $mess = htmlspecialchars($_POST['mess']); }   
     if(isset($_POST['email'])) { $email = htmlspecialchars(trim($_POST['email'])); }
     if(isset($_POST['name'])) { $name = htmlspecialchars(stripslashes(trim($_POST['name']))); }
     
     if(empty($name)) { die($info{"name"}); }
     if(empty($mess)) { die($info{"mess"}); }
     if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { die($info{"email"}); }
 
     if(isset($submit))
     {
         $to = '............@yandex.ru';
         $subject = 'Сообщение';
         $mess = '
             Имя отправителя: '.$name.'
             Контактный email: '.$email.'
             Текст сообщения: '.$mess.'
             <br />';
     
         mail($to,$subject,$mess, "Content-type:text/html; Charset=windows-1251\r\n"."From: info@{$_SERVER['SERVER_NAME']}\r\n");
         echo 'Текст сообщения успешно отправлен. Ответ будет дан на протяжении 24 часов ';
         echo "<a href='index.htm'>Вернуться на главную страницу сайта.</a>";
     }
 
   ?>[/spoiler]


Haosame

Скорее всего ваш скрипт не получил данные в $name. Копать надо в сторону $_POST. Возможно в теле страницы для обратной связи стоит метод GET, либо метод прямо не указан.

Еще бывает что мешает enctype="text/plain" в form. Либо убрать совсем, либо со значениями поковыряться.

На сервере иногда возникает проблема - размер переменной, которая передается. В php.ini нужно проверить переменную post_max_size.

Вообще было бы не плохо глянуть на код формы, которую заполняют.
  •  


AustinTopic starter

Спасибо за отклик ! Данные "name" на странице с формой отправки сообщений указаны и выглядят так: <input type="text" name="name" size="30">, метод - "post". В общем, всё до недавнего времени работало как надо, сообщения на кириллице отправлялись без проблем. Вот сам код формы:

[spoiler]<form method="post" action="mailsender.php">
<table border="0">
<tr><td>
  Ваше имя : </td><td>
<input type="text" name="name" size="30"></td></tr><br>
<tr><td>e-mail :</td><td>
<input type="text" name="email" size="30"><td></tr><br></table>
<BR>
<BR>
<pre><img src="53.jpg">   <textarea name="mess" cols="90" rows="15">
Ввод текста:
</textarea>   <img src="48.jpg"></pre>
<input type="submit" name="submit" value="Отправить">
<input type="reset" value="Сброс">
</center>
</form>[/spoiler]

enctype="text/plain" вообще отсутствует, размер переменной - вряд ли, если в поле "name" имя пишется на кириллице, то выскакивает надпись "ОШИБКА! Не введено имя", если пишешь имя на латинице, указываешь e-mail адрес, но в форме "mess" пишешь даже одно единственное слово на кириллице - сообщение приходит пустое, без этого слова, указаны только имя и e-mail адрес. А вот если все пишешь на латинице, то всё приходит нормально. Так думаю, может дело в этой строке  [spoiler]if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { die($info{"email"}); }[/spoiler]  или в этой [spoiler] mail($to,$subject,$mess, "Content-type:text/html; Charset=windows-1251\r\n"."From: info@{$_SERVER['SERVER_NAME']}\r\n");[/spoiler] Может интерпретатор новой версии PHP их просто игнорирует или не так понимает ?

Haosame

Если такие проблемы с кириллицей, то проверьте на всякий случай заголовок страницы с формой отправки.
Должно быть что-то такое:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
Возможно что у вас кодировка странички не совпадает с кодировкой отправляемых данных. И там и там должно быть windows-1251.

А еще у меня в скрипте с отправкой почты была такая строчка:
"\nContent-type: text/plain; charset='windows-1251'\nContent-Transfer-Encoding: base64\n";
Это можно попробовать вписать в вашу
>> mail($to,$subject,$mess, "Content-type:text/html; Charset=windows-1251\r\n"."From: info@{$_SERVER['SERVER_NAME']}\r\n");
  •  

AustinTopic starter

Благодарю за ответ и за подсказки ! Всё перепроверил, пробовал замену строк, но к сожалению, ничего не изменилось. На сайте хостера следующая инфа:

[spoiler]...Дело в том, что с некоторых времён разработчики php решили отключить по умолчанию (в целях повышения безопасности) глобальную регистрацию переменных, переданных скрипту различными методами (GET, POST и т.д.). Если вы писали свои скрипты "в старом" стиле, полагаясь на автоматическую регистрацию переменных, и вы не хотите их переписывать, присвойте переменной register_globals значение On (в конфигурационном файле php.ini, который находится в директории ~/cgi-bin вашего домашнего каталога).[/spoiler]

Зашёл в панель управления, поменял значение - всё равно не работает, мало того, столо выдавать страницу ошибки 500. В общем, по электронной почте связался с хостером, включили журнал ошибок, буду разбираться дальше. Ещё раз благодарю за помощь ! )


Cradle

А можно взглянуть на условие при котором выводится "ОШИБКА! Не введено имя"? (сам код).

п.с. пальцем в небо: если кодировка в утф8 попробуйте изменить в утф-8 без БОМ или наоборот.
  •  

AustinTopic starter

Cradle, исходный код в первом посте темы под спойлером. Ситуацию эту разрулил давно и быстро, оказалось, что в коде была установлена переменная register_globals, которая не интерпретируется в новой версии PHP. Быстро нашел новый скрипт отправки e-mail сообщений, заточенный именно под новый интерпретатор, немного переделал его под себя, чуть подкорректировал форму отправки сообщений на сайте - все функционирует как надо. :)