【问题标题】:Mailkit Authenticate to Imap failsMailkit 对 Imap 的身份验证失败
【发布时间】:2017-01-27 03:31:36
【问题描述】:

我正在尝试使用 MimeKit 和 MailKit 从收件箱中获取电子邮件。
但是无法登录到邮件服务器 Imap。
我正在使用端口 993 和 ssl。
我尝试使用 Telnet 在端口 143 上连接/LOGIN/FETCH,它可以工作。
我尝试使用 Openssl 在端口 993 上连接/LOGIN/FETCH,它可以工作。
Mailkit v.1.4.2.1

科德:

     using (var client = new ImapClient(new ProtocolLogger("imap.log")))
        {
            try
            {
                client.Connect(server, this.port, true);
                client.AuthenticationMechanisms.Remove("XOAUTH2");                    
                client.Authenticate(user, password);
                var inbox = client.Inbox;
                inbox.Open(FolderAccess.ReadWrite);

                if (inbox.Count > 0)
                {
                    var range = Enumerable.Range(0, inbox.Count).ToArray();
                    inbox.AddFlags(range, MessageFlags.Deleted, false);
                    inbox.Expunge();
                }
                client.Disconnect(true);
            }
            catch (AuthenticationException e)
            {
                throw e;
            }
        }

IMAP.LOG:

    Connected to imaps://xxxx.xxx.xx:993/
    S: * OK The Microsoft Exchange IMAP4 service is ready.        
    C: A00000000 CAPABILITY
    S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=NTLM AUTH=GSSAPI UIDPLUS MOVE ID CHILDREN IDLE NAMESPACE LITERAL+
    S: A00000000 OK CAPABILITY completed.
    C: A00000001 AUTHENTICATE NTLM
    S: +
    C: TlRMTVNTUAABAAAABwIIAAAAAAAgAAAAAAAAACAAAAA=
    S: +
    TlRMTVNTUAACAAAABgAGADgAAAAFAokCETTDB74D2YsAAAAAAAAAAKIAogA+AAAABgLwIwAAAA9LAE0ARAACAAYASwBNAEQAAQAUAEsATQBEAEUAWABDADIAMAAwADYABAAaAGkAbgB0AGUAcgBuAC4AawBtAGQALgBkAGsAAwAwAEsATQBEAEUAWABDADIAMAAwADYALgBpAG4AdABlAHIAbgAuAGsAbQBkAC4AZABrAAUAGgBpAG4AdABlAHIAbgAuAGsAbQBkAC4AZABrAAcACAA8TRLTaRLSAQAAAAA=
    C: TlRMTVNTUAADAAAAGAAYAFYAAAAYABgAbgAAAAAAAABIAAAADgAOAEgAAAAAAAAAVgAAAAAAAACGAAAAAYIIAgoAWikAAAAPaQBvAG0AdABlAHMAdAA6stwc8LXYfAAAAAAAAAAAAAAAAAAAAAC5L0RCGGq9hCGwriyfURwGscjNCDTBeSA=
    S: A00000001 NO AUTHENTICATE failed.
    C: A00000002 AUTHENTICATE PLAIN
    S: +
    C: XXXXXXXXXX
    S: A00000002 NO AUTHENTICATE failed.
    C: A00000003 LOGIN xxxxxxxxx xxxxxxxx
    S: A00000003 NO Server Unavailable. 15
    S: * BYE Connection closed. 14A

例外:

    AuthenticationException: “Authentication failed.”
    at MailKit.Net.Imap.ImapClient.Authenticate(Encoding encoding,    ICredentials credentials, CancellationToken cancellationToken)
       at MailKit.MailService.Authenticate(String userName, String password,    CancellationToken cancellationToken)

【问题讨论】:

  • 如果您愿意,您能否通过从 GitHub 源构建 MailKit 并在您的应用程序中测试生成的 dll 来验证此问题是否已解决?如果可以的话,我想在这个周末发布一个 nuget 版本来解决这个问题,但我不想说“NTLM 已修复!”然后发现它不是......

标签: c# imap mailkit


【解决方案1】:

AUTHENTICATE NTLM 身份验证中有/曾经有一个bug,这是 MailKit 在您的案例中尝试的第一个身份验证机制。不幸的是,在 Exchange 中存在一个错误(?),即当 NTLM 身份验证失败时,它似乎会自动拒绝 AUTHENTICATE PLAIN,这是 MailKit 回退的尝试。

作为一种解决方法,通过执行以下操作在 MailKit 中禁用 NTLM 身份验证:

client.AuthenticationMechanisms.Remove ("NTLM");

生成的代码应如下所示:

using (var client = new ImapClient(new ProtocolLogger("imap.log")))
{
    try
    {
        client.Connect(server, this.port, true);
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        client.AuthenticationMechanisms.Remove("NTLM");
        client.Authenticate(user, password);
        var inbox = client.Inbox;
        inbox.Open(FolderAccess.ReadWrite);

        if (inbox.Count > 0)
        {
            var range = Enumerable.Range(0, inbox.Count).ToArray();
            inbox.AddFlags(range, MessageFlags.Deleted, false);
            inbox.Expunge();
        }
        client.Disconnect(true);
    }
    catch (AuthenticationException e)
    {
        throw e;
    }
}

【讨论】:

  • 您好已经离开几天了,但是更改了代码并且可以正常工作....非常感谢...
  • 我发布了带有 NTLM 修复的 MailKit 1.8.1。您能否检查一下这是否为您修复了 NTLM 身份验证?
猜你喜欢
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2020-07-28
相关资源
最近更新 更多