You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决MailKit.Security.AuthenticationException: 'LOGIN failed.'异常

解决MailKit连接Outlook IMAP时的LOGIN失败问题

针对你遇到的MailKit.Security.AuthenticationException: 'LOGIN failed.'异常,结合Outlook邮箱的特性,可按以下步骤排查解决:

1. 检查两步验证与应用密码

如果你的邮箱账户开启了两步验证,直接使用普通密码会认证失败,必须生成并使用应用密码:

  • 登录网页版Outlook账户,进入「账户安全」设置
  • 找到「应用密码」选项,生成一个专门用于MailKit的应用密码,替换代码中的普通密码

2. 确认IMAP协议已启用

部分Outlook账户默认未开启IMAP服务,需手动开启:

  • 登录网页版邮箱,进入「设置」→「邮件」→「同步电子邮件」
  • 找到IMAP设置,确保「启用IMAP」选项已勾选

3. 调整认证机制

Outlook的IMAP服务器会优先尝试XOAUTH认证,但你使用的是密码登录,需移除该认证机制,强制使用LOGIN/PLAIN:
取消代码中注释的client.AuthenticationMechanisms.Remove("XOAUTH");这一行,修改后如下:

client.Connect("imap.outlook.com", 993, SecureSocketOptions.SslOnConnect);

// 移除XOAUTH认证机制,强制使用密码登录
client.AuthenticationMechanisms.Remove("XOAUTH");

client.Authenticate("mail@test.cz", "你的密码/应用密码", cancel.Token);

4. 确认Connect参数正确性

Outlook的IMAP 993端口强制要求SSL连接,建议明确指定SecureSocketOptions.SslOnConnect,避免参数歧义:
将原代码中的client.Connect("imap.outlook.com", 993, true);替换为:

client.Connect("imap.outlook.com", 993, SecureSocketOptions.SslOnConnect);

5. 确认邮箱域名的IMAP服务器

如果@test.cz是自定义域名,需确认该域名是否确实托管在Outlook/Office 365上,若使用其他邮件服务商,需更换对应的IMAP服务器地址。

修改后的完整代码示例:

using (var client = new ImapClient())
{
    using (var cancel = new CancellationTokenSource())
    {
        // 使用明确的SSL连接参数
        client.Connect("imap.outlook.com", 993, SecureSocketOptions.SslOnConnect);

        // 移除XOAUTH,强制使用密码认证
        client.AuthenticationMechanisms.Remove("XOAUTH");

        // 替换为应用密码(若开启两步验证)
        client.Authenticate("mail@test.cz", "your-app-password-or-password", cancel.Token);

        var inbox = client.Inbox;
        inbox.Open(FolderAccess.ReadOnly, cancel.Token);

        Console.WriteLine("Total messages: {0}", inbox.Count);
        Console.WriteLine("Recent messages: {0}", inbox.Recent);

        for (int i = 0; i < inbox.Count; i++)
        {
            var message = inbox.GetMessage(i, cancel.Token);
            Console.WriteLine("Subject: {0}", message.Subject);
        }

        var query = SearchQuery.DeliveredAfter(DateTime.Parse("2013-01-12"))
            .And(SearchQuery.SubjectContains("MailKit"))
            .And(SearchQuery.Seen);

        foreach (var uid in inbox.Search(query, cancel.Token))
        {
            var message = inbox.GetMessage(uid, cancel.Token);
            Console.WriteLine("[match] {0}: {1}", uid, message.Subject);
        }

        client.Disconnect(true, cancel.Token);
    }
}

内容的提问来源于stack exchange,提问作者Tvaruzek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:48:28