【问题标题】:Check if imap folder exist using MailKit使用 MailKit 检查 imap 文件夹是否存在
【发布时间】:2019-01-09 15:31:04
【问题描述】:

我正在尝试将邮件移动到另一个文件夹,但我找不到检查目标文件夹是否存在的简单方法,我假设给定的文件夹路径是根文件夹,我尝试这样做:

public void MoveMessages(Config accountInfo, List<int> uids, string 
   sourceFolderName, string targetFolderName)   
{
            ValidateAccountInfoConfiguration(accountInfo);
            using (var client = new ImapClient())
            {
                Authenticate(accountInfo, client);

                var sourceFolder = GetSourceFolder(sourceFolderName, client);
                sourceFolder.Open(FolderAccess.ReadWrite);
                var topLevelFolder = client.GetFolder(client.PersonalNamespaces[0]);
                var topFolders = topLevelFolder.GetSubfolders();
                var targetFolder = topFolders.FirstOrDefault(folder => folder.Name == targetFolderName);
                if (targetFolder == null)
                    targetFolder = topLevelFolder.Create(targetFolderName, true);
                var uidsToMove = GetUniqueIds(sourceFolder, SearchQuery.Seen).Where(uid => uids.Any(uidToMove => uidToMove == uid.Id)).ToList();
                sourceFolder.MoveTo(uidsToMove, targetFolder);
                sourceFolder.Expunge(uidsToMove);

            }
        }

在文档中,IMailFolder 接口包含 Exists 属性,但是当我尝试使用 IMailFolder.GetFolder("pathToFolder") 获取文件夹时,如果该文件夹不存在,则会引发 folderNotFound 异常,因此我无法理解使用Exists 财产的情况下,我错过了什么?或者我当前的实现是实现获取目标文件夹的正确方法?

【问题讨论】:

    标签: c# imap mailkit


    【解决方案1】:

    除了下载完整的文件夹列表之外,还有以下方法:

    public async Task<bool> FolderExistsAsync(ImapClient c, string path) {
        try {
           await c.GetFolderAsync(path);
        } catch (FolderNotFoundException) {
            return false;
        }
        return true;
    }
    

    (虽然我不喜欢将 try/catch 块用于“正常”控制流)

    【讨论】:

      【解决方案2】:

      您当前的实现是正确的方法。

      Exists 属性对于某些 IMAP 服务器很有用,这些服务器支持叶节点文件夹缺少直接父文件夹,例如(这意味着父文件夹将有 Exists == false)。

      我只在使用 MailDir 作为存储格式的 IMAP 服务器中看到过这种情况,因为它创建文件夹的方式。

      通常你有一个这样的文件夹树:

      toplevel
      toplevel/sublevel
      toplevel/sublevel/leaf-node
      

      每个文件夹都必须存在于整个树中。

      但 MailDir 不使用 UNIX 或 DOS 目录分隔符,它使用 '.',因此您可以拥有以下文件夹列表:

      toplevel
      toplevel.sublevel.leaf-node
      

      在上面的示例中,没有toplevel.sublevel 文件夹,但它会出现在IMailFolder 节点的树中......因此,需要有一个Exists 属性。

      【讨论】:

      • 感谢@jstedfast 的解释,现在我明白了! :)
      • 谷歌标签也可以做到这一点。如果您在名称中创建一个带有“/”的标签,那么您最终会得到虚拟父文件夹。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多