PHP Mail кодирует строку темы - PullRequest
13 голосов
/ 15 января 2009

Когда я пытаюсь отправить письмо в формате HTML с PHP, если строка темы содержит специальные символы, такие как "Here's the information you requested", PHP кодирует его так: "Here's the information you requested."

Как мне это исправить?


Вот как выглядит код с использованием PHP mail ():

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

$headers .= 'To: ' . $mod_params['name'] . '<' . $mod_params['email'] . '>' . "\r\n";

$headers .= 'From: <do_not_reply@a4isp.com>' . "\r\n";  

$email_to = $mod_params['email'];

$email_sub = "Here's the Information You Requested";

$body = html_entity_decode("<html><body>" . $email_html_body . "</body></html>");

mail($email_to,$email_sub,$body,$headers);

Выдает ту же ошибку, что и при запуске через класс SugarPHPMailer.

Ответы [ 6 ]

41 голосов
/ 25 июня 2011

Попробуйте это:

 $newsubject='=?UTF-8?B?'.base64_encode($subject).'?=';

Таким образом, вы не полагаетесь на PHP или кодировку MTA, вы делаете работу, и почтовый клиент должен это понимать. Никаких специальных символов в вашей новой теме не будет, поэтому при доставке электронной почты не должно возникнуть никаких проблем.

7 голосов
/ 26 марта 2011

У меня была похожая проблема в плагине Wordpress, над которым я работал, и я ломал голову снова и снова, пробуя различные предложения отсюда и в различных других результатах поиска Google. Я наконец нашел решение, которое сработало в моей ситуации, поэтому я поделюсь им. Я скажу, что это было решение Пола, которое я сначала попробовал, и оно не сработало, но причина была в том, что я пытался «записать» решение. В моем случае просто вызов html_entity_decode () не сработал. Зачем? Если бы я читал документацию по PHP более внимательно, это было бы очевидно. Моя проблема была с кодировкой в ​​одиночной кавычке и по умолчанию для html_entity_decode () является 'ENT_COMPAT', который оставляет одиночные кавычки в покое. Решением было установить все параметры, и это сработало. В действительности я, вероятно, мог бы прекратить кодировку, так как я кодировал UTF-8, но подумал, что я должен быть тщательным.

$decoded_str = html_entity_decode (  $value_to_decode, ENT_QUOTES, 'UTF-8' );

Хороший урок здесь: «Прочитайте документы». Я не говорю, что вы этого не сделали (вы, вероятно, так и сделали), но многие из нас торопятся и затушевывают решение, которое сидит там и смотрит нам в лицо, если бы мы только смотрели.

6 голосов
/ 15 января 2009

Если строка действительно не содержит закодированных значений перед отправкой, взгляните на this :

$subject= mb_encode_mimeheader($subject,"UTF-8", "B", "\n");
// or
$subject= mb_encode_mimeheader($subject,"UTF-7", "Q", "\n");

Посмотрите на эти сообщения, связанные с SugarCRM:

3 голосов
/ 19 марта 2014

Вы должны использовать mb_encode_mimeheader , просто не забудьте установить ранее.

mb_internal_encoding("UTF-8"); //has to be set (of course your internal encoding may not be UTF-8).
$subject = mb_encode_mimeheader($subject,'UTF-8','Q');

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

0 голосов
/ 15 января 2009

Зачастую отправка ошибочного блока кода обеспечит более быстрый ответ. Скорее всего, вы кодируете текст где-то до того, как это действие произойдет. Как было предложено ранее, вы можете найти это действие и исправить его, или вы можете просто расшифровать строку темы перед отправкой электронного письма.

0 голосов
/ 15 января 2009

Попробуйте запустить строку темы через html_entity_decode () , похоже, что у вас есть некоторые объекты в строке темы.

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