imap fetch_body输出不正确的html

时间:2014-01-11 08:22:32

标签: php html gmail imap

下面的代码输出不正确的html并在其间插入一些垃圾字符。我认为解决方案将是基本转换。但我无法弄清楚哪个基地。

<?php
$hostname = '{imap.gmail.com:993/imap/ssl}[Gmail]/Sent Mail';
$username = '...@gmail.com';
$password = '*****';
$sent = imap_open($hostname, $username, $password) or die('Cannot connect to Gmail: ' . imap_last_error());
$emails   = imap_search($sent, 'SUBJECT "Part"');

if ($emails)
{
    foreach ($emails as $email_number)
    {
        $message = imap_body($sent, $email_number,1.2);
        echo $message;
    }
}
imap_close($sent);

?>

输出HTML

<td colspan="3D&quot;2&quot;" 
st="yle=3D&quot;
border-color:rgb(204,204,20=" 4);
border-width:0px="" 0px="" 1px="" 1px;
font-family:ari="al;
color:rgb(255,255,255);
background-color:rgb(123,186,0=" );
text-align:center;
width:100px"="">

2 个答案:

答案 0 :(得分:1)

在使用quoted_printable_decode()显示输出之前,您似乎想要解码输出,具体如下:

foreach ($emails as $email_number)
{
    $message = imap_body($sent, $email_number,1.2);
    echo quoted_printable_decode($message);
}

在此处详细了解此功能:http://www.php.net/manual/en/function.quoted-printable-decode.php

注意:imap_qprint()执行相同,也可以使用。

答案 1 :(得分:1)

IMAP只是邮件的传输协议。邮件消息本身可以具有MIME格式的固有结构,例如,带附件的典型HTML邮件将具有以下结构:

mail
|- multipart/mixed
|  |- multipart/alternative
|     |- text/plain - plain text content
|     |- text/html  - HTML content
|- application/octet-stream - the attachment

每个叶子部分(例如内容和附件)可能具有内容传输编码,通常是引用可打印的,base64或有时是二进制的。文本部分也可以具有字符集(在内容类型标题内定义),例如, utf-8,iso-8859-1等。也可能有文本部分用作附件,它们的内容处置标题设置为'附件'。

要显示邮件文本,您必须首先找到相关内容部分,然后解码内容传输编码,然后转换您需要输出的给定字符集中的内容。 IMAP库支持大多数必要的操作,但似乎没有简单的方法来获取您需要的表单内容,例如你必须调用所有函数来解析结构,解码和转换自己。