imap_search()对于看不见的消息不会返回任何内容

时间:2014-01-04 12:58:39

标签: php email imap pop3

我目前正在尝试从我的服务器获取UNSEEN / UNREAD消息。目前,我有这个:

$openmail = imap_open($dns, $email, $password) or die("Cannot Connect " . imap_last_error());
if ($openmail) {
    /* grab emails */
    $emails = imap_search($openmail, 'UNSEEN');
    if ($emails) {
        //For every e-mail.
        $tot = imap_num_msg($openmail);
        for ($i = $tot; $i > 0; $i--) {
            $structure = imap_fetchstructure($openmail, $i);
            if (isset($structure->parts) && is_array($structure->parts) && isset($structure->parts[1])) {
                $part = $structure->parts[1];
                $message = imap_fetchbody($openmail, $i, 2, FT_PEEK);

                if ($part->encoding == 3) {
                    $message = imap_base64($message);
                } else if ($part->encoding == 1) {
                    $message = imap_8bit($message);
                } else {
                    $message = imap_qprint($message);
                }
            }
            $header = imap_header($openmail, $i);
            $from = imap_utf8($header->fromaddress);
            $subject = $header->Subject;
            $subject = substr($subject, 0, 150);
            $date = $header->Date;
        }
        /* Print out the Unseen messages in here! */
    } else {
        /* No unseen messages */
        echo "No unseen";
    }
}

我尝试将多个电子邮件发送到我的邮件服务器,使用上面的脚本刷新页面。但我一直得到“不可见”。

我试图输出$emails,但它是空的。它找不到任何东西。

如果我尝试获取所有邮件(没有看不见的过滤器),我可以看到我发送到邮箱的电子邮件,但是,它们都被标记为已读。

1 个答案:

答案 0 :(得分:0)

您的代码$message = imap_fetchbody($openmail, $i, 2, FT_PEEK);使用硬编码的部分偏移,即它假设消息始终为multipart/alternative text/plaintext/html。这是一个非常错误的假设。

您必须查看BODYSTRUCTURE的输出,以查看邮件的MIME结构。

除此之外,请确保您的所有命令都不使用BODY获取操作;你必须使用BODY.PEEK。我不知道如何在PHP c-client绑定中访问它。