使用 MailKit 检查 imap 文件夹是否存在
Check if imap folder exist using MailKit
我正在尝试将邮件移动到另一个文件夹,但我找不到检查目标文件夹是否存在的简单方法,我假设给定的文件夹路径是根文件夹,我尝试这样做:
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 propety 的用例,我错过了什么?或者我当前的实现是获取目标文件夹的正确方法?
您当前的实施是正确的方法。
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
属性.
作为下载完整文件夹列表的替代方法,这里有:
public async Task<bool> FolderExistsAsync(ImapClient c, string path) {
try {
await c.GetFolderAsync(path);
} catch (FolderNotFoundException) {
return false;
}
return true;
}
(虽然我不喜欢将 try/catch 块用于 'normal' 控制流)
我正在尝试将邮件移动到另一个文件夹,但我找不到检查目标文件夹是否存在的简单方法,我假设给定的文件夹路径是根文件夹,我尝试这样做:
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 propety 的用例,我错过了什么?或者我当前的实现是获取目标文件夹的正确方法?
您当前的实施是正确的方法。
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
属性.
作为下载完整文件夹列表的替代方法,这里有:
public async Task<bool> FolderExistsAsync(ImapClient c, string path) {
try {
await c.GetFolderAsync(path);
} catch (FolderNotFoundException) {
return false;
}
return true;
}
(虽然我不喜欢将 try/catch 块用于 'normal' 控制流)