如何解决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
相关产品推荐
相关产品推荐

