我正在使用 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 中有另一个功能吗?欢迎任何帮助。谢谢。

有帮助吗?

解决方案

POP3和IMAP是两个不同的协议。通过这两个协议中使用的UID并非相关,但并不应该是在所有相同。事实上,POP3 UID是一个任意字符串而在IMAP UID是一个32位的数字(如串发送)。

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

RFC 1939 (POP3): 消息的唯一ID是一个任意的服务器确定的字符串,在范围由一个70个字符为0x21到的0x7E,它唯一地标识一个信箱中的消息,并且能够保持多个会话。

RFC 3501 (IMAP): (唯一标识符(UID)消息属性是)分配给每个消息,该消息与该唯一的标识符的有效性值使用时,一个32位的值(见下文)形成一个64位的值,该值不能引用任何其他消息在邮箱或具有相同名称永远。

的任何后续邮箱

其他提示

非常重要的 IMAP 事实

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

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

我使用 GMail.com UI 移动邮件

据我所知,UID 仅在查找文件夹中的最新电子邮件时有用。您可以运行命令搜索(“UID 34:*) 获取 UID 为 34 或以上的文件夹中的所有邮件。

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

我想我将利用收到的时间并将其与消息内容进行散列,以获得实际上可以放入数据库的 UID。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top