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
相关产品推荐
相关产品推荐

