UTF-8 символов в форме электронной почты - PullRequest
0 голосов
/ 23 октября 2011

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

<?php
$text = "Results from form:\n\n";
$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" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
$headers .= "From: ".$hostmail." \r\n";
$headers .= "Reply-To : ".$hostmail." \r\n";
return mail($to, $subj, $body, $headers);

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

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

1 Ответ

4 голосов
/ 23 октября 2011

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

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

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

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

EDIT:

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

$message = "This is a\r\ntest 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: 1032 *

<?php

// original message...
$message = "To je nějaký ukázkový text.\r\nTento 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
(
    'ě' => '&#283',
    'ř' => '&#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 кодирует сообщение, устанавливает соответствующие заголовки и использует mail's mail функцию PHP, чтобы сделать все остальное. Вот как у меня это работает:

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

// headers...
$headers = "";
$headers .= "From: your-email@domain.com\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
$headers .= "Content-Transfer-Encoding: base64\r\n";
$headers .= "MIME-Version: 1.0";

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...