Read Email from Microsoft 365 via Microsoft Graph API

Read Email from Microsoft 365 via Microsoft Graph API

In article Python: Send Email via Microsoft Graph API, I provided detailed steps to send email through msal package. In this article, I am going to show you how to read emails from Microsoft 365 via Microsoft Graph API.

Raymond Tang Raymond Tang 0 14374 10.68 index 10/18/2021

In article Python: Send Email via Microsoft Graph API, I provided detailed steps to send email through msalpackage. In this article, I am going to show you how to read emails from Microsoft 365 via Microsoft Graph API.

Setup permission

We need to add permissions for reading emails: Mail.ReadBasic.Allor Mail.Reador Mail.ReadWrite(from least to most privileged). This permission allows you to send emails as any user. I will use Mail.Read permission so that we can read the mail body.

20211018121410-image.png

After adding the permission, make sure you also provide consent for the application.

20211018121505-image.png

Create the script to read emails

With user token and users ready, we can now use them to read emails in a Python client application.

Add a python script with the following content:

import msalimport requestsclient_id = '***'client_secret = '***'tenant_id = '***'authority = f"https://login.microsoftonline.com/{tenant_id}"app = msal.ConfidentialClientApplication(    client_id=client_id,    client_credential=client_secret,    authority=authority)
scopes = ["https://graph.microsoft.com/.default"]result = Noneresult = app.acquire_token_silent(scopes, account=None)
if not result:    print(        "No suitable token exists in cache. Let's get a new one from Azure Active Directory.")    result = app.acquire_token_for_client(scopes=scopes)# if "access_token" in result:#     print("Access token is " + result["access_token"])
if "access_token" in result:    userId = "***"    endpoint = f'https://graph.microsoft.com/v1.0/users/{userId}/messages?$select=sender,subject'    r = requests.get(endpoint,                     headers={'Authorization': 'Bearer ' + result['access_token']})    if r.ok:        print('Retrieved emails successfully')        data = r.json()        for email in data['value']:            print(email['subject'] + ' (' + email['sender']                  ['emailAddress']['name'] + ')')    else:        print(r.json())else:    print(result.get("error"))    print(result.get("error_description"))    print(result.get("correlation_id"))

Remember to replace the highlighted variables accordingly. For user ID of email account, you can find it in Azure Active Directory or Microsoft 365 admin center. The script also adds a filter to return sender and subject properties only.

Run the script and you will see the output like the following screenshot:

20211018124319-image.png

References

Python: Send Email via Microsoft Graph API

List messages

azure micrsoft-graph python

Join the Discussion

View or add your thoughts below

Comments