Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在IMAP中确定消息的UID_C#_Client Server_Imap_Pop3_Uid - Fatal编程技术网

C# 如何在IMAP中确定消息的UID

C# 如何在IMAP中确定消息的UID,c#,client-server,imap,pop3,uid,C#,Client Server,Imap,Pop3,Uid,我在一个使用C#的邮件客户端项目中工作。我使用POP和IMAP协议与服务器通信。问题是,我无法理解为什么当我想要获取消息的UID时,POP服务器和IMAP服务器的结果是不同的 POP C: UIDL 1 S: +OK 1 UID2-1269789826 及 为什么获取UID的结果如此不同?在IMAP中,是否有另一个函数用于此? 欢迎任何帮助。 谢谢。POP3和IMAP是两种不同的协议。这两个协议使用的UID不相关,也不应该是相同的。事实上,POP3 UID是一个任意字符串,而IMAP UID是

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

POP
C: UIDL 1
S: +OK 1 UID2-1269789826

为什么获取UID的结果如此不同?在IMAP中,是否有另一个函数用于此? 欢迎任何帮助。
谢谢。

POP3和IMAP是两种不同的协议。这两个协议使用的UID不相关,也不应该是相同的。事实上,POP3 UID是一个任意字符串,而IMAP UID是一个32位数字(作为字符串传输)

理论上,可以编写一个同时支持IMAP和POP3的邮件服务器,对这两个协议使用相同的UID,但我不知道有哪台服务器会这样做实际上,您必须将POP3 UID和IMAP UID视为不相关的值。

(POP3): 消息的唯一id是由服务器确定的任意字符串,由0x21到0x7E范围内的一到70个字符组成,它唯一地标识邮件投递中的消息,并在会话间保持

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

非常重要的IMAP事实

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

  • 向我的收件箱发送了一条消息
  • 它有UID 45
  • 将邮件移动到垃圾邮件
  • 它现在有UID 5(因为每个邮箱的UID是唯一的)
  • 将其移回收件箱
  • 它现在有了UID 46
  • 把它移回垃圾
  • 它现在有UID 6
  • 明白了吧
我使用GMail.com用户界面移动了这些信息

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

但是不要开始在数据库中使用UID作为该消息的密钥,否则最终会被复制


我想我会花时间将收到的信息与邮件内容进行散列,以获得一个可以放入数据库的UID。

UID只有与UIDVality结合时才是唯一的,并且它特定于一个文件夹(IMAP协议称之为邮箱)(有关详细信息,请参阅)。但是,即使UID/UIDVality组合解决了重复问题,也不能保证保持完整-服务器可以更改UIDVality,尽管这是不鼓励的。此外,请注意,Gmail确实提供了保证唯一且不更改的MSGID。请使用“Gmail唯一消息ID”(MSGID)访问此功能的扩展:
IMAP
C: $ FETCH 1 (UID)
S: * 1 FETCH (UID 2)
S: $ OK Fetch completed.