2010-03-30 19 views
5

Sto lavorando a un progetto client di posta utilizzando C#. Sto utilizzando sia il protocollo POP che IMAP per comunicare con il server. Il problema è che non riesco a capire perché quando voglio ottenere l'UID per un messaggio il risultato dal server POP e il server IMAP sono diversi.Come determinare l'UID di un messaggio in IMAP

POP 
C: UIDL 1 
S: +OK 1 UID2-1269789826 

e

IMAP 
C: $ FETCH 1 (UID) 
S: * 1 FETCH (UID 2) 
S: $ OK Fetch completed. 

Perché il risultato per ottenere l'UID è così diverso? In IMAP è un'altra funzione per questo? Qualsiasi aiuto è benvenuto. Grazie.

risposta

11

POP3 e IMAP sono due protocolli distinti. Gli UID utilizzati da questi due protocolli non sono correlati e non dovrebbero essere affatto uguali. Infatti, un UID POP3 è una stringa arbitraria mentre un UID IMAP è un numero a 32 bit (trasmesso come stringa).

In teoria, è possibile scrivere un server di posta che supporta sia IMAP che POP3 utilizzano lo stesso UID per entrambi i protocolli, ma non sono a conoscenza di alcun server che farebbe effettivamente questo. In pratica, è necessario considerare gli UID POP3 e gli UID IMAP come valori non correlati.

RFC 1939 (POP3): L'unica-id di un messaggio è una stringa server determinata arbitraria, composto da uno a 70 caratteri nell'intervallo 0x21 a 0x7E, che identifica univocamente un messaggio all'interno di un maildrop e che persiste attraverso le sessioni.

RFC 3501 (IMAP): (Unique Identifier (UID) Messaggio attributo è) un valore a 32 bit assegnato a ciascun messaggio, che quando viene utilizzato con il valore di identificatore di validità univoco (vedi sotto) forma un 64-bit valore che NON DEVE fare riferimento a nessun altro messaggio nella casella di posta o qualsiasi casella postale successiva con lo stesso nome per sempre.

3

Molto importante IMAP fatto

Questo è quello che ho imparato a giocare con GMail (mi aspetto altri sistemi per essere lo stesso):

  • inviato un messaggio alla mia casella di posta
  • Ha UID 45
  • spostare il messaggio spazzatura
  • ora ha UID 5 (perché UID è unico per cassetta postale)
  • riportarlo in Posta in arrivo
  • Ora ha UID 46
  • spostarlo di nuovo spazzatura
  • Ora ha UID 6
  • Prendi l'idea ...

ho spostato il messaggi utilizzando l'interfaccia utente di GMail.com

Per quanto ne so, l'UID è utile solo per trovare le e-mail più recenti in una cartella. È possibile eseguire il comando Cerca ("UID 34:*) per ottenere tutti i messaggi in una cartella con UID 34 o successiva

Ma non iniziare a utilizzare UID come chiave per quel messaggio in un database o si finirà con dupes.

Penso che prenderò il tempo ricevuto e lo cancellerò con il contenuto del messaggio per ottenere un UID che posso effettivamente inserire in un database.

+1

UID è unico quando combinato con UIDVALIDITY ed è specifico per una cartella (il protocollo IMAP lo chiama una casella di posta) (per i dettagli, consultare http://tools.ietf.org/html/rfc3501#section-2.3.1.1). Tuttavia, anche se la combinazione UID/UIDVALIDITY risolve i duplicati, non è garantito che rimanga intatto: i server possono modificare UIDVALIDITY, anche se è scoraggiato. –

+1

Inoltre, tieni presente che Gmail fornisce effettivamente MSGID che sono garantiti come unici e non cambiano. Utilizza l'estensione "ID messaggio unico Gmail" (MSGID) per accedere a questa funzionalità: https://developers.google.com/gmail/imap_extensions –

Problemi correlati