【问题标题】:Get 405/404 error when trying to send mails with Graph API (OAuth2 client credentials flow)尝试使用 Graph API 发送邮件时出现 405/404 错误(OAuth2 客户端凭据流)
【发布时间】:2023-02-02 23:44:13
【问题描述】:

我正在制作一个 Java 应用程序来发送邮件任何用户在 Microsoft 租户中,使用图形 API,所以我正在使用客户端凭据流(无需登录,自动发送)。 我在 Azure AD 中注册了一个应用程序,提供以下内容应用程序权限(未委托),检查每个项目的管理员同意:

  • 邮件.发送
  • 邮件读写
  • 用户.Read.All

为了简单起见,我也尝试过在 Postman 中调用,但我遇到了与 Java 应用程序中相同的问题。我理所当然地认为我有一个有效的访问令牌(如果我尝试使用一个无效的访问令牌,我会得到一个401: Unauthorized)。以下是我从https://jwt.ms/获得的解码访问令牌,包括所有范围:

...
  "roles": [
    "Mail.ReadWrite",
    "User.Read.All",
    "Mail.Send"
  ],
...

这是我在 Java 中的代码:

String user = "/users/<my user id or my user principal name>";
    
    UserRequestBuilder defaultUser = new UserRequestBuilder(graphClient.getServiceRoot() + user, graphClient, null);
    
    //graphClient.me()
    defaultUser
        .sendMail(UserSendMailParameterSet
            .newBuilder()
            .withMessage(message)
            .withSaveToSentItems(saveToSentItems)
            .build())
        .buildRequest()
        .post();

我不能使用“我”目标(me() 方法),因为这是客户端凭证流,所以没有登录用户。我需要这样指定发件人:/users/{id | userPrincipalName}/sendMail

Postman 中的调用是这样组成的:

方法:邮寄

网址:

  • .https://graph.microsoft.com/v1.0/users/{my user id or my user principal name}/sendMail

授权:

  • 不记名令牌(我的访问令牌)

标头:

  • 内容类型:应用程序/json

身体(JSON):

{
    "recipient":    <recipient email>,
    "subject":      "This is a test mail",
    "from":         <mail that created the tenant, app and access token>,
    "text":         "This is the messge body..."
}

这是来自服务器的响应(在 Postman 和 Java 应用程序中):

地位:405:方法不允许

身体:

{
    "error": {
        "code": "Request_BadRequest",
        "message": "Specified HTTP method is not allowed for the request target.",
        "innerError": {
            "date": "2022-08-05T07:17:34",
            "request-id": "XXXXXXXX-6075-4d13-83ed-XXXXXXXXXXXX",
            "client-request-id": "XXXXXXXX-6075-4d13-83ed-XXXXXXXXXXXX"
        }
    }
}

注一:我还使用我的访问令牌通过 Postman 调用获得了我的用户 ID 和我的用户主体名称, 利用User.Read.All权限,调用如下:

https://graph.microsoft.com/v1.0/users

那是回应:

...
            "userPrincipalName": "XXXXXX_XXXXXX.XXX#EXT#@sendClientCredMail.onmicrosoft.com",
            "id": "XXXXXXXX-4457-4944-bb22-XXXXXXXXXXXX"
        }
    ]
}

笔记2:请注意,如果我在通话中使用“主体名称”,则会收到 405,如果我使用“id”,则会收到404:未找到

在此先感谢您的帮助,我已经尝试了几个小时!

【问题讨论】:

  • 您确定该用户有活动邮箱吗?
  • 您能否分享查询详细信息客户端请求 ID 和时间戳
  • @bisi 你的问题得到答案了吗。我也面临着同样的问题。

标签: java oauth-2.0 microsoft-graph-api clientcredential


【解决方案1】:

解决了

正如 Optimal 在 cmets 中所说,问题是用户没有许可邮箱。 当我向该用户分配“Microsoft 365 商业高级版”许可证时,我的代码运行良好。 在 portal.azure.com 上检查分配的许可证,并在 admin.microsoft.com 上检查活动邮箱的许可证

亲切的问候

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2022-08-06
    • 2015-04-05
    • 2021-04-02
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多