如何在IMAP中确定消息的UID

Ema*_*uel 5 c# pop3 imap client-server uid

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

POP
C: UIDL 1
S: +OK 1 UID2-1269789826
Run Code Online (Sandbox Code Playgroud)

IMAP
C: $ FETCH 1 (UID)
S: * 1 FETCH (UID 2)
S: $ OK Fetch completed.
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*rny 11

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

从理论上讲,可以编写支持IMAP和POP3的邮件服务器为这两种协议使用相同的UID,但我不知道任何服务器实际上会这样做.实际上,您必须将POP3 UID和IMAP UID视为不相关的值.

RFC 1939(POP3): 消息的唯一ID是由服务器确定的任意字符串,由0x21到0x7E范围内的1到70个字符组成,它唯一地标识maildrop中的消息并且在会话中保持不变.

RFC 3501(IMAP):( 唯一标识符(UID)消息属性是)为每条消息分配的32位值,当与唯一标识符有效性值(见下文)一起使用时,形成一个绝不能引用的64位值邮箱中的任何其他邮件或永远具有相同名称的任何后续邮箱.


Sim*_*ver 5

非常重要的 IMAP 事实

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

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

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

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

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

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

  • 另请注意,Gmail 实际上提供了保证唯一且不会更改的 MSGID。使用“Gmail 唯一消息 ID”(MSGID) 扩展程序来访问此功能:https://developers.google.com/gmail/imap_extensions (3认同)