#python #microsoft-graph-api #msal
Вопрос:
Я пытаюсь написать приложение, которое создавало бы черновики электронной почты в определенном почтовом ящике (в настоящее время моем собственном). Для этого я использую этот код для получения токена:
def get_access_token_by_client():
cache = msal.SerializableTokenCache()
global app
app = msal.ConfidentialClientApplication(
client_id="x",
authority="https://login.microsoftonline.com/y",
client_credential="z"
)
result = app.acquire_token_silent(scopes=["https://graph.microsoft.com/.default"], account=None)
if not result:
result = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])
if "access_token" in result:
return result["access_token"]
pass
а затем отправьте тестовое электронное письмо, подобное этому:
def send_test_mail(access_token, subject):
send_mail_url = "https://graph.microsoft.com/v1.0/users/{an-id}/sendMail"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer {}".format(access_token)
}
body = {
"message": {
"subject": subject,
"body": {
"contentType": "text",
"content": f"Your bot '{subject}' is running fine."
},
"toRecipients": [{
"emailAddress": {
"address": "address-abc"
}}]
}
}
response = requests.post(send_mail_url, data=json.dumps(body), headers=headers)
print(response.json())
Я дал приложению необходимые разрешения для приложений (не делегированные) и предоставил их также в качестве администратора.
Затем я проверил жетон с помощью jwt.io чтобы подтвердить, что он содержит все разрешения, которые я установил, и это действительно так:
"roles": [
"User.Read.All",
"Mail.Send"
],
Кажется, все в порядке, когда я звоню https://graph.microsoft.com/v1.0/users/{my-id} API для получения моей собственной информации, которая работает.
However, when I use with the https://graph.microsoft.com/v1.0/users/{my-id}/sendMail API I get this error:
‘code’: ‘ResourceNotFound’, ‘message’: ‘Resource could not be discovered.’
So, I tried to call both of them with the object-id of the app but then the first one says ResourceNotFound and sendMail
on the other hand says this:
«код»: «Неверный запрос», «сообщение»: «Текущий аутентифицированный контекст недопустим для этого запроса. Это происходит, когда запрос направляется в конечную точку, для которой требуется вход пользователя. Например, для /me требуется пользователь, вошедший в систему. Приобретите токен от имени пользователя для выполнения запросов к этим конечным точкам. Используйте поток кода авторизации OAuth 2.0 для мобильных и собственных приложений и неявный поток OAuth 2.0 для одностраничных веб-приложений.’
Что мне здесь не хватает или какой идентификатор мне нужно использовать для вызова sendMail
API или других из почтовой группы?