EWS API,在 BindToItems 上未授权 401

Posted

技术标签:

【中文标题】EWS API,在 BindToItems 上未授权 401【英文标题】:EWS API, 401 Unauthorized on BindToItems 【发布时间】:2020-08-10 09:49:08 【问题描述】:

我正在努力处理一个简单的任务,即在 Exchange Online 的特定文件夹中获取新电子邮件,设置“已处理”类别,然后存储电子邮件。

首先,我创建这样的应用权限:

 var app = ConfidentialClientApplicationBuilder.Create(_appConfig.ClientId)
                                                          .WithAuthority(AzureCloudInstance.AzurePublic,
                                                                         _appConfig.Tenant)
                                                          .WithClientSecret(_appConfig.ClientSecret)
                                                          .Build();
            AuthenticationResult authResultresult = null;
            var ewsScopes = new[] "https://outlook.office.com/.default";

        
            authResultresult = await app.AcquireTokenForClient(ewsScopes)
                                                     .ExecuteAsync();      

然后我创建 Exchange-Client 并使用创建的 Oauth-Token 进行授权:

var result = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
        result.KeepAlive = false;
        result.DateTimePrecision = DateTimePrecision.Milliseconds;
        result.Url =  new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
        result.UseDefaultCredentials = false;         

        var authResultresult = await CreateAppPermissions(_appConfig);
        result.Credentials = new OAuthCredentials(authResultresult.AccessToken);            

之后,我使用我的主 SMTP 帐户模拟 SMTP 用户

result.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, _appConfig.SMTPMailAccount);

之后,我使用此代码使用已知 ID 检索电子邮件,为其添加新类别并像这样更新项目:

   var itemsToStore = result.BindToItems(new []newItemId, props);
                foreach (var itemToStore in itemsToStore)
                                   
                    itemToStore.Item.Categories.Add("Processed");
                
                    itemToStore.Item.Update(ConflictResolutionMode.AlwaysOverwrite, true); 
                 

此代码之前已生成“访问被拒绝。检查凭据并重试。,无法保存对要存储的项目所做的更改。” - Item.Update 上的异常。经过研究,我发现了这一点:

Office 365 API ErrorAccessDenied (Access is denied. Check credentials and try again.)

并遵循建议的解决方案,删除“对用户邮箱具有完全访问权限”-复选框标志。

之后,当我调用 BindToItems 时,我得到了 401 未授权。 去掉复选框是不是倒退了一步?

【问题讨论】:

【参考方案1】:

已解决: 找到 401 的解决方案:

由于我使用的是 EWS,也就是称为 Exchange Web 服务的旧 API,因此删除该复选框是错误的。

“访问被拒绝”的原因。检查凭据,然后重试。,无法保存对要存储的项目所做的更改。”是假冒用户无权更改其他人的电子邮件

【讨论】:

以上是关于EWS API,在 BindToItems 上未授权 401的主要内容,如果未能解决你的问题,请参考以下文章

EWS API - 在会议上更新

Folder.WellKnownFolderName 在 EWS 托管 API 和 Exchange 2013 中为空

Powershell 访问Exchange EWS API

EWS 托管 API 双跳

ews-java-api:项目更新错误:至少一个收件人无效

如何使用 EWS 托管 API 2.0 创建笔记