如何在IMAP中确定消息的UID

时间:2010-03-30 07:41:44

标签: c# client-server imap pop3 uid

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

2 个答案:

答案 0 :(得分: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中的消息并且在会话中持续存在。 < / p>

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

答案 1 :(得分:3)

非常重要的IMAP事实

这是我学习玩GMail的原因(我希望其他系统是相同的):

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

我使用GMail.com UI移动了消息

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

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

我想我会花时间收听并将其与消息内容一起散列,以获得我实际上可以放入数据库的UID。