UTF-8 символов в форме электронной почты

#forms #utf-8 #character-encoding

#формы #utf-8 #кодировка символов

Вопрос:

Приведенный ниже код должен привести к получению электронного письма в кодировке UTF-8 через контактную форму, которая отправляет данные в соответствующую таблицу базы данных. Тем не менее, он по-прежнему неправильно отображает символы UTF-8. Можете ли вы посмотреть, не ввел ли я неправильно / не добавил / перепутал приведенный ниже код? Большое спасибо!

 <?php
$text = "Results from form:nn";
$space = ' ';
$line = '
';
foreach ($_POST as $key => $value)
{
if ($req == '1')
{
if ($value == '')
{echo "$key is empty";die;}
}
$j = strlen($key);
if ($j >= 20)
{echo "Name of form element $key cannot be longer than 20 characters";die;}
$j = 20 - $j;
for ($i = 1; $i <= $j; $i  )
{$space .= ' ';}
$value = str_replace('n', "$line", $value);
$conc = "{$key}:$space{$value}$line";
$text .= $conc;
$space = ' ';
}
mail($emailadd, $subject, $text, 'From: '.$emailadd.'');
echo '<META HTTP-EQUIV=Refresh charset=utf-8 CONTENT="0; URL='.$url.'">';
?>
 

Редактировать:

Спасибо за быстрый ответ, Крис — однако, если подумать, наша форма электронной почты основана на ‘func.php ‘файл с различными настройками для сайта включен. В настоящее время код ‘sendemail’ выглядит следующим образом:

 $headers = "MIME-Version: 1.0" . "rn";
$headers .= "Content-type:text/html;charset=UTF-8" . "rn";
$headers .= "From: ".$hostmail." rn";
$headers .= "Reply-To : ".$hostmail." rn";
return mail($to, $subj, $body, $headers);
 

Я пытался изменить это следующим образом, но безуспешно… есть идеи?

 $headers .= "From: ".$hostmail." rn";
$headers .= "Reply-To : ".$hostmail." rn";
$headers .= "MIME-Version: 1.0rn";
$headers .= "Content-type: text/plain; charset=utf-8rn";
$headers .="Content-Transfer-Encoding: 8bit";
$body=htmlspecialchars_decode($body,ENT_QUOTES);
return mail($to, "=?utf-8?B?".base64_encode($subj)."?=",$body, $headers);
 

Ответ №1:

Это может быть или не быть полезным, но я думаю, что ценю вашу боль, когда дело доходит до обработки ошибок рассылки в PHP, поэтому я подумал, что, по крайней мере, попробую помочь запустить эту тему!

Единственное, о чем я не хотел спрашивать, это уверены ли вы, что публикуемые значения поступают в кодировке UTF-8? Кроме того, я не могу не думать, что символы новой строки могут вызывать какое-то странное поведение, так почему бы не попробовать что-то подобное вместо этого (где это применимо):

 line = "rn";
$value = str_replace('n', $line, $value);
 

Обратите внимание на двойные кавычки вокруг символа новой строки, который я ввел для $line …Я предполагаю, что первое ‘ n’ выше физически вводится в значение и нуждается в замене? В противном случае, особенно с обычной текстовой электронной почтой, вам не нужно беспокоиться о синтаксическом анализе этих символов новой строки, просто передайте их прямо в почтовое сообщение.

Редактировать:

Не уверен, поможет ли это, но после запуска самых простых функций отправки почты с использованием почтовых библиотек Zend — кодировки UTF-8 и base64 — и проверки источника пришедшего сообщения, это в основном все, что вам нужно для вашей обычной текстовой почты, учитывая это как сообщение:

 $message = "This is arntest message";
 

… фрагмент почтового источника будет:

 Date: Sun, 23 Oct 2011 16:24:16  0300
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
Content-Disposition: inline
MIME-Version: 1.0

VGhpcyBpcyBhDQp0ZXN0IG1lc3NhZ2U=
 

РЕДАКТИРОВАНИЕ #2:

Хорошо, я думаю, что я наконец-то понял кое-что, что поможет, хотя это поможет только при отправке почтовых сообщений HTML с чешскими специальными символами. Проблема, похоже, связана не столько с кодировкой символов, сколько со специальными символами HTML (ну, в любом случае, для меня!), Поэтому следующий код, похоже, отлично воспроизводит исходный текст в моем надежном веб-браузере Firefox:

 <?php

// original message...
$message = "To je nějaký ukázkový text.rnTento text je na dalším řádku.";

// convert as many characters as possible in PHP < 5.4...
$message = htmlentities($message, ENT_QUOTES, 'UTF-8');

// I suspect this next line will work for all characters in PHP >= 5.4...
// $message = htmlentities($message, ENT_SUBSTITUTE, 'UTF-8');

// if not all characters are being converted, plug the missing ones in here
// with their relevant codes...
$missing_characters = array
(
    'ě' => 'amp;#283',
    'ř' => 'amp;#345;'
);

// heavy function, but I wasn't trying to be efficient ;)
foreach ($missing_characters as $char => $code)
    $message = str_replace($char, $code, $message);

// this should give you the original string in a browser...
echo $message;

?>
 

ПРАВКА #3:

И, наконец, добиться того же результата с текстом, видимым в текстовых почтовых сообщениях, намного проще. Просто закодируйте сообщение в base64, задайте соответствующие заголовки и используйте почтовую функцию PHP для выполнения всего остального. Вот как я заставил это работать:

 // original message...
$message = "To je nějaký ukázkový text.rnTento text je na dalším řádku.";
$message = base64_encode($message);

// headers...
$headers = "";
$headers .= "From: your-email@domain.comrn";
$headers .= "Content-Type: text/plain; charset=UTF-8rn";
$headers .= "Content-Transfer-Encoding: base64rn";
$headers .= "MIME-Version: 1.0";

mail("destination-email@domain.com", "Subject Here", $message, $headers);
 

Надеюсь, это поможет! 🙂

Комментарии:

1. Спасибо за быстрый ответ, Крис — однако, если подумать, наша форма электронной почты основана на ‘func.php ‘файл с различными настройками для сайта включен. В настоящее время код ‘sendemail’ такой, как показано в правке выше…

2. Честно говоря, заголовки выглядят хорошо, и, помимо того, что они педантичны в отношении того, в каком порядке они идут, например, сначала помещают заголовок MIME, я не могу их винить 🙂 Может быть, мне действительно следует спросить, с какой именно проблемой вы столкнулись? Неправильная вставка строк в базу данных? Получение странно выглядящей почты на другой стороне? Я надеюсь, что мы на правильном пути 🙂

3. Есть контактная форма, в которую отправляются данные ‘sendmail.php ‘ (кодекс sendmail.php есть в оригинальном посте). Тогда это должно отправить мне электронное письмо с закодированными символами… но это не так. Все, что я вижу, правильно закодировано как UTF-8, но должно быть что-то, что я пропустил!

4. Спасибо за комментарий, Джо, и за ваше терпение, я чувствую, что мы добиваемся прогресса! Итак, вы вообще не получаете электронное письмо или получаете письмо, но содержимое не закодировано в base64? Кроме того, вы думали об использовании почтовых библиотек Zend , чтобы избавиться от некоторых головных болей, вызванных более приземленными операциями, или это не вариант для вас?

5. Знаете ли вы, что в PHP есть mb_send_mail()? Я не говорю, что вы обязательно должны им пользоваться, но на него стоит обратить внимание