[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Форма обратной связи и кодировка
region029
Здравствуйте, я знаю, что тема затёрта до дыр, но при всей имеющейся информации, я не смог устранить проблему. В общем поставил форму обратной связи на статический сайт (чистый HTML). и при отправке данных с формы кириллицей на почту приходят "иероглифы", причём тело письма в порядке, а вот заголовок, имя отправителя нечитаемы. Выглядит письмо вот так (на gmail):

user posted image

Форма обратной связи состоит из 2-х основных php-файлов: 1 - index.php - в нём непосредственно находится форма и кстати HTML метатег charset с кодировкой utf-8; 2 - submit.php - в нём обрабатываются данные и формируется письмо. Смотрел кодировку файлов с помощью NP++ - везде определяется как utf-8. На хабре нашёл вот такую вещь - $subject = "=?windows-1251?b?". base64_encode($_POST[«subject»]). "?=";, то есть тема сообщения кодируется перед отправкой с использованием кодировки windows-1251, я понимаю, конечно, что в моём случае нужно utf-8, но как применить данный метод ко всем переменным скрипта, которые формируют письмо, не знаю. Привожу код из submit.php:


<?php

/* config start */

$emailAddress = 'вводим свой e-mail';

/* config end */


require "phpmailer/class.phpmailer.php";

session_name("fancyform");
session_start();


foreach($_POST as $k=>$v)
{
if(ini_get('magic_quotes_gpc'))
$_POST[$k]=stripslashes($_POST[$k]);

$_POST[$k]=htmlspecialchars(strip_tags($_POST[$k]));
}


$err = array();

if(!checkLen('name'))
$err[]='The name field is too short or empty!';

if(!checkLen('email'))
$err[]='The email field is too short or empty!';
else if(!checkEmail($_POST['email']))
$err[]='Your email is not valid!';

if(!checkLen('subject'))
$err[]='You have not selected a subject!';

if(!checkLen('message'))
$err[]='The message field is too short or empty!';

if((int)$_POST['captcha'] != $_SESSION['expect'])
$err[]='The captcha code is wrong!';


if(count($err))
{
if($_POST['ajax'])
{
echo '-1';
}

else if($_SERVER['HTTP_REFERER'])
{
$_SESSION['errStr'] = implode('<br />',$err);
$_SESSION['post']=$_POST;

header('Location: '.$_SERVER['HTTP_REFERER']);
}

exit;
}


$msg=
'Name: '.$_POST['name'].'<br />
Email: '
.$_POST['email'].'<br />
IP: '
.$_SERVER['REMOTE_ADDR'].'<br /><br />

Message:<br /><br />

'
.nl2br($_POST['message']).'

'
;


$mail = new PHPMailer();
$mail->IsMail();

$mail->AddReplyTo($_POST['email'], $_POST['name']);
$mail->AddAddress($emailAddress);
$mail->SetFrom($_POST['email'], $_POST['name']);
$mail->Subject = "A new ".mb_strtolower($_POST['subject'])." from ".$_POST['name']." | contact form feedback"; // тема и имя, если они заполнены кириллицей не читаемы

$mail->MsgHTML($msg); // я так понимаю, что здесь отправляется тело письма, с которым проблем не возникает (в gmail)

$mail->Send();


unset($_SESSION['post']);

if($_POST['ajax'])
{
echo '1';
}
else
{
$_SESSION['sent']=1;

if($_SERVER['HTTP_REFERER'])
header('Location: '.$_SERVER['HTTP_REFERER']);

exit;
}

function checkLen($str,$len=2)
{
return isset($_POST[$str]) && mb_strlen(strip_tags($_POST[$str]),"utf-8") > $len;
}

function checkEmail($str)
{
return preg_match("/^[\.A-z0-9_\-\+]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z]{1,4}$/", $str);
}

?>



Подскажите, пожалуйста, как можно подправить данный скрипт, и если это сложно, то подскажите какое-нибудь готовое решение, перепробовал кучу форм и у всех есть свои недостатки (версия php, огромное количество дополнительных файлов, попадались и нерабочие формы, с которых сообщения не приходили) Я просто не ожидал, что при таком большом выборе бесплатных CMS, возникнет проблема с одной формой обратной связи.

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.