如何通过Mailkit结合OAuth 2.0访问Exchange共享邮箱?
解决Mailkit访问Exchange共享邮箱时“Authenticated but not connected”异常的方法
确认权限配置
确保认证用的Azure AD应用已配置Mail.Read.Shared或Mail.ReadWrite.Shared权限,且完成管理员授权(租户级应用需此步骤)。同时主邮箱账号必须被添加为共享邮箱的授权访问用户。调整Mailkit访问共享邮箱的逻辑
不能直接在连接阶段指定共享邮箱ID,正确流程是:- 先用主邮箱的OAuth2 Token连接Exchange服务器(IMAP/SMTP)
- 认证成功后,通过专属方法切换到共享邮箱文件夹
示例代码:
using var client = new ImapClient(); // 连接Exchange IMAP服务 await client.ConnectAsync("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect); // 用主邮箱账号和OAuth2 Token完成认证 var oauth2 = new SaslMechanismOAuth2("主邮箱账号@你的域名.com", 获取到的Token); await client.AuthenticateAsync(oauth2); // 切换到共享邮箱,替换为共享邮箱的完整地址 var sharedMailboxFolder = await client.GetFolderAsync("共享邮箱账号@你的域名.com"); await sharedMailboxFolder.OpenAsync(FolderAccess.ReadOnly); // 后续即可操作共享邮箱内的邮件验证Token有效性
检查获取的Token:aud(受众)必须是https://outlook.office365.comscp或roles声明中需包含Mail.Read.Shared类的共享邮箱权限
可以用本地JWT解析工具查看Token内容,确认权限和受众是否正确。
核对服务器端点
确保使用正确的Exchange服务端点:- IMAP:
outlook.office365.com,端口993 - SMTP:
smtp.office365.com,端口587(需启用StartTLS)
- IMAP:
排查连接状态
添加日志记录client.Connected和client.Authenticated状态,确认认证前后的连接状态变化,排查是否存在认证后被服务器主动断开的情况。
内容的提问来源于stack exchange,提问作者Tejas Patel
相关产品推荐
相关产品推荐

