Почта PHP кодирует строку темы

Когда я пытаюсь отправить электронное письмо с кодировкой 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: <[email protected]>' . "\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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
13
0
24 476
6

Ответы 6

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

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

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

Взгляните на эти сообщения, связанные с SugarCRM:

Пробовали оба безуспешно. Я такого раньше не видел. Спасибо за ответ.

ericwindham 15.01.2009 20:09

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

Я пробовал расшифровать его перед отправкой. Я также пробовал отправить такое же электронное письмо из функции php mail (), а не из класса SugarPHPMailer. Это не специфично для SugarCrm. То же самое происходит с mail ().

ericwindham 15.01.2009 20:40

У меня была аналогичная проблема в подключаемом модуле 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' );

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

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

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

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

Я использую этого Питера. Выглядит хорошо, за исключением случаев, когда объект довольно длинный. Вы знаете, как его разбить? Я имею в виду, какой размер должен быть разбит на разделы? и как?

Sebastian Sastre 28.12.2011 01:49

Совершенно замечательное решение. Огромная благодарность тебе, @Peter, за завершение трехчасового сеанса выдергивания волос !!!

David Perlman 17.01.2012 22:39

Вы можете использовать chunk_split (60 символов) и применить его к каждому фрагменту, а также добавить новую строку и несколько пробелов для объединения фрагментов. Я говорю 60 символов, чтобы объединить остальную часть заголовка кодирования.

dresende 05.02.2014 14:18

У меня сработало, спасибо. Я использую символ ® в теме письма и использую Symfony и Swifmailer.

a4bike 30.04.2015 00:31

Вы должны использовать 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');

Он позаботится о кодировании в (читаемый человеком) Quoted-printable, когда это необходимо, и автоматически разбивает тему на нужное количество строк в зависимости от длины.

Другие вопросы по теме