2010-03-30 13 views
5

Tôi đang làm việc trong dự án thư khách bằng C#. Tôi đang sử dụng cả giao thức POP và IMAP để giao tiếp với máy chủ. Vấn đề là tôi không thể tìm ra lý do tại sao khi tôi muốn nhận được UID cho một thông báo, kết quả từ máy chủ POP và máy chủ IMAP khác nhau.Cách xác định UID của thư trong IMAP

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

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

Tại sao kết quả cho việc thu thập các UID là quá khác biệt? Trong IMAP là một chức năng khác cho điều này? Mọi trợ giúp đều được chào đón. Cảm ơn.

Trả lời

11

POP3 và IMAP là hai giao thức riêng biệt. Các UID được sử dụng bởi hai giao thức này không liên quan và không được cho là giống nhau. Trên thực tế, UID POP3 là chuỗi tùy ý trong khi UID IMAP là số 32 bit (được truyền dưới dạng chuỗi). Về lý thuyết, có thể viết một máy chủ hỗ trợ cả IMAP và POP3 sử dụng cùng một UID cho cả hai giao thức, nhưng tôi không biết bất kỳ máy chủ nào thực sự thực hiện điều này. Trong thực tế, bạn phải coi POPID UID và IMAP UID là các giá trị không liên quan.

RFC 1939 (POP3): độc đáo-id của thông điệp là một chuỗi máy chủ xác định tùy ý, bao gồm một đến 70 ký tự trong khoảng 0x21 đến 0x7E, mà xác định duy nhất một thông điệp trong một maildrop và đó vẫn tồn tại qua các phiên.

RFC 3501 (IMAP): (Unique Identifier (UID) nhắn Thuộc tính) một giá trị 32-bit được gán cho mỗi tin nhắn, mà khi được sử dụng với giá trị hiệu lực định danh duy nhất (xem bên dưới) tạo thành một 64-bit giá trị KHÔNG PHẢI đề cập đến bất kỳ thư nào khác trong hộp thư hoặc bất kỳ hộp thư tiếp theo nào có cùng tên mãi mãi.

3

Rất quan trọng IMAP thực tế

Đây là những gì tôi đã học chơi với GMail (Tôi hy vọng các hệ thống khác là giống nhau):

  • Sent một thông điệp tới hộp thư của tôi
  • Nó có UID 45
  • Di chuyển thư đến thư rác
  • Hiện tại có UID 5 (vì UID là duy nhất cho mỗi hộp thư)
  • Di chuyển nó trở lại hộp thư đến
  • Nó bây giờ có UID 46
  • Move nó trở lại rác
  • Nó bây giờ có UID 6
  • Lấy ý tưởng ...

tôi chuyển các thông điệp sử dụng giao diện người dùng GMail.com

Theo như tôi có thể nói UID chỉ hữu ích trong việc tìm kiếm các email mới nhất trong một thư mục. Bạn có thể chạy lệnh Tìm kiếm ("UID 34:*) để nhận tất cả thư trong thư mục có UID 34 trở lên.

Nhưng đừng bắt đầu sử dụng UID làm chìa khóa cho thư đó trong cơ sở dữ liệu hoặc bạn sẽ kết thúc với dupes.

Tôi nghĩ rằng tôi sẽ dành thời gian nhận được và băm nó với nội dung tin nhắn để có được một UID tôi thực sự có thể đưa vào cơ sở dữ liệu.

+1

UID chỉ là duy nhất khi kết hợp với UIDVALIDITY và nó cụ thể cho một thư mục (giao thức IMAP gọi nó là hộp thư) (xem http://tools.ietf.org/html/rfc3501#section-2.3.1.1 để biết chi tiết). Tuy nhiên, mặc dù combo UID/UIDVALIDITY giải quyết các dupes, nó không được bảo đảm để nguyên vẹn - các máy chủ được phép thay đổi UIDVALIDITY, mặc dù nó không được khuyến khích. –

+1

Ngoài ra, xin lưu ý rằng Gmail thực sự cung cấp các MSGID được đảm bảo là duy nhất và không thay đổi. Sử dụng tiện ích mở rộng "ID thư duy nhất của Gmail" (MSGID) để truy cập chức năng này: https://developers.google.com/gmail/imap_extensions –