2011-01-06 108 views
6

当我在GMail收件箱中运行一个非常简单的imap_search时,搜索返回的邮件比它应该少。PHP imap_search未检测到Gmail邮箱中的所有邮件

以下是任何拥有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

+0

尝试过`imap_sort`,`imap_num_msg`和`imap_search`,结果相同。 – Ben 2011-01-06 08:39:31

+0

在Google实验室尝试了“高级IMAP控件”,结果相同。 – Ben 2011-01-06 08:40:03

回答

8

经过明显的脱发后,我找到了答案。这是一个误导性的用户界面。

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

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

设置 - >通用菜单,您可以切换会话视图,它将把所有那些调皮的归档消息的回属于他们的地方,并展现真实的收件箱视图。

0

imap_search标准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); 
?> 
+0

@poelinca - “ALL”是标准,我希望收件箱中的所有邮件。我刚才尝试了`imap_sort`,它返回了相同的结果。 :/ – Ben 2011-01-06 07:49:21

相关问题