【问题标题】:PHP imap_search not detecting all messages in gmail inboxPHP imap_search 未检测到 gmail 收件箱中的所有邮件
【发布时间】:2011-06-04 12:06:13
【问题描述】:

当我在我的 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

【问题讨论】:

  • 试过imap_sortimap_num_msgimap_search,结果相同。
  • 在 Google 实验室中尝试了“高级 IMAP 控件”,结果相同。

标签: php gmail imap


【解决方案1】:

在严重脱发后,我找到了答案。这是一个误导性的用户界面。

默认情况下,GMail 将一个人的消息分组到“对话”中。这些对话可以包括存档消息。

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

设置->常规菜单中,您可以切换对话视图,这会将所有那些顽皮的存档消息放回它们所属的位置,并显示您真正的收件箱视图。

【讨论】:

  • After significant hair loss LOL ...这里也一样
【解决方案2】:

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);
?>

【讨论】:

  • @poelinca - “全部”是标准,我想要收件箱中的所有邮件。我刚才尝试了imap_sort,它返回了相同的结果。 ://
  • 请查看我的更新答案,查看 php.net ALL 不应该单独使用,这意味着您可以使用 ANY 作为独立的标准,这行不通?
  • @poelinca - ALL 本身返回的结果与我使用标准拆分时的结果相同。当你说“不应该单独使用”时,你有来源吗?此外, ANY 将不起作用,因为不在标准列表中。
  • 如果你只想显示消息的数量,你可以使用 imap_sort 或 imap_num_msg 。 (我仍然不认为 ALL 应该作为一个独立的标准,因为你已经在获取所有电子邮件时遇到了问题)
  • @poelinca - 我明白你在说什么,但我不知道任何其他方式可以返回“所有收件箱消息”。
猜你喜欢
  • 2015-04-07
  • 2017-09-02
  • 2014-06-18
  • 2012-08-31
  • 2019-10-24
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多