2010-03-30 16 views
5

Estoy trabajando en un proyecto de cliente de correo utilizando C#. Estoy usando el protocolo POP e IMAP para comunicarme con el servidor. El problema es que no puedo entender por qué cuando quiero obtener el UID para un mensaje, el resultado del servidor POP y el servidor IMAP son diferentes.Cómo determinar el UID de un mensaje en IMAP

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

y

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

Por qué el resultado para obtener el UID es tan diferente? En IMAP, ¿otra función para esto? Cualquier ayuda es bienvenida. Gracias.

Respuesta

11

POP3 e IMAP son dos protocolos distintos. Los UID utilizados por estos dos protocolos no están relacionados y se supone que no son los mismos. De hecho, un UID POP3 es una cadena arbitraria, mientras que un UID IMAP es un número de 32 bits (transmitido como una cadena).

En teoría, es posible escribir un servidor de correo que admita que tanto IMAP como POP3 usen el mismo UID para ambos protocolos, pero no conozco ningún servidor que realmente lo haga. En la práctica, debe tratar los UID POP3 y los UID IMAP como valores no relacionados.

RFC 1939 (POP3): La única-id de un mensaje es una cadena determinada por el servidor arbitraria, que consiste de uno a 70 caracteres en el rango 0x21 a 0x7E, que identifica de forma única un mensaje dentro de un maildrop y que persiste en todas las sesiones.

RFC 3501 (IMAP): (Identificador Único (UID) Mensaje atributo es) un valor de 32 bits asignado a cada mensaje, que cuando se utiliza con el valor único de vigencia de identificador (ver más abajo) forma un 64-bit valor que NO DEBE referirse a ningún otro mensaje en el buzón o cualquier buzón subsiguiente con el mismo nombre para siempre.

3

hecho muy importante IMAP

Esto es lo que he aprendido a jugar con Gmail (I esperan otros sistemas a ser lo mismo):

  • envió un mensaje a mi bandeja de entrada
  • Tiene UID 45
  • mover el mensaje a la basura
  • ahora tiene 5 UID (UID es único porque por buzón)
  • devolverlo a la bandeja de entrada
  • Ahora tiene UID 46
  • de nuevo a la chatarra movimiento que
  • Ahora tiene UID 6
  • Obtener la idea ...

moví el uso de mensajes la IU de GMail.com

Por lo que yo sé, UID solo es útil para encontrar los últimos correos electrónicos en una carpeta. Puede ejecutar el comando Buscar ("UID 34:*) para obtener todos los mensajes en una carpeta con UID 34 o superior.

Pero no empiece a utilizar UID como clave de ese mensaje en una base de datos o terminará con engañados.

Creo que voy a tomar el tiempo recibido y hash con el contenido del mensaje para obtener un UID que realmente puedo poner en una base de datos.

+1

UID es único cuando se combina con UIDVALIDITY y es específico de una carpeta (el protocolo IMAP lo llama un buzón) (ver http://tools.ietf.org/html/rfc3501#section-2.3.1.1 para más detalles). Sin embargo, aunque el combo UID/UIDVALIDITY resuelve los duplicados, no se garantiza que permanezca intacto: los servidores pueden cambiar la UIDVALIDITY, aunque no se recomienda. –

+1

Además, tenga en cuenta que Gmail proporciona realmente MSGID que se garantiza que son únicos y no cambian. Use la extensión "ID de mensaje único de Gmail" (MSGID) para acceder a esta funcionalidad: https://developers.google.com/gmail/imap_extensions –

Cuestiones relacionadas