Jump to content
  • 0

хелп.форма обратной связи, проблемма с кодировкой


Andrylik
 Share

Question

Месяца два назад решил сделать сайт, начинал с нуля (в школе даже информатики не было), почитал хтмл, цсс, шо то вроде получилось , теперь стал вопрос в обратной связи, полистал пхп , сделал форму, работает , но на почту приходят крокозябли.

вот обработчик

<?php

$UserName=$_POST ["UserName"];

$UserEmail=$_POST ["UserEmail"];

$marka=$_POST ["marka"];

$model=$_POST ["model"];

$god=$_POST ["god"];

$UserComments=$_POST ["UserComments"];

$AdminMessage = convert_cyr_string($AdminMessage,"w","k");

$AdminMessage = "Имя : $UserName\n";

$AdminMessage .= "Почта : $UserEmail\n";

$AdminMessage .= "Марка : $marka\n";

$AdminMessage .= "Модель : $model\n";

$AdminMessage .= "Год : $god\n";

$AdminMessage .= "Комментарии :\n";

$AdminMessage .= "$UserComments\n";

mail("$SiteEmail", "$SiteName", $AdminMessage, "From: $UserEmail");

?>

перечитал форумы, перепробовал много вариантов,

при помощи этой строчки

$AdminMessage = convert_cyr_string($AdminMessage,"w","k");

добился того, что письма приходят через раз (раз нормально , раз с крокозяблями) , не зависимо от содержания,

но хотелось бы 100% результат.

Уважаемые программеры , помогите советом, что не так ?

Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 0

convert_cyr_string всего-лишь конвертирует кирилицу из одной кодировки в другую. И к почте она отношения не имеет. Вся проблема в том, что не посылаются заголовки, в которых было бы указана кодировка и тип контента. Стоит сделать приблизительно так:

$UserName=$_POST ["UserName"];
$UserEmail=$_POST ["UserEmail"];
$marka=$_POST ["marka"];
$model=$_POST ["model"];
$god=$_POST ["god"];
$UserComments=$_POST ["UserComments"];


//$AdminMessage = convert_cyr_string($AdminMessage,"w","k");
$AdminMessage = "Имя : $UserName\n";
$AdminMessage .= "Почта : $UserEmail\n";
$AdminMessage .= "Марка : $marka\n";
$AdminMessage .= "Модель : $model\n";
$AdminMessage .= "Год : $god\n";
$AdminMessage .= "Комментарии :\n";
$AdminMessage .= "$UserComments\n";
$headers = array();
$headers[] = "Content-Type:text/plain;charset=windows-1251";//здесь нужно указать нужную кодировку
$headers[] = "Content-Transfer-Encoding:8bit";
mail("$SiteEmail", "$SiteName", $AdminMessage, "From: $UserEmail", implode(chr(13).chr(10),$headers));

Link to comment
Share on other sites

  • 0

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

1. В какой кодировке приходят данные из массива $_POST

2. В какой кодировке сам хтмл/рнр - документ

3. В какой кодировке ты пытаешься отправлять письмо, в данном случае ты не указываешь, а значит ставится кодировка по умолчанию.

Видать где-то данные в одной кодировке, а отправляться пытаются в другой, вероятней всего эти 2 кодировки ср-1251 и ЮТФ-8. Поскольку я привык работать с UTF-8, приведу действия, которые стоит в 1ю очередь сделать:

1. В хтмл-коде страницы с формой пишем:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

2. В рнр-коде скрипта пишем:

header('Content-type: text/html; charset=utf-8');

3. Для отправки писем я юзаю вот такую ф-цию:

/** ********************************************************************************
*************
* Функция отправляет письмо
*
* @param string $from Адрес отправителя
* @param string $to Адрес получателя
* @param string $subject Тема письма
* @param string $message Текст сообщения
* @return bool
*/
function sendMail($from, $to, $subject, $message) {

// Меняем кодировку темы
$subject = "=?UTF-8?B?" . base64_encode($subject) . "?=\n";

// Подготавливаем заголовки
$headers="From: " . $from . "\n"
. "Content-Type: text/plain; charset=UTF-8; format=flowed\n"
. "MIME-Version: 1.0\n"
. "Content-Transfer-Encoding: 8bit\n";

// Отправляем письмо
$result = mail($to, $subject, $message, $headers);

// Возвращаем логический результат отправки письма
return $result;
}/** ********************************************************************************
***********/

$headers="From: " . $from . "\n"

. "Content-Type: text/plain; charset=UTF-8; format=flowed\n"

Это собственно ключевое место в плане кодировок.

Вот если все вышеперечисленное не поможет, тады будем разбираться. Ежели хочется оставить все в ср-1251, то видать надо заменить UTF-8 везде на windows-1251 или ср-1251, не помню точно.

Edited by Dima_2015
Link to comment
Share on other sites

  • 0

Попробуйте

$subject = iconv('WINDOWS-1251', 'koi8-r', $subject);
$message = iconv('WINDOWS-1251', 'koi8-r', $message);

$subject - тема,

$message - сообщение.

Когда-то при реализации отправки почты с сайта тоже столкнулся с проблемой кодировки. convert_cyr_string не помогла, тогда я использовал функцию iconv. Если у вас на сайте кодировка не WINDOWS-1251, замените на нужную.

Link to comment
Share on other sites

  • 0

Огромное СПАСИБО за то , что, не оставили без внимания, предложили свои версии и где именно почитать .

Воспользовался советом xPoint ,внес небольшую корректировку - сделал перенос строки (без него письма не доходили), теперь обработчик имеет следующий вид:

<?php

$UserName=$_POST ["UserName"];

$UserEmail=$_POST ["UserEmail"];

$marka=$_POST ["marka"];

$model=$_POST ["model"];

$god=$_POST ["god"];

$UserComments=$_POST ["UserComments"];

$AdminMessage = "Имя : $UserName\n";

$AdminMessage .= "Почта : $UserEmail\n";

$AdminMessage .= "Марка : $marka\n";

$AdminMessage .= "Модель : $model\n";

$AdminMessage .= "Год : $god\n";

$AdminMessage .= "Комментарии :\n";

$AdminMessage .= "$UserComments\n";

$headers = array();

$headers[] = "Content-Type:text/plain;charset=windows-1251";

$headers[] = "Content-Transfer-Encoding:8bit";

mail("$SiteEmail", "$SiteName", $AdminMessage, "From: $UserEmail \r\n". implode(chr(13).chr(10),$headers));

?>

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy