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

C#中EWS连接从基本认证升级为OAuth 2.0的实现咨询

选择Graph API还是EWS Managed API?

优先选Graph API,原因:

  • 微软官方主推,后续会持续更新功能,EWS已进入维护模式,仅做bug修复,不会新增功能
  • Graph API统一了Office 365服务的接口,不仅能操作Exchange邮件,还能访问日历、联系人等其他Office服务
  • OAuth 2.0支持更完善,权限粒度更细

如果你的业务逻辑严重依赖EWS特有的功能(比如某些高级邮件处理、Exchange本地服务器场景),可以继续用EWS Managed API结合OAuth 2.0。


方案一:迁移到Graph API(推荐)

1. Azure AD应用配置

  • 给应用添加对应权限:
    • 委派权限:Mail.Read/Mail.ReadWrite(适合用户交互场景)
    • 应用权限:Mail.Read.All/Mail.ReadWrite.All(适合后台服务无用户交互场景)
  • 授予管理员同意(应用权限需要此操作)

2. C#代码示例

先安装NuGet包:Microsoft.Graph 和 Azure.Identity

using Microsoft.Graph;
using Azure.Identity;

// 后台服务场景(应用权限)
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "你的租户ID";
var clientId = "你的应用ID";
var clientSecret = "你的应用密钥";

var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

// 示例:读取指定邮箱的前10封邮件
var messages = await graphClient.Users["目标邮箱地址"].Messages
    .Request()
    .Top(10)
    .GetAsync();

// 用户交互场景(委派权限,比如桌面应用)
// var interactiveCredential = new InteractiveBrowserCredential(new InteractiveBrowserCredentialOptions
// {
//     TenantId = tenantId,
//     ClientId = clientId,
//     RedirectUri = new Uri("http://localhost") // 与Azure AD应用配置的重定向URI一致
// });
// var graphClient = new GraphServiceClient(interactiveCredential, new[] { "Mail.Read" });

方案二:EWS Managed API结合OAuth 2.0

1. Azure AD应用配置

  • 添加对应权限:
    • 应用权限:Exchange -> full_access_as_app(后台服务场景)
    • 委派权限:Exchange -> EWS.AccessAsUser.All(用户交互场景)
  • 授予管理员同意(应用权限需要此操作)

2. C#代码示例

安装NuGet包:Microsoft.Exchange.WebServices 和 Azure.Identity

using Microsoft.Exchange.WebServices.Data;
using Azure.Identity;

var tenantId = "你的租户ID";
var clientId = "你的应用ID";
var clientSecret = "你的应用密钥";
var targetMailbox = "目标邮箱地址";

// 获取OAuth令牌
var scopes = new[] { "https://outlook.office365.com/.default" };
var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var tokenResult = await clientSecretCredential.GetTokenAsync(new Azure.Core.TokenRequestContext(scopes));

// 初始化EWS服务
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
// 使用OAuth令牌替换原NetworkCredential
service.Credentials = new OAuthCredentials(tokenResult.Token);
// 模拟目标邮箱(应用权限场景需要)
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, targetMailbox);

// 示例:获取收件箱前10条邮件
var inbox = Folder.Bind(service, WellKnownFolderName.Inbox);
var items = inbox.FindItems(new ItemView(10));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:24:20