Функция PHP mail () портит HTML в сообщении электронной почты - PullRequest
0 голосов
/ 21 июня 2011

Итак, у меня есть следующий код. Предполагается отправлять электронные письма в формате HTML, которые были отредактированы на предыдущем экране. Однако после отправки электронного письма в html-тегах пропадают первая двойная кавычка и буква каждого тега, например,

<span style="something">

становится

<span style=omething">

Странная часть: сообщение печатается нормально, если отражено на экране, поэтому я не думаю, что оно имеет какое-либо отношение к тому, как оно отправляется всей функции, а как оно отправляется на почту () функция ... но я понятия не имею, в чем проблема может быть. Вот код без всякого получения переменных и тому подобного, потому что я не думаю, что это особенно актуально.

//start of the headers
$headers = "From: $from_name<$from_email>\n";
$headers .= "Reply-To: <$reply_to>\n"; 
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/related; type=\"multipart/alternative\"; boundary=\"----=MIME_BOUNDRY_main_message\"\n"; 
$headers .= "X-Sender: $from_name<$from_email>\n";
$headers .= "X-Mailer: PHP4\n";
$headers .= "X-Priority: 3\n"; //1 = Urgent, 3 = Normal
$headers .= "Return-Path: <$from_email>\n"; 
$headers .= "This is a multi-part message in MIME format.\n";
$headers .= "------=MIME_BOUNDRY_main_message \n"; 
$headers .= "Content-Type: multipart/alternative; boundary=\"----=MIME_BOUNDRY_message_parts\"\n"; 

$message = "------=MIME_BOUNDRY_message_parts\n";
$message .= "Content-Type: text/html\r\n";  //changed to support html
$message .= "Content-Transfer-Encoding: quoted-printable\n"; 
$message .= "\n"; 
/* note: add HTML by changing the Content-Type to text/html */
////TEST 1 - this is where i attempted to hardcode some code in to see if it would send properly: it wouldn't. printed fine though.
$message .="<font class=\"Apple-style-span\" face=\"'Courier New'\" size=\"5\">\n"; 
$message .= "bbbbb<b>bbbb<i>bbb<u>bbb<font class=\"Apple-style-span\" color=\"#000099\">\n"; 
$message .= "bbbbb<span class=\"Apple-style-span\" style=\"background-color: rgb(102, 255, 204);\">bbbbbb</span></font></u></i></b></font>\n";
/////end test 1
$message .= $body.'\n';
$message .= "\n\n"; 
$message .= "------=MIME_BOUNDRY_message_parts--\n"; 
if($file_present==1){ // added this to fix empty file bug
$message .= "\n"; 
$message .= "------=MIME_BOUNDRY_main_message\n"; 
$message .= "Content-Type: application/octet-stream;\n\tname=\"" . $attachment_name . "\"\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "Content-Disposition: attachment;\n\tfilename=\"" . $attachment_name . "\"\n\n";
$message .= $data; //The base64 encoded message 
$message .= "\n"; 
$message .= "------=MIME_BOUNDRY_main_message--\n"; 
}
echo $message; //this is where it echoes fine, with all tags intact
// send the message
   if( mail("$to_name<$to_email>", $subject, $message, $headers)){ //this is where it goes wrong.
     echo("<p>Message successfully sent to ".$to_email.".</p>");
  } else {
   echo("<p>Message delivery to ".$to_email." failed.</p>");
  }

Ответы [ 6 ]

1 голос
/ 21 июня 2011
$headers .= "...[snip]... boundary=\"----=MIME_BOUNDRY_message_parts\"\n"; 
                                    ^--here                          ^--here

Вы встраиваете кавычки в граничную строку, но не используете кавычки для фактических границ.

В граничной части заголовка типа содержимого не должно быть кавычек.

Для создания многострочных строк, особенно со встроенными кавычками (например, HTML), я СИЛЬНО предлагаю вам использовать HEREDOC:

$message .= <<<EOL
<font class="Apple-style-span" face="'Courier New'" size="5">
bbbbb<b>bbbb<i>bbb<u>bbb<font class="Apple-style-span" color="#000099">
bbbbb<span class="Apple-style-span" style="background-color: rgb(102, 255, 204);">bbbbbb</span></font></u></i></b></font>
EOL;

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

1 голос
/ 21 июня 2011

При выводе HTML с использованием PHP мне легче делать такие вещи:

$content = '<span class="something">' . $someDynamicVariable . '</span>';

Это позволяет избежать кошмара, который избегает двойных кавычек.

0 голосов
/ 12 марта 2012

Я думаю, что это как-то связано с Content-Transfer-Encoding: цитата для печати ( см. Здесь ).

0 голосов
/ 20 июля 2011

Ну, я перебираю свои старые вопросы.Я решил опубликовать, как я решил это.Мое первоначальное предположение было правильным: в теле сообщения не было ничего плохого.Проблема была ...

Заголовки!Нет, это не имеет смысла для меня.Но после того, как я первоначально удалил информацию заголовка X-Sender / связанные с ним, все началось почти нормально.Затем я изменил границу на случайное значение, и вдруг все заработало нормально.Любой, кто может объяснить мне, почему это происходит, может, но я просто рад, что это работает.

0 голосов
/ 21 июня 2011

возможно, что mail () обрабатывает двойную кавычку как специальный символ, и поскольку вы отправляете всю строку внутри кавычек, то mail () может не определить, где заканчивается ваша строка и где она продолжается снова.

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

так что попробуйте

<span style='Something'>
0 голосов
/ 21 июня 2011

Где-то у вас есть неэкранированная кавычка, возможно входящая через переменную PHP в HTML. Вам нужно вызвать htmlentities($variable, ENT_QUOTES) для всех переменных, которые окажутся внутри HTML.

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