Microsoft Graph 使用客户端凭据流(应用程序权限)和个人帐户发送邮件

Microsoft Graph to send mail with Client Credential Flow (application permission) and personal account

我正在学习 Microsoft Graph,为此我使用 Graph Explorer and Postman

使用 Graph Explorer : 我使用我的个人用户帐户 (hotmail) 登录。一旦连接,我就可以看到令牌。奇怪的是,当我在 jwt.io it cannot be decoded. Yet I can perform query like https://graph.microsoft.com/v1.0/me which returns me some infos of myself as a user (with http 200). Or this query https://graph.microsoft.com/v1.0/me/sendMail 中 copy/paste 这个令牌时,它允许我发送测试和接收测试邮件(使用 http 202)。所有这些请求都是“授权许可”。所以我在个人帐户 (hotmail) 上使用 Graph Explorer 没有任何问题。

With Postman : 这次我会用“应用程序权限”进行一些测试。我按照以下步骤操作:

在 Azure 门户上

第 1 步:应用程序注册/新注册/我给一个名字/选择第三种帐户类型(任何组织目录中的帐户和个人 Microsoft 帐户)/单击注册按钮

第 2 步:Api 权限/添加权限/Microsoft Graph/应用程序权限/Mail.Send(以任何用户身份发送邮件)

第 3 步:Grand admin consent for...按钮激活权限

第 4 步:证书和机密/新客户端机密/输入描述/单击添加按钮

第 5 步:在 Postman 中获取令牌

当 copy/paste 这个令牌在 jwt.io 我看到这个:

第 6 步:查询列出所有用户

第七步:查询发送邮件

{
  "message": {
    "subject": "This is my subject",
    "body": {
      "contentType": "Text",
      "content": "This is my content"
    },
    "toRecipients": [
      {
        "emailAddress": {
          "address": "thierry.langie@skynet.be"
        }
      }
    ],
    "ccRecipients": [
    ]
  },
  "saveToSentItems": "false"
 }

我想知道为什么会出现此错误? 我可以使用 Graph Explorer(使用委派权限时)而不是 Postman(使用应用程序权限时)发送电子邮件。

如下所示,我在 Azure 门户的企业应用程序 中授予管理员许可。

我在某处看到这个错误意味着用户在 EXO 云中没有邮箱。 EXO 是 O365 Exchange 在线云。因此,如果您在云中没有邮箱,O365 Exchange REST APIs 将不适用于这些用户。如果是这样,你会怎么做?

我有一个应该从共享邮箱发送邮件的 Web 应用程序。无论哪个用户连接,这始终是用于发送邮件的同一个邮箱。这就是我选择“应用程序许可”和“客户端凭据流”的原因。

如上所述,我使用我的个人帐户 (hotmail) 进行测试,但在生产中我将使用工作帐户(无法从我的开发环境访问)。

附带说明一下,我知道有一些库可以简化流程并避免使用 REST API 调用(url),但我认为这不能解释我面临的问题。

“MailboxNotEnabledForRESTAPI - 此邮箱尚不支持 REST API” 此错误消息表示您用于发送电子邮件的电子邮件帐户没有 Exchange Online 许可证。

对于个人帐户,您应该使用已在 Microsoft Graph Explorer 中尝试过的委派权限。请参阅此处 Permissions

.

如果我们将个人帐户作为来宾用户添加到您的租户,虽然我们可以 Assign a license to a guest user(我假设我们可以将 EXO 许可证分配给来宾用户),但 EXO 中托管的邮箱不同于个人账户的邮箱。它们完全是 2 个独立的邮箱。事实上我没有给客人分配EXO许可证。

所以在这种情况下,客户端凭据流适用于 AAD 用户,而不是个人帐户。

更新:

对于使用委托权限的个人帐户(您已在 Microsoft Graph Explorer 中尝试过),权限端点为 https://login.microsoftonline.com/commonm/oauth2/v2.0/authorizehttps://login.microsoftonline.com/consumers/oauth2/v2.0/authorize

但是当您使用具有应用程序权限的客户端凭证流时,您必须在请求中指定租户 ID https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/authorize

虽然您的个人账户作为来宾用户添加到租户中,但它没有 EXO 许可证(根据测试我们无法为其分配 EXO 许可证),因此不会托管在 O365 .

这就是为什么我们不能通过个人帐户使用客户端凭据流。