2011-01-06 137 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

相關問題