C# 同一邮件帐户上的MailKit和多个客户端

C# 同一邮件帐户上的MailKit和多个客户端,c#,email,exchange-server,mailkit,C#,Email,Exchange Server,Mailkit,您可以连接到一个邮件帐户的并发客户端数量有限制吗 我有一个应用程序,可以在每次请求时打开一个新的ImapClient。ImapClient将打开收件箱和文件夹,并通过UID将邮件从一个移动到另一个。多个客户端将永远不会同时访问同一邮件,但可能会同时在同一帐户中移动多个邮件 当我使用Exchange同时访问大约5个以上的客户端时,似乎会出现错误,并且会出现许多不同的错误,如: “IMAP服务器以“否”响应响应“复制”命令。” “IMAP服务器对‘EXPUNGE’命令的响应为‘否’。” 当我移动邮件

您可以连接到一个邮件帐户的并发客户端数量有限制吗

我有一个应用程序,可以在每次请求时打开一个新的ImapClient。ImapClient将打开收件箱和文件夹,并通过UID将邮件从一个移动到另一个。多个客户端将永远不会同时访问同一邮件,但可能会同时在同一帐户中移动多个邮件

当我使用Exchange同时访问大约5个以上的客户端时,似乎会出现错误,并且会出现许多不同的错误,如: “IMAP服务器以“否”响应响应“复制”命令。” “IMAP服务器对‘EXPUNGE’命令的响应为‘否’。”

当我移动邮件时,我按以下顺序操作:

  • 使用新的ImapClient
  • 连接并验证客户端
  • 获取INBOX和FolderA的FolderAsync,然后等待响应
  • 使用OpenSync()和ReadWrite打开收件箱,然后等待任务
  • 使用FetchAsync()提取收件箱,循环搜索结果,根据MessageID查找所需的UID
  • 调用MoveToAsync()将基于uid的邮件移动到文件夹,然后等待
  • 使用新UID标记FolderA.SetFlagAsync(),并使用
  • 等待6,七,
  • INBOX.SetFlagAsync()具有以前的UID,并将邮件标记为已删除,请等待操作
  • 使用INBOX.CloseAsync和FolderA.CloseAsync关闭IMAP文件夹

  • 没有定义IMAP服务器允许的最大客户端数量的标准。我已经读到Thunderbird最多使用5个并发连接(这可能表明他们发现在野外的大多数IMAP服务器都可以正常工作),因此这可能解释了您看到的情况。

    事实上,一些进一步的调查显示,MailKit在创建15个异步连接时没有问题(连接、身份验证、选择收件箱和文件夹)甚至获取所有15个连接的收件箱在所有15个连接的顺序中,开始将上一个文件夹中的邮件标记为已删除,如果dest文件夹是收件箱,则标记为未看到,则Exchange响应“不复制”时似乎会出现问题。在Imap协议日志中,我在结尾处看到以下行:“C:复制29,33收件箱S:没有复制失败或部分完成。”所以问题是,在最初的问题中写的移动邮件序列中是否有任何禁止或危险的步骤?另一个客户端是否移动了任何相同的消息?我刚刚注意到了这一点,但似乎您使用的是基于索引的API,而不是基于UniqueID的API。如果您有多个客户端操作,这可能会带来真正的问题在同一个文件夹上,因为它将更改邮件的索引偏移量。我认为这正是问题所在。但我不确定如何获取基于UID而不是基于索引的UID。我获取文件夹以获取所有邮件,因为我不知道UID(仅MessageID)。由于我需要UID来进行移动到/复制,因此我需要根据已知的MessageID来计算UID,还是我错过了更好的方法?