Разобранный HTML-раздел электронной почты не отображается в браузере

Когда клиент получает обзор в Интернете от определенной службы, эта служба отправляет электронное письмо с уведомлением о новом обзоре. Содержимое электронного письма включает в себя сам обзор и исходную информацию, содержание приходит как (заголовок электронного письма, ЧАСТЬ 1 тела электронного письма (обычный текст) и ЧАСТЬ 2 тела электронного письма (HTML). Мне нужно проанализируйте HTML-раздел этих электронных писем и отправьте их в новый плоский файл для включения PHP на странице отзывов клиентов.

Я успешно могу подключиться к своей почтовой службе и проанализировать раздел 2 тестового электронного письма, которое я использую для тестирования. проблема в том, что когда вывод просматривается в браузере, он просто пуст. Но когда я просматриваю исходный код, там есть весь контент, включая HTML-код/структуру/css. Я не понимаю, почему я ничего не вижу (обычный текст или HTML) в интерфейсе браузера, но вижу все в исходном виде.

Вот мой код:

$login="*email user name*";
$password="*email password*";

$connection = imap_open('{pop.secureserver.net:995/novalidate-cert/pop3/ssl}', $login, $password);
$count = imap_num_msg($connection); /* get number of messages on server */
$i = 46; /* message 46 is the message being used to test this */


$header = imap_header($connection, $i);
$body = imap_fetchbody($connection,$i,"2"); /* grab section 2 of e-mail (HTML) */
$prettydate = date("F jS Y", $header->udate); /* not necessary just part of testing response */

        if (isset($header->from[0]->personal)) {
            $personal = $header->from[0]->personal;
        } else {
            $personal = $header->from[0]->mailbox;
        }

        $email = "$personal <{$header->from[0]->mailbox}@{$header->from[0]->host}>";
        echo "On $prettydate, $email said <hr>";
        echo $body;
        echo "<hr>";

imap_close($connection);

Первые 15 строк "просмотр исходного кода" после ответа PHP из Chrome.

On August 3rd 2014, New Review Notifications <[email protected]> said <hr><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.=
w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=3D"http://www.w3=
.org/1999/xhtml"> <head> <meta http-equiv=3D"Content-Type" content=3D"text/=
html; charset=3Dutf-8" /> <title></title> <style type=3D"text/css"> .Extern=
alClass{display:block !important;} .yshortcuts, .yshortcuts a, .yshortcuts =
a:link, .yshortcuts a:visited, .yshortcuts a:hover, .yshortcuts a span{ col=
or:#008ec5; text-decoration:none !important; border-bottom:none !important;=
 background:none !important; } body{margin:0;} p{margin:0 !important;} </st=
yle> </head> <body marginheight=3D"0" marginwidth=3D"0" leftmargin=3D"0" to=
pmargin=3D"0" bgcolor=3D"#ffffff"> <table width=3D"100%" cellpadding=3D"0" =
cellspacing=3D"0" bgcolor=3D"#ffffff"> <tr> <td height=3D"25" style=3D"back=
ground-color: #88939B" colspan=3D"3"></td> </tr> <tr> <td width=3D"50%" val=
ign=3D"top"> <table width=3D"100%" cellpadding=3D"0" cellspacing=3D"0" styl=
e=3D"height: 232px;"> <tr> <td style=3D"background-color: #88939B; height: =
232px; display: block">&nbsp;</td> </tr> </table> </td> <td width=3D"632"> =

PS - может ли кто-нибудь с более высокой репутацией добавить imap-fetchbody в список тегов, если это применимо, это не позволит мне.


person DMSJax    schedule 05.08.2014    source источник
comment
это полный HTML-документ, включая теги <html> и <body>. вы не можете вставлять html-in-html вот так. вам нужно будет использовать iframe, чтобы создать совершенно отдельную область документа, или извлечь содержимое электронной почты/ <body> и вставить только это на свою страницу. Кроме того, если этот = конец строки буквально присутствует там, то это ПОВРЕЖДЕННЫЙ html-документ. span {col=or:#008ec5} не является допустимым CSS, to=pmargin=3d"0" и т. д. не является допустимым атрибутом тега, бла-бла-бла.   -  person Marc B    schedule 05.08.2014
comment
@MarcB Да, я вижу в этом потенциальную проблему: существуют ли какие-либо встроенные в php функции, предназначенные для очистки кодировки, добавляемой почтовым сервером? я хотел бы, чтобы у меня остались только действительные структурированные данные HTML? (т.е. удаление знака = и/или любых других объектов, кодируемых почтовым сервером?)   -  person DMSJax    schedule 05.08.2014
comment
@MarcB Спасибо, ваш комментарий был частью поиска проблемы и решения, поэтому лучшее, что я могу сделать, это сказать спасибо и +1 к комментарию.   -  person DMSJax    schedule 05.08.2014


Ответы (1)


Здесь две проблемы: а. кодирование, б. отображение контента.

Кодировка

Где-то в заголовке (или теле) есть свойство encoding. Это говорит вам, как закодировано содержимое вашей почты. Затем вы можете использовать эти фрагменты информации, чтобы отменить кодировку. Это может быть $body->encoding вместо $header->encoding.

$body = imap_fetchbody($connection,$i,"2");

if ($header->encoding == 4) {
        $body = quoted_printable_decode($body);
}

if ($header->encoding == 3) {
        $body = base64_decode($body);
}

echo $body; // now body should have the correct encoding

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

$body = imap_fetchbody($connection,$i, 1.2); <-- instead of 2

Отображение содержания

Как уже указывал Марк Б., невозможно отобразить полную HTML-страницу внутри HTML-страницы без iframe. iframe — самый простой способ отобразить это.

Но у вас есть несколько вариантов: от удаления тега до извлечения тела. Если вы удалите «важные» теги, вы получите контент. preg_matching для <body>.*</body> тоже должен работать.

$body = str_replace('<html>', '', $body);
$body = str_replace('<head>', '', $body);
$body = str_replace('<title>', '', $body);
$body = str_replace('<body>', '', $body);
$body = str_replace('</body>', '', $body);
$body = str_replace('</html>', '', $body);
person Jens A. Koch    schedule 05.08.2014
comment
Спасибо! Я видел ссылку на кодировку в документах PHP ранее, но не понимал, как ее применять и нужна ли она в данном случае. Тем не менее, я заставил его работать на вашем примере. Спасибо! - person DMSJax; 05.08.2014
comment
рад, что ты это понял :) - person Jens A. Koch; 05.08.2014