Чтение электронных писем пользователей с использованием Graph API и субъекта-службыPython

Программы на Python
Anonymous
Чтение электронных писем пользователей с использованием Graph API и субъекта-службы

Сообщение Anonymous »

Я разрабатываю вариант использования, в котором я разрабатываю программу Python для чтения электронных писем пользователей из входящих и отправленных ящиков. После извлечения электронных писем я должен извлечь уникальные идентификаторы электронных писем из извлеченного списка электронных писем. Электронные письма должны быть извлечены из Microsoft Email с помощью Graph API
Я работаю со следующими ключевыми моментами:
  • Принципал службы должен иметь доступ к данным только тех пользователей, которые предоставили согласие на приложение, в основном доступ на уровне пользователя должен быть доступен Принципал службы, а не уровень клиента, что обеспечивает конфиденциальность.
  • Программа должна быть параметризована, т. е. пользователь должен запросить согласие только один раз. После получения согласия нам остается лишь добавить адрес электронной почты пользователя в список имеющихся у нас пользователей.
  • Программа должна поддерживать полное извлечение (электронных писем) с использованием нумерации страниц или дельта/инкрементальное извлечение с указанием пользовательских временных рамок.
  • Я не могу добавить пароли пользователей, чьи электронные письма будет извлекать эта программа.

Пожалуйста, помогите мне с этим вариантом использования. Я пробовал несколько вещей, но доступ на уровне пользователя не удался. Доступ на уровне клиента работает нормально (который я не хочу реализовывать, поскольку это нарушение конфиденциальности, поскольку я могу получать чьи-либо электронные письма).
Я попробовал сегодня и получил ожидаемый результат, используя уровень клиента. доступ, но не удалось заставить его работать с доступом на уровне пользователя.
Вот код, который я использовал:
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

Вернуться в «Python»