【问题标题】:imap fetch_body outputs incorrect htmlimap fetch_body 输出不正确的 html
【发布时间】:2014-01-11 08:22:32
【问题描述】:

下面的代码输出不正确的 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"="">

【问题讨论】:

    标签: php html gmail imap


    【解决方案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() 的性能相同,也可以使用。

    【讨论】:

    • 我编辑了我的答案以记下这一点,但我总是喜欢选择名称更具描述性且不需要依赖项的函数。
    • 我同意,但是这个问题的上下文涉及imap_ 库的使用,无论如何这应该是正确的解决方案。
    【解决方案2】:

    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 等。也可能有文本部分用作附件,它们的 content-disposition 标头设置为“附件”。

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

    【讨论】:

    • 我正在使用文本/html。这一行中的“1.2”。 $message = imap_body($sent, $email_number,1.2);你的回答很翔实。谢谢你。我的问题通过使用quoted_printable_decode()解决了
    • 您的特定问题确实已通过调用quoted_printable_decode 得到解决。您没有解决的是相同的消息可以很容易地使用,例如base64 编码。它仍然是一封完全有效的电子邮件,但您的代码将无法正常工作,这就是 Steffen 花时间添加他详尽的答案的原因。
    猜你喜欢
    • 2021-01-14
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2023-03-05
    • 1970-01-01
    • 2013-01-01
    • 2013-05-15
    相关资源
    最近更新 更多