【问题标题】:How to determine the UID of a message in IMAP如何确定 IMAP 中消息的 UID
【发布时间】:2011-02-02 08:47:11
【问题描述】:

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

【问题讨论】:

    标签: c# client-server imap pop3 uid


    【解决方案1】:

    非常重要的 IMAP 事实

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

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

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

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

    但不要开始使用 UID 作为数据库中该消息的键,否则你会得到欺骗。

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

    【讨论】:

    • UID 仅在与 UIDVALIDITY 结合使用时是唯一的,并且特定于文件夹(IMAP 协议将其称为邮箱)(有关详细信息,请参阅tools.ietf.org/html/rfc3501#section-2.3.1.1)。然而,即使 UID/UIDVALIDITY 组合解决了欺骗问题,也不能保证保持不变 - 服务器可以更改 UIDVALIDITY,即使不鼓励这样做。
    • 另外,请注意,Gmail 确实提供了保证唯一且不会更改的 MSGID。使用“Gmail 唯一消息 ID”(MSGID) 扩展来访问此功能:developers.google.com/gmail/imap_extensions
    【解决方案2】:

    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 位值,不得引用任何其他消息永远在邮箱或任何后续的同名邮箱中。

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2010-09-18
      • 2013-10-14
      • 1970-01-01
      相关资源
      最近更新 更多