当前位置: 首页 > 面试题库 >

PHP IMAP解码消息

施自明
2023-03-14
问题内容

我有通过base64编码和8bit编码发送的电子邮件。我想知道如何使用imap_fetchstructure检查消息的编码(因为这样做大约两个小时,所以丢失了)然后正确解码。

Gmail和Mailbox(iOS上的应用)以8位发送,而Windows
8的Mail应用以base64发送。无论哪种方式,我都需要通过检测已使用的编码类型来解码其8bit还是base64。

使用PHP 5.1.6(是的,我应该更新,很忙)。

我真的没有代码要显示。这就是我所拥有的:

<?php
$hostname = '{********:993/imap/ssl}INBOX';
$username = '*********';
$password = '******';

$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to server: ' . imap_last_error());

$emails = imap_search($inbox,'ALL');

if($emails) {

    $output = '';

    rsort($emails);

    foreach($emails as $email_number) {

        $overview = imap_fetch_overview($inbox,$email_number,0);
        $message = imap_fetchbody($inbox,$email_number,2);
        $struct = imap_fetchstructure($inbox, $email_number);

        $output.= '<div class="toggle'.($overview[0]->seen ? 'read' : 'unread').'">';
        $output.= '<span class="subject">'.$overview[0]->subject.'</span> ';
        $output.= '<span class="from">'.$overview[0]->from.'</span>';
        $output.= '<span class="date">on '.$overview[0]->date.'</span>';
        $output.= '</div>';

        /* output the email body */
        $output.= '<div class="body">'.$message.'</div>';
    }

    echo $output;
}

imap_close($inbox);
?>

问题答案:

imap_bodystruct()或imap_fetchstructure()应该将此信息返回给您。以下代码可以完全满足您的需求:

<?php
$hostname = '{********:993/imap/ssl}INBOX';
$username = '*********';
$password = '******';

$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to server: ' . imap_last_error());

$emails = imap_search($inbox,'ALL');

if($emails) {
    $output = '';
    rsort($emails);

    foreach($emails as $email_number) {
        $overview = imap_fetch_overview($inbox,$email_number,0);
        $structure = imap_fetchstructure($inbox, $email_number);

        if(isset($structure->parts) && is_array($structure->parts) && isset($structure->parts[1])) {
            $part = $structure->parts[1];
            $message = imap_fetchbody($inbox,$email_number,2);

            if($part->encoding == 3) {
                $message = imap_base64($message);
            } else if($part->encoding == 1) {
                $message = imap_8bit($message);
            } else {
                $message = imap_qprint($message);
            }
        }

        $output.= '<div class="toggle'.($overview[0]->seen ? 'read' : 'unread').'">';
        $output.= '<span class="from">From: '.utf8_decode(imap_utf8($overview[0]->from)).'</span>';
        $output.= '<span class="date">on '.utf8_decode(imap_utf8($overview[0]->date)).'</span>';
        $output.= '<br /><span class="subject">Subject('.$part->encoding.'): '.utf8_decode(imap_utf8($overview[0]->subject)).'</span> ';
        $output.= '</div>';

        $output.= '<div class="body">'.$message.'</div><hr />';
    }

    echo $output;
}

imap_close($inbox);
?>


 类似资料:
  • 我正在尝试与RESTful API接口,该API在post中接受应用程序/x-protobuf对象。 .原型示例对象: 使用请求,我可以将此消息发布到服务器并收到200。 例如 当我以SerializeToString()格式查看此有效负载时,它显示类似于 b'\n\t\n\x03foo\x10\x01' 作为健全性检查,然后我可以创建一个新的消息对象和。将其上的ParseFromString()

  • 这是我的java程序:

  • 我已经下载了json和我的对话档案。我坚持使用奇怪的编码。 json的例子: 应该是这样的: 我正试图这样反序列化它: 不幸的是,输出如下: 有人知道Facebook如何编码json吗?我尝试了几种方法,但没有结果。 谢谢你的帮助。

  • 问题内容: 我一直试图从PubNub解析此JSON消息,但没有任何运气: 有没有人知道如何在golang中解码这种复杂类型? 问题答案: 简短的答案是,您不能直接将非同类型的JSON数组(按您的示例)解组到golang结构中。 长答案是,您应该为PubNubMessage类型定义一个方法,该方法将JSON字符串解组为an ,然后使用类型断言来确保所需的格式并填充结构。 例如:

  • 我正在编写一个netty TCP服务器,它必须根据请求中的值对响应进行编码,例如返回pro buf或JSON。建议的实现方法是什么? 我们的服务器有一个带有解码器、编码器和处理程序的管道。 我考虑使用解码器将正确的编码器添加到管道中,如下所示 这似乎有效,但是否正确?ChannelHandler文档使我想到了这个设计。 可以随时添加或删除通道处理器,因为通道管道是线程安全的。例如,可以在将要交换敏