【问题标题】:MailKit - FolderCache and deleted folderMailKit - FolderCache 和删除的文件夹
【发布时间】:2017-07-04 21:51:09
【问题描述】:

我有两个客户端(ClientA 和 ClientB)连接到 IMAP 服务器。 ClientA 正在运行 mailkit。当我使用 ClientB 删除或移动文件夹时,mailkit 客户端在尝试从已删除的文件夹中打开或获取消息时出错。实际上,当我尝试从已删除的文件夹中获取消息时,我与服务器断开连接(我猜这是服务器的预期行为),因为我试图检测我要执行命令的文件夹是否,仍然存在。

我看到 mailkit 使用 FolderCache,当我使用 GetFolder 方法时,即使在我重新连接客户端后,当我使用 GetFolder(string path) 方法时,我仍然会获得已删除文件夹的 IMailFolder 引用。为了避免 FolderCache,我每次要同步远程文件夹时都会创建一个新的 MailClient 实例,以避免缓存中没有现有文件夹。我想知道在这种情况下这是否是推荐的方法?

更新:

所以,我现在正在使用 GetSubfolders 命令,我可以看到一个 LIST 命令已发送到服务器。但是,在以下情况下,该命令似乎存在问题:

ClientB 正在删除文件夹 INBOX.spam.op,ClientA 正在尝试移动路径为 INBOX.spam.op.folder1 的文件夹。发生的事情是 - 服务器正在创建一个新文件夹 INBOX.spam.op,其属性为 NonExistent。这是预期的服务器行为,以便创建路径为 INBOX.spam.op.folder1

的文件夹

但是,当我在 INBOX.spam 上使用 GetSubfolders 时,看看 Mailkit 会发生什么 - 我得到一个 IMailFolder 实例,其名称 = "op",属性 = 新属性 NonExistent 和旧 "op" 属性的混合文件夹(FolderCache 中的文件夹)。 NonExistent 的 UidValidity 应该为 0,但它与 FolderCache 中“op”文件夹的 UIDValidity 相同,即使服务器响应是这样

C: A00000102 LIST "" "INBOX.spam.%" 返回(已订阅儿童状态(UIDVALIDITY)) S: * LIST (\NonExistent \HasChildren) "."收件箱.spam.op S:A00000102 OK 列表完成(0.001 + 0.000 秒)。

我尝试继承 ImapClient 并添加我自己的方法 GetFolderNoCache(string path) 但这不起作用,因为内部类。还有其他建议吗?

【问题讨论】:

    标签: mailkit


    【解决方案1】:

    您要做的是从命名空间中获取顶级文件夹。然后,使用该 ImapFolder 对象,获取其子对象的列表(如果您试图查看是否深度嵌套的文件夹,则依此类推)。

    var toplevel = client.GetFolder (client.PersonalNamespaces[0]);
    foreach (var folder in toplevel.GetSubfolders ()) {
        // look for the folder you are interested in...
        // if it's not here, then the folder has been deleted
    }
    

    【讨论】:

    • 我已在 GitHub 上为 MailKit 提交了一个补丁,以不合并旧文件夹属性。
    • UID 与旧缓存版本相同,因为您的服务器没有响应 STATUS (UIDVALIDITY) 请求。这似乎是您的服务器中的一个错误。
    • 这是一个疯狂的猜测,但我相信响应中没有 UIDVALIDITY,因为该文件夹具有属性 \NonExistent。如果它不存在,它不应该有 UIDVALIDITY、UIDNEXT 等。我在想......可能是当 Mailkit 注意到 \NonExistent 的存在时,即使没有对 UIDVALIDITY、UIDNEXT 等的响应,它也应该清除缓存的文件夹属性因为您可以通过 \NonExistent 来暗示这些值。你觉得杰弗里怎么样?服务器是 Dovecot,我会用 gmail 试试这个场景看看结果。
    • 这里从 dovecot 支持更新。 [20:25] Emooo:它还说 INBOX.spam.op 不存在但有孩子。 [20:25] Emooo:不存在的文件夹不能有 UID 有效性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多