我正在制作一个Java应用程序,使用Graph API以Microsoft租户中的任何用户的身份发送邮件,因此我使用客户端凭据流(无登录,自动发送(。我已在Azure AD中注册了一个应用程序,授予以下应用程序权限(未委派(,检查每个项目的管理员同意:
- 邮件发送
- Mail.ReadWrite
- User.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();
我不能用";我"target(me()
方法(,因为这是客户端凭据流,所以没有记录用户。我需要以这种方式指定发件人:/users/{id | userPrincipalName}/sendMail
。
Postman中的呼叫就是这样组成的:
方法:POST
网址:
- 。https://graph.microsoft.com/v1.0/users/
{my user id or my user principal name}
/sendMail
授权:
- 承载令牌(我的访问令牌(
标题:
- 内容类型:application/json
BODY(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"
}
}
}
注意1:我使用我的访问令牌通过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:注意,如果我使用";主体名称";在通话中,如果我使用";id";相反,我得到了404:未找到
提前感谢您的帮助,我已经试了好几个小时了!
已解决
正如Optimal在评论中所说,问题是用户没有获得许可的邮箱。当我分配一个";Microsoft 365 Business Premium";许可证,我的代码运行良好。在portal.azure.com上查看许可证以获取分配,在admin.microsoft.com上查看活动邮箱
问候