7

我正在使用 C# 处理邮件客户端项目。我同时使用 POP 和 IMAP 协议与服务器通信。问题是我无法弄清楚为什么当我想获取消息的 UID 时,来自 POP 服务器和 IMAP 服务器的结果是不同的。

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

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

为什么获取UID的结果如此不同?在 IMAP 中是另一个功能吗?欢迎任何帮助。谢谢。

4

2 回答 2

15

POP3 和 IMAP 是两种不同的协议。这两个协议使用的 UID 不相关,根本不应该相同。事实上,POP3 UID 是任意字符串,而 IMAP UID 是 32 位数字(作为字符串传输)。

理论上,可以编写一个同时支持 IMAP 和 POP3 的邮件服务器,对这两种协议使用相同的 UID,但我不知道有任何服务器会真正做到这一点。在实践中,您必须将 POP3 UID 和 IMAP UID 视为不相关的值。

RFC 1939 (POP3): 消息的唯一 ID 是由服务器确定的任意字符串,由 0x21 到 0x7E 范围内的 1 到 70 个字符组成,它唯一地标识了邮件投递中的消息,并且在会话中持续存在。

RFC 3501 (IMAP):( 唯一标识符 (UID) 消息属性是)分配给每个消息的 32 位值,当与唯一标识符有效性值(见下文)一起使用时,该值形成一个 64 位值,不得引用邮箱中的任何其他邮件或任何后续邮箱中的任何同名邮件。

于 2010-03-30T19:31:15.067 回答
8

非常重要的 IMAP 事实

这是我在玩 GMail 时学到的(我希望其他系统也一样):

  • 向我的收件箱发送了一条消息
  • 它有 UID 45
  • 将邮件移至垃圾邮件
  • 它现在有 UID 5(因为每个邮箱的 UID 是唯一的)
  • 将其移回收件箱
  • 它现在有 UID 46
  • 将其移回垃圾
  • 它现在有 UID 6
  • 得到这个想法...

我使用 GMail.com UI 移动了邮件

据我所知,UID 仅在查找文件夹中的最新电子邮件时有用。您可以运行命令 Search(" UID 34:*) 以获取 UID 34 或更高的文件夹中的所有消息。

但是不要开始使用 UID 作为数据库中该消息的密钥,否则您最终会受到欺骗。

我想我会花时间收到消息并将其与消息内容进行哈希处理,以获得一个我可以实际放入数据库的 UID。

于 2013-12-21T04:28:31.713 回答