PHP imap_search未检测到gmail收件箱中的所有邮件

时间:2011-01-06 07:18:36

标签: php gmail imap

当我在我的GMail收件箱中运行一个非常简单的imap_search时,搜索返回的消息少于应有的消息。

以下是任何拥有GMail帐户的人都可以运行的脚本。

$host = '{imap.gmail.com:993/imap/ssl}';
$user = 'foo';
$pass = 'bar';

$imapStream = imap_open($host,$user,$pass) or die(imap_last_error());

$messages = imap_search($imapStream,"ALL");

echo count($messages);

imap_close($imapStream);

这将返回39条消息。但是,我的收件箱中有100条消息,有些是在对话中捆绑的,有些是从另一个帐户转发的(SquirrelMail)。

任何人都可以复制这些结果,和/或告诉我发生了什么事吗?


我尝试过的其他服务器字符串,都返回相同的结果:

{imap.gmail.com:993/imap/ssl/novalidate-cert}
{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX
{imap.gmail.com:993/imap/ssl}INBOX

GMail的IMAP功能支持:http://mail.google.com/support/bin/answer.py?hl=en&answer=78761

2 个答案:

答案 0 :(得分:8)

大量脱发后,我找到了答案。这是一个误导性的UI。

GMail默认将一条消息分组为“对话”。这些对话可以包括存档的消息。

因此,例如,Bob的收件箱看起来像有25个邮件的4个对话,这显然会返回100个收件箱邮件。实际上,60条消息都在存档中(不是收件箱),因此imap_search()会返回40。这些消息被神奇地从存档中拉出并放入收件箱对话中。

设置 - >常规菜单中,您可以切换会话视图,这会将所有这些顽皮的存档邮件放回原来的位置,并显示您的真实收件箱视图。

答案 1 :(得分:0)

imap_search criteria ALL - 返回符合其余条件的所有邮件,所以我问你剩下的标准在哪里?

您可以使用imap_sort($imapStream, 'SORTDATE', 0);(imap_sort - 按给定参数imap_sort获取和排序消息编号)。


编辑,这里有一些代码通过您收件箱中的所有邮件,而不是imap_num_msg,您可以使用之前所述的imap_sort,因此如果您愿意,可以对收件箱进行排序。

<?php
    $imap = imap_open("{mail.yourserver.com:143}INBOX", "username", "password");
    $message_count = imap_num_msg($imap);

    for ($i = 1; $i <= $message_count; ++$i) {
        $header = imap_header($imap, $i);
        $body = trim(substr(imap_body($imap, $i), 0, 100));
        $prettydate = date("jS F Y", $header->udate);

        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 \"$body\".\n";
    }

    imap_close($imap);
?>