如何确定 IMAP 中邮件的 UID
-
23-09-2019 - |
题
我正在使用 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。