2010-03-30 4 views
5

Ich arbeite in einem Mail-Client-Projekt mit C#. Ich verwende sowohl das POP- als auch das IMAP-Protokoll, um mit dem Server zu kommunizieren. Das Problem ist, dass ich nicht herausfinden kann, warum, wenn ich die UID für eine Nachricht erhalten möchte, das Ergebnis vom POP-Server und vom IMAP-Server unterschiedlich sind.So ermitteln Sie die UID einer Nachricht in IMAP

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

und

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

Warum das Ergebnis für die UID zu erhalten, so unterschiedlich ist? In IMAP ist eine andere Funktion dafür? Jede Hilfe ist willkommen. Danke.

Antwort

11

POP3 und IMAP sind zwei unterschiedliche Protokolle. Die UIDs, die von diesen beiden Protokollen verwendet werden, sind nicht verwandt und sollen nicht die gleichen sein. Tatsächlich ist eine POP3-UID eine willkürliche Zeichenkette, während eine IMAP-UID eine 32-Bit-Zahl ist (die als Zeichenkette übertragen wird).

Theoretisch ist es möglich, einen Mailserver zu schreiben, der sowohl IMAP als auch POP3 unterstützt, für beide Protokolle die gleiche UID zu verwenden, aber mir ist kein Server bekannt, der dies tatsächlich tun würde. In der Praxis müssen POP3-UIDs und IMAP-UIDs als nicht verwandte Werte behandelt werden.

RFC 1939 (POP3): Die einzigartige-ID einer Nachricht ist eine beliebige Server bestimmte Zeichenkette, die aus einer bis 70 Zeichen im Bereich von 0x21 bis 0x7E, die eindeutig eine Botschaft innerhalb eines Maildrop identifiziert und welcher besteht über Sitzungen hinweg.

RFC 3501 (IMAP): (Unique Identifier (UID) Message-Attribut) ein 32-Bit-Wert zu jeder Nachricht zugeordnet ist, das, wenn sie mit dem eindeutigen Identifikator Gültigkeitswert (siehe unten), bildet ein 64-Bit verwendet, Wert, der auf keine andere Nachricht in der Mailbox oder auf eine weitere Mailbox mit dem gleichen Namen für immer verweisen darf.

3

Sehr wichtig IMAP Tatsache

Dies ist, was ich mit GMail gelernt zu spielen (ich erwarte, dass andere Systeme gleich sein):

  • Sent eine Nachricht an meinen Posteingang
  • Es hat UID 45
  • Verschieben Sie die Nachricht
  • Es ist nun auf Junk hat UID 5 (weil UID einzigartige pro Mailbox)
  • es
  • Posteingang verschieben Rückseite hat es jetzt 46 UID es
  • Zurück zu Junk
  • Es hat jetzt UID 6
  • erhalten die Idee ...

ich die Nachrichten, die unter Verwendung von die GMail.com UI

Soweit ich sagen kann UID ist nur nützlich beim Finden der neuesten E-Mails in einem Ordner. Sie können den Befehl Search ("UID 34:*) ausführen, um alle Nachrichten in einem Ordner mit UID 34 oder höher zu erhalten.

Aber starten Sie nicht UID als Schlüssel zu dieser Nachricht in einer Datenbank oder Sie werden am Ende Betrüger.

Ich denke, ich werde die empfangene Zeit nehmen und es mit dem Inhalt der Nachricht hashen, um eine UID zu erhalten, die ich tatsächlich in eine Datenbank einfügen kann.

+1

UID ist nur in Verbindung mit UIDVALIDITY eindeutig und für einen Ordner spezifisch (das IMAP-Protokoll nennt es ein Postfach) (Details siehe http://tools.ietf.org/html/rfc3501#section-2.3.1.1). Obwohl die UID/UIDVALIDITY-Kombination die Duples löst, ist es jedoch nicht garantiert, dass sie intakt bleibt - Server dürfen UIDVALIDITY ändern, obwohl dies nicht empfohlen wird. –

+1

Beachten Sie außerdem, dass Google Mail tatsächlich MSGIDs bereitstellt, die garantiert eindeutig sind und sich nicht ändern. Verwenden Sie die Erweiterung "Gmail-eindeutige Nachrichten-ID" (MSGID), um auf diese Funktion zuzugreifen: https://developers.google.com/gmail/imap_extensions –