Я работаю со следующими ключевыми моментами:
- Принципал службы должен иметь доступ к данным только тех пользователей, которые предоставили согласие на приложение, в основном доступ на уровне пользователя должен быть доступен Принципал службы, а не уровень клиента, что обеспечивает конфиденциальность.
- Программа должна быть параметризована, т. е. пользователь должен запросить согласие только один раз. После получения согласия нам остается лишь добавить адрес электронной почты пользователя в список имеющихся у нас пользователей.
- Программа должна поддерживать полное извлечение (электронных писем) с использованием нумерации страниц или дельта/инкрементальное извлечение с указанием пользовательских временных рамок.
- Я не могу добавить пароли пользователей, чьи электронные письма будет извлекать эта программа.
Пожалуйста, помогите мне с этим вариантом использования. Я пробовал несколько вещей, но доступ на уровне пользователя не удался. Доступ на уровне клиента работает нормально (который я не хочу реализовывать, поскольку это нарушение конфиденциальности, поскольку я могу получать чьи-либо электронные письма).
Я попробовал сегодня и получил ожидаемый результат, используя уровень клиента. доступ, но не удалось заставить его работать с доступом на уровне пользователя.
Вот код, который я использовал:
def get_access_token(tenant_id, client_id, client_secret):
url = f"https://login.microsoftonline.com/{tena ... v2.0/token"
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
data = {
'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret,
'scope': 'https://graph.microsoft.com/.default'
}
response = requests.post(url, headers=headers, data=data)
response.raise_for_status()
return response.json().get('access_token')
def get_all_emails_with_pagination(access_token, user_id):
emails = []
# url = f"https://graph.microsoft.com/v1.0/users/ ... }/messages"
# url = f"https://graph.microsoft.com/v1.0/users/ ... er=isDraft ne true"
url = f"https://graph.microsoft.com/v1.0/users/ ... er=isDraft ne true"
# url = f"https://graph.microsoft.com/v1.0/users/ ... er=isDraft ne true"
headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
}
while url:
response = requests.get(url, headers=headers)
response.raise_for_status() # Raise an error for bad responses
data = response.json()
# Debug: Print the response data
# print(f"Fetched {len(data.get('value', []))} emails.")
# Extend the list with the current batch of emails
emails.extend(data.get('value', []))
# Check for the next page
url = data.get('@odata.nextLink') # Get the next page link
return emails
tenant_id = 'placeholder'
client_id = 'placeholder'
client_secret = 'placeholder'
user_id = 'user@example.com
token = get_access_token(tenant_id, client_id, client_secret)
# emails = get_user_emails(token, user_id)
emails = get_all_emails_with_pagination(token, user_id)
email_ids = [email['from']['emailAddress']['address'] for email
in emails]
print(email_ids)
Ошибка:
Traceback (most recent call last)
Cell In[47], line 9
7 token = get_access_token(tenant_id, client_id, client_secret)
8 # emails = get_user_emails(token, user_id)
----> 9 emails = get_all_emails_with_pagination(token, user_id)
12 # # Extract email IDs
13 # email_ids = [email['from']['emailAddress']['address'] for email in emails]
14 # print(email_ids)
Cell In[44], line 14
12 while url:
13 response = requests.get(url, headers=headers)
---> 14 response.raise_for_status() # Raise an error for bad responses
15 data = response.json()
17 # Debug: Print the response data
18 # print(f"Fetched {len(data.get('value', []))} emails.")
19
20 # Extend the list with the current batch of emails
File ~/miniconda3/envs/Snow/lib/python3.12/site-packages/requests/models.py:1024, in Response.raise_for_status(self)
1019 http_error_msg = (
1020 f"{self.status_code} Server Error: {reason} for url: {self.url}"
1021 )
1023 if http_error_msg:
-> 1024 raise HTTPError(http_error_msg, response=self)
HTTPError: 400 Client Error: Bad Request for url: https://graph.microsoft.com/v1.0/users/ ... 0ne%20true
Подробнее здесь: https://stackoverflow.com/questions/790 ... -principal