【发布时间】:2020-01-09 22:27:10
【问题描述】:
我们在客户端尝试打开邮件文件夹时遇到了一些问题,但无法找到它,因此我创建了以下方法来尽我所能找到邮件文件夹所在的文件夹名称空间。
private FolderNamespace FindFolderNamespace(ImapClient imapClient, string folderName)
{
string[] folderNameParts = folderName.Split('/');
FolderNamespaceCollection folderNamespaces = new FolderNamespaceCollection();
foreach (FolderNamespace folderNamespace in imapClient.PersonalNamespaces) folderNamespaces.Add(folderNamespace);
foreach (FolderNamespace folderNamespace in imapClient.SharedNamespaces) folderNamespaces.Add(folderNamespace);
foreach (FolderNamespace folderNamespace in imapClient.OtherNamespaces) folderNamespaces.Add(folderNamespace);
Dictionary<FolderNamespace, string> potentialFolderNamespaces = new Dictionary<FolderNamespace, string>();
foreach (FolderNamespace folderNamespace in folderNamespaces)
{
IMailFolder mailFolder = imapClient.GetFolder(folderNamespace);
foreach (string folderNamePart in folderNameParts)
{
if (mailFolder.GetSubfolders().Any(mf => mf.Name.Equals(folderNamePart, StringComparison.OrdinalIgnoreCase)))
{
mailFolder = mailFolder.GetSubfolder(folderNamePart);
}
else
{
break;
}
}
if (mailFolder.FullName.IndexOf(folderName, StringComparison.OrdinalIgnoreCase) >= 0)
{
return folderNamespace;
}
if (!mailFolder.IsNamespace)
{
potentialFolderNamespaces.Add(folderNamespace, mailFolder.FullName);
}
}
FolderNamespace closestFolderNameSpace = potentialFolderNamespaces.OrderByDescending(n => n.Value.Length).FirstOrDefault().Key;
if (closestFolderNameSpace != null)
{
return closestFolderNameSpace;
}
FolderNamespace defaultFolderNamespace = folderNamespaces.FirstOrDefault();
return defaultFolderNamespace;
}
但是,这不起作用。仔细检查后,似乎 PersonalNamespaces、SharedNamespaces 和 OtherNamespaces 都是空的,因此该帐户没有文件夹命名空间。
作为快速检查,我刚刚尝试了以下方法:
imapClient.GetFolder(folderName)
但是,这引发了 ImapProtocolException 说:
IMAP 服务器意外断开。
尝试仅使用根文件夹名称也做了同样的事情。
我有点不知所措如何在这个帐户上打开一个文件夹,因为我似乎找不到它。我该怎么做?
更多细节:
- .Net 4.6.1
- MailKit/MimeKit 版本 1.1,但更新到 2.4.1 没有帮助
- Office365 IMAP 帐户
协议日志:
Connected to --cut--
S: * OK The Microsoft Exchange IMAP4 service is ready. --cut--
C: A00000000 CAPABILITY
S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS MOVE ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+
S: A00000000 OK CAPABILITY completed.
C: A00000001 AUTHENTICATE XOAUTH2 --cut--
S: A00000001 NO AUTHENTICATE failed.
C: A00000002 AUTHENTICATE PLAIN --cut--
S: A00000002 OK AUTHENTICATE completed.
C: A00000003 CAPABILITY
S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS MOVE ID UNSELECT CLIENTACCESSRULES CLIENTNETWORKPRESENCELOCATION BACKENDAUTHENTICATE CHILDREN IDLE NAMESPACE LITERAL+
S: A00000003 OK CAPABILITY completed.
C: A00000004 NAMESPACE
S: A00000004 BAD User is authenticated but not connected.
C: A00000005 LIST "" "INBOX"
S: A00000005 BAD User is authenticated but not connected.
S: * BYE Connection closed. 14
【问题讨论】:
-
请获取协议日志,因为应该始终至少有 1 个命名空间。 github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog
-
@jstedfast 做到了,但我不确定我在寻找什么。
-
这就是为什么你必须发布它(在清除 AUTHENTICATE 或 LOGIN 命令之后)以便其他人可以分析它
-
我的猜测是 INBOX 可能是根命名空间,但我要查看协议日志才能知道(即便如此,PersonalNamespaces 应该有 1 个命名空间)。
-
@jstedfast 发布了协议日志。但是是的,所有 3 个命名空间都是空的。