MailKit - FolderCache和已删除的文件夹

时间:2017-06-30 19:11:08

标签: mailkit

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

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

更新:

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

ClientB正在删除文件夹INBOX.spam.op,ClientA正在尝试使用路径INBOX.spam.op.folder1移动文件夹。会发生什么 - 服务器正在创建一个带有Attributes NonExistent的新文件夹INBOX.spam.op。这是用于创建路径为INBOX.spam.op.folder1

的文件夹的预期服务器行为

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

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

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

1 个答案:

答案 0 :(得分:2)

您要做的是从命名空间中获取顶级文件夹。然后,使用该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
}