使用MailKit连接Office 365 IMAP失败,代码对Gmail/Hotmail有效
Office 365 IMAP登录失败问题(MailKit)
我使用MailKit库连接IMAP服务时,代码可正常连接Gmail和Hotmail,但连接Office 365时出现登录失败错误。
问题代码
using (var client = new ImapClient(new ProtocolLogger("imap.log"))) { client.Timeout = 120000; client.Connect("outlook.office365.com", 93,SecureSocketOptions.SslOnConnect); client.Authenticate("xxxxx@xxxxinet.com", "XXXXXPassword"); client.Inbox.Open(FolderAccess.ReadOnly); var uids = client.Inbox.Search(SearchQuery.All); foreach (var uid in uids) { var message = client.Inbox.GetMessage(uid); // 将邮件写入文件 message.WriteTo(string.Format("{0}.eml", uid)); } client.Disconnect(true); }
解决方法
1. 修正IMAP端口错误
Office 365的IMAP SSL标准端口是993,代码中填写的93是错误值,这是导致连接失败的直接原因。
2. 确认基本认证权限
目前多数Office 365租户已禁用用户名+密码的基本认证方式,如果账号开启了MFA(多因素认证)或组织限制了基本认证,即使端口正确也会登录失败,这种情况需要切换到OAuth2认证。
3. 修正后的代码示例
using (var client = new ImapClient(new ProtocolLogger("imap.log"))) { client.Timeout = 120000; // 替换为Office 365正确的IMAP SSL端口 client.Connect("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect); // 场景1:基本认证可用时使用 client.Authenticate("xxxxx@xxxxinet.com", "XXXXXPassword"); // 场景2:基本认证禁用时,使用OAuth2认证(需提前获取合法的访问令牌) // var oauth2 = new SaslMechanismOAuth2("xxxxx@xxxxinet.com", "你的OAuth2访问令牌"); // client.Authenticate(oauth2); client.Inbox.Open(FolderAccess.ReadOnly); var uids = client.Inbox.Search(SearchQuery.All); foreach (var uid in uids) { var message = client.Inbox.GetMessage(uid); // 将邮件写入文件 message.WriteTo($"{uid}.eml"); } client.Disconnect(true); }
补充说明
若需配置OAuth2认证,需在Azure AD中注册应用,获取客户端ID、租户ID并生成访问令牌,按MailKit的OAuth2认证逻辑实现即可。
内容的提问来源于stack exchange,提问作者nadun
相关产品推荐
相关产品推荐

