使用 Office 365 Mail REST 服务从后台守护程序服务中删除电子邮件

Deleting an Email using the Office 365 Mail REST service from a background Daemon service

我正在构建一个访问 Office 365 邮箱的后台服务,以便检索电子邮件并在我们的应用程序中处理它们。处理完成后,它应该删除电子邮件。

我已经使用 X509 证书成功设置了 Web 服务的身份验证以获取 OAuth 访问令牌(多亏了这个 this blog post)并且可以使用 HTTP Get 读取用户的电子邮件:

这 returns 我希望 JSON 消息对象的响应。

我现在希望在邮件处理完毕后将其删除,为此我尝试了两种方法:

HTTP DELETE: https://outlook.office365.com/api/v2.0/users('[emailAddress]')/messages/[messageId]

并且:

HTTP POST: https://outlook.office365.com/api/v2.0/users('[emailAddress]')/messages/[messageId]/move

包括:

_request.Content = New StringContent("{""DestinationId"": ""DeletedItems""}", Encoding.utf8, "application/json")

我最初在 Azure AD 中设置了我的应用程序,该应用程序具有对其他应用程序(包括 Office 365 Exchange Online)的权限,具有应用程序权限和委派权限(此处不应适用)以仅读取邮件。此时从 http get 请求读取邮件工作正常。

然后我尝试向后台服务添加一个新方法,该方法在消息完成后将其删除。每当我 运行 删除或移动到已删除的项目时,如上定义,我收到 403 和以下消息:

x-ms-diagnostics: 2000008;reason="The token contains not enough scope to make this call.";error_category="invalid_grant"

我返回并为应用程序和委托添加了 read/write 权限,但在发送我的请求时没有任何变化。

作为一项实验,我随后从我在 Azure AD 中的应用程序中删除了 Office 365 的所有权限。正如预期的那样,这阻止了我检索之前有效的电子邮件。这证明我已成功连接到我的 申请。

但是我随后重新添加了权限,现在对于所有请求我都收到了 401:

  x-ms-diagnostics: 2000008;reason="The token contains no permissions, or permissions can not be understood.";error_category="invalid_grant"

此后我尝试从 Azure AD 中的应用程序中删除 Office 365 并重新添加它,但无法解决问题。

adding/updating 权限有延迟吗?

如何修复该应用程序,使其既可以检索又可以删除 and/or 移动电子邮件?

我在删除时遇到问题时的完整回复是:

StatusCode: 403, ReasonPhrase: 'Forbidden', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Transfer-Encoding: chunked
  request-id: 9734281b-60f6-48e0-bea4-a3ce0c8b9744
  client-request-id: 1f7ee398-340e-45c4-985a-e89a34d3a4d9
  client-request-id: 1f7ee398-340e-45c4-985a-e89a34d3a4d9
  X-CalculatedBETarget: HE1PR04MB0971.eurprd04.prod.outlook.com
  X-BackEndHttpStatus: 403
  Cache-Control: private
  Set-Cookie: ClientId=XFUHAPKC3UISCO9J0WCOG; expires=Thu, 12-Jan-2017 13:30:18 GMT; path=/; secure; HttpOnly
  Set-Cookie: exchangecookie=ed0bfaa0c16e44ffac392df7da2dacd3; expires=Fri, 13-Jan-2017 13:30:18 GMT; path=/; HttpOnly
  Set-Cookie: ClientId=XFUHAPKC3UISCO9J0WCOG; expires=Thu, 12-Jan-2017 13:30:18 GMT; path=/; secure; HttpOnly
  Server: Microsoft-IIS/8.0
  WWW-Authenticate: Bearer client_id="00000002-0000-0ff1-ce00-000000000000", trusted_issuers="00000001-0000-0000-c000-000000000000@*", token_types="app_asserted_user_v1 service_asserted_app_v1", error="invalid_token"
  x-ms-diagnostics: 2000008;reason="The token contains not enough scope to make this call.";error_category="invalid_grant"
  OData-Version: 4.0
  X-AspNet-Version: 4.0.30319
  X-DiagInfo: HE1PR04MB0971
  X-BEServer: HE1PR04MB0971
  X-Powered-By: ASP.NET
  Date: Wed, 13 Jan 2016 13:30:18 GMT
  Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; IEEE754Compatible=false; charset=utf-8
}

当前权限问题的完整回复是:

StatusCode: 403, ReasonPhrase: 'Forbidden', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Transfer-Encoding: chunked
  request-id: 9734281b-60f6-48e0-bea4-a3ce0c8b9744
  client-request-id: 1f7ee398-340e-45c4-985a-e89a34d3a4d9
  client-request-id: 1f7ee398-340e-45c4-985a-e89a34d3a4d9
  X-CalculatedBETarget: HE1PR04MB0971.eurprd04.prod.outlook.com
  X-BackEndHttpStatus: 403
  Cache-Control: private
  Set-Cookie: ClientId=XFUHAPKC3UISCO9J0WCOG; expires=Thu, 12-Jan-2017 13:30:18 GMT; path=/; secure; HttpOnly
  Set-Cookie: exchangecookie=ed0bfaa0c16e44ffac392df7da2dacd3; expires=Fri, 13-Jan-2017 13:30:18 GMT; path=/; HttpOnly
  Set-Cookie: ClientId=XFUHAPKC3UISCO9J0WCOG; expires=Thu, 12-Jan-2017 13:30:18 GMT; path=/; secure; HttpOnly
  Server: Microsoft-IIS/8.0
  WWW-Authenticate: Bearer client_id="00000002-0000-0ff1-ce00-000000000000", trusted_issuers="00000001-0000-0000-c000-000000000000@*", token_types="app_asserted_user_v1 service_asserted_app_v1", error="invalid_token"
  x-ms-diagnostics: 2000008;reason="The token contains not enough scope to make this call.";error_category="invalid_grant"
  OData-Version: 4.0
  X-AspNet-Version: 4.0.30319
  X-DiagInfo: HE1PR04MB0971
  X-BEServer: HE1PR04MB0971
  X-Powered-By: ASP.NET
  Date: Wed, 13 Jan 2016 13:30:18 GMT
  Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; IEEE754Compatible=false; charset=utf-8
}

由于您修改了权限,管理员必须登录并同意新权限。在此之前,您将继续获得具有 "old" 权限集的令牌。所以基本上你需要做的是 re-do 博客的 "Granting consent..." 部分 post.