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

PowerShell使用MailKit.Net.Imap连接Exchange 365认证失败问题咨询

问题解答:非Graph API方式获取Exchange邮件及MailKit配置问题

1. 能否通过非Graph API方式获取Exchange邮件?

可以。Exchange Online至今仍支持IMAP/POP3/SMTP协议,搭配OAuth2认证即可实现邮件获取,并非只能使用Graph API。微软虽推荐优先使用Graph API,但传统协议仍处于可用状态。

2. 使用MailKit实现的完整步骤

2.1 Azure AD应用配置(核心修正点)

你遇到的AADSTS7000218错误,根源是Azure AD应用未正确配置为公共客户端:

  • 注册应用时选择**公共客户端(移动和桌面)**类型;
  • 在应用的「认证」页面,找到「高级设置」,将「允许公共客户端流」设置为是;
  • 添加委派权限:搜索并添加https://outlook.office.com/IMAP.AccessAsUser.All,若使用企业账号需租户管理员完成管理员同意;
  • 重定向URI设置为https://login.microsoftonline.com/common/oauth2/nativeclient,与代码保持一致。

2.2 修正PowerShell获取Token代码

原代码未处理异步调用,且需确保应用已开启公共客户端流,修正后代码:

$redirect_uri = 'https://login.microsoftonline.com/common/oauth2/nativeclient'

$options = [Microsoft.Identity.Client.PublicClientApplicationOptions]::new()
$options.ClientId = $ClientID
$options.TenantId = $TenantID
$options.RedirectUri = $redirect_uri

$scopes = @(
    "offline_access",
    "https://outlook.office.com/IMAP.AccessAsUser.All",
    "openid",
    "email"
)

$PublicClientApplication = [Microsoft.Identity.Client.PublicClientApplicationBuilder]::CreateWithApplicationOptions($options).Build()

# 等待异步操作完成并获取Token
$tokenTask = $PublicClientApplication.AcquireTokenByUsernamePassword($scopes, $mailbox, $pwd).ExecuteAsync()
$tokenTask.Wait()
$accessToken = $tokenTask.Result.AccessToken

2.3 MailKit连接Exchange IMAP

获取有效Token后,使用MailKit完成认证和邮件访问:

using MailKit.Net.Imap;
using MailKit.Security;

var imapClient = new ImapClient();
// 连接Exchange Online IMAP服务器
await imapClient.ConnectAsync("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);

// 使用OAuth2认证
await imapClient.AuthenticateAsync(new SaslMechanismOAuth2(mailbox, accessToken));

// 访问收件箱示例
var inbox = imapClient.Inbox;
inbox.Open(FolderAccess.ReadOnly);
Console.WriteLine($"收件箱邮件数: {inbox.Count}");

// 操作完成后断开连接
await imapClient.DisconnectAsync(true);

3. 「获取Token但认证失败」的排查要点

  • 确认作用域必须为https://outlook.office.com/IMAP.AccessAsUser.All,不能使用Graph API的作用域(如Mail.Read),IMAP认证依赖Outlook资源的Token;
  • 解码Token(可使用jwt.io),检查aud字段是否为https://outlook.office.com,若不符则说明作用域错误;
  • 确保Token未过期,且已获得正确的委派权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:45:14