2011-01-06 14 views
6

Quando eseguo un semplice numero imap_search nella posta in arrivo di GMail, la ricerca restituisce meno messaggi del dovuto.PHP imap_search che non rileva tutti i messaggi nella posta in arrivo di Gmail

Ecco lo script che può essere eseguito da chiunque disponga di un account 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); 

Restituisce 39 messaggi. Ma, ho 100 messaggi nella mia casella di posta, alcuni in bundle in conversazioni, alcuni inoltrati da un altro account (SquirrelMail).

Qualcuno può duplicare questi risultati e/o dirmi cosa sta succedendo?


Altre stringhe di server che ho provato, tutte restituendo gli stessi risultati:

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

supporto di funzionalità IMAP di Gmail: http://mail.google.com/support/bin/answer.py?hl=en&answer=78761

+0

Provato 'imap_sort',' imap_num_msg' e 'imap_search', stessi risultati. – Ben

+0

Provato "Advanced IMAP Controls" in Google Labs, stesso risultato. – Ben

risposta

8

Dopo una significativa perdita di capelli, ho trovato la risposta. Era un'interfaccia fuorviante.

GMail raggruppa i messaggi di una persona in "Conversazioni" per impostazione predefinita. Queste conversazioni possono includere messaggi archiviati.

Quindi, ad esempio, la posta in arrivo di Mario è simile a. Ci sono 4 conversazioni di 25 messaggi, che dovrebbero apparentemente restituire 100 messaggi di posta in arrivo. In realtà, 60 dei messaggi sono nell'archivio (non nella casella di posta in arrivo), quindi imap_search() restituisce 40. Questi messaggi vengono magicamente estratti dall'archivio e inseriti nelle conversazioni di posta in arrivo.

Nel menu Impostazioni-> Generale, è possibile attivare la visualizzazione della conversazione, che riporterà tutti quei cattivi messaggi archiviati nel punto in cui appartengono e mostrerà la propria visualizzazione della Posta in arrivo.

+0

'Dopo significativa perdita di capelli' LOL ... lo stesso qui – Umair

0

criteri imap_search TUTTI - Il ritorno di tutti i messaggi che corrispondono al resto del criteri, quindi ti chiedo dov'è il resto dei criteri?

È possibile utilizzare imap_sort($imapStream, 'SORTDATE', 0); (imap_sort - Ottiene e ordina i numeri di messaggio in base ai parametri specificati imap_sort).


Edit, qui è un codice che passa attraverso tutti i messaggi sei casella di posta, invece di imap_num_msg, è possibile utilizzare imap_sort come detto prima, in modo da ottenere sei casella di posta ordinato, se volete.

<?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" è il criterio, voglio tutti i messaggi nella posta in arrivo. Ho provato 'imap_sort' proprio ora, e ha restituito gli stessi risultati. :/ – Ben

+0

si prega di vedere la mia risposta di aggiornamento, guardando php.net ALL non dovrebbe essere usato da solo, ciò significherebbe che è possibile utilizzare QUALSIASI criterio autonomo che strega funziona? –

+0

@poelinca - 'ALL' di per sé restituisce gli stessi risultati di quando l'ho diviso con criteri. Hai una fonte quando dici "non dovrebbe essere usato da solo"? Inoltre, ANY non funzionerà perché non è nell'elenco dei criteri. – Ben

Problemi correlati