У нас возникла небольшая проблема с клиентом при попытке открыть почтовую папку, и ее не удалось найти, поэтому я создал приведенный ниже метод, чтобы изо всех сил попытаться найти пространство имен папки, в котором находилась почтовая папка.
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 неожиданно отключился.
Попытка использовать только имя корневой папки также сделала то же самое.
Я немного не понимаю, как мне открыть папку в этой учетной записи, потому что я не могу ее найти. Как мне это сделать?
Еще немного деталей:
- .Нет 4.6.1
- MailKit/MimeKit версии 1.1, но обновление до 2.4.1 не помогло
- IMAP-аккаунт Office365
Журнал протокола:
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
Connect (hostName, port, SecureSocketOptions.Auto)
- person jstedfast   schedule 09.01.2020client.AuthenticationMechanisms.Remove ("XOAUTH2");
до тех пор, пока вы не обновитесь до MailKit 2.x (2.x больше не пытается использовать XOAUTH2, если вы явно не укажете это). - person jstedfast   schedule 09.01.2020