【问题标题】:Open a mail folder in MailKit when there are no folder namespaces当没有文件夹命名空间时,在 MailKit 中打开一个邮件文件夹
【发布时间】: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 个命名空间都是空的。

标签: c# mailkit mimekit


【解决方案1】:

问题来了:

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

验证后,MailKit 发送NAMESPACE 命令从服务器获取命名空间列表,但它响应一个荒谬的错误,声称客户端已通过身份验证但未连接(呃,这是不可能的,或者我们不会发送命令或接收响应,呵呵)。

当 MailKit 收到对 NAMESPACE 命令的 BAD 响应时,它会回退到尝试获取 INBOX 文件夹的信息...为此它会返回相同的 BAD 错误,这是没有意义的。

结论:IMAP服务器坏了。

可能的解决方案(除了获得一个不糟糕的新 IMAP 服务器):

此日志看起来像是使用旧版 MailKit(1.1?)获取的,因此请在致电 Authenticate("username", "password") 之前尝试执行此操作:

client.AuthenticationMechanisms.Remove ("XOAUTH2");

如果 仍然 导致 BAD NAMESPACE 命令,那么我不确定可以做什么...

更新:

基于https://unix.stackexchange.com/questions/164823/user-is-authenticated-but-not-connected-after-changing-my-exchange-password - 听起来 Exchange IMAP 有一个错误,如果用户名正确但密码错误,Exchange IMAP 服务器将“验证”用户,但会进入这种奇怪的“已验证但未连接”导致出现上述错误。

解决方法是提供正确的密码。

【讨论】:

  • 仍然无法正常工作,不幸的是这是在客户端,因此我们无法决定是否更改 IMAP 服务器。是的,还在 1.1 版中,还不能完全更新。
  • 修改了密码,现在一切正常,非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2019-05-11
  • 2020-09-29
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多