IMAP OAUTH2 : authentification avec Python impossible

Anonyme
2025-06-05T16:14:49+00:00

Bonjour !

J'ai récemment essayé d'accéder à une boîte mail Office 365 de mon client via IMAP à l'aide d'un script Python, mais cela ne fonctionne pas.

Je souhaite que le script s'exécute comme une tâche planifiée sur mon serveur, sans avoir à remplir de fenêtres de connexion contextuelles. Le script se connecte à la boîte mail, recherche une adresse mail spécifique correspondant à certains arguments et renvoie 1 ou 0 selon que l'adresse est trouvée ou non.

Pour l'instant, j'obtiens l'erreur suivante :

58:43.42 > b'MHPG1 AUTHENTICATE XOAUTH2'
58:43.43 < b'+ '
58:43.43 write literal size 3376
58:43.45 < b'MHPG1 NO AUTHENTICATE failed.'
58:43.45 NO response: b'AUTHENTICATE failed.'Erreur IMAP OAuth2: AUTHENTICATE failed.

Toute aide serait grandement appréciée ! Merci d'avance !

Notes :

  • IMAP is enabled on the mailbox
    Get-CASMailbox -Identity ___@___.___ | Select ImapEnabled
    -> This returned True
    
  • Mailbox is licensed and not blocked.

Ce que j'ai fait :

  1. Création d'application :

a. J'ai créé une application métier sur Entra et lui ai accordé l'autorisation suivante (autorisation acceptée par un administrateur locataire) :

b. J'ai également créé la politique d'accès aux applications suivante :

New-ApplicationAccessPolicy -AppId {applicationID} -PolicyScopeGroupId {the_only_mailbox_i_want_to_access} -AccessRight RestrictAccess -Description "Restrict access to {the_only_mailbox_i_want_to_access} only"

Et j'ai testé :

Test-ApplicationAccessPolicy -AppId {applicationID} -Identity {the_only_mailbox_i_want_to_access}

AppId : {applicationID}

Mailbox : technique
MailboxId : {some_mailbox_id}

MailboxSid : {some_other_id}
AccessCheckResult : Accordé

  1. Script code

main.py

#!/usr/bin/env python3

import argparseimport osimport sys from dotenv import load_dotenv

from mail_utils.imap_connection import connect_to_imap

from mail_utils.msal_auth import get_msal_tokenfrom mail_utils.imap_oauth2 import connect_to_imap_oauth2from mail_utils.email_search import search_emailsload_dotenv()# Variables généralesEMAIL_USERNAME = os.getenv("EMAIL_USERNAME", "")EMAIL_PASSWORD = os.getenv("EMAIL_PASSWORD", "")# Variables O365 MSALTENANT_ID = os.getenv("TENANT_ID", "")CLIENT_ID = os.getenv("CLIENT_ID", "")CLIENT_SECRET = os.getenv("CLIENT_SECRET", "")def main():parser = argparse.ArgumentParser(description="Recherche mail IMAP Gmail ou O365 avec OAuth2")parser.add_argument('-m', '--minutes', type=int, required=True)parser.add_argument('-f', '--folder', type=str, default="INBOX")parser.add_argument('-s', '--sender', type=str, required=True)parser.add_argument('--subject', type=str, default="")parser.add_argument('--body', type=str, default="")parser.add_argument('--provider', choices=['gmail', 'o365'], default='gmail', help="Choix du provider mail")args = parser.parse_args()if args.provider == 'gmail':# Connexion classique avec login + mdpimap = connect_to_imap("imap.gmail.com", EMAIL_USERNAME, EMAIL_PASSWORD)else:# O365 avec OAuth2scope = ["https://outlook.office365.com/.default"]access_token = get_msal_token(TENANT_ID, CLIENT_ID, CLIENT_SECRET, scope)imap = connect_to_imap_oauth2("outlook.office365.com", EMAIL_USERNAME, access_token)try:found = search_emails(imap,folder=args.folder,sender=args.sender,subject_filter=args.subject,body_filter=args.body,minutes=args.minutes)finally:imap.logout()if found:print("1")sys.exit(0)else:print("0")sys.exit(1)if name == "main":main() msal_auth.py

import msal

import sysdef get_msal_token(tenant_id: str, client_id: str, client_secret: str, scope: list):"""Obtient un token OAuth2 via client credentials flow MSAL."""authority = f"https://login.microsoftonline.com/{tenant_id}"app = msal.ConfidentialClientApplication(client_id=client_id,client_credential=client_secret,authority=authority,)result = app.acquire_token_for_client(scopes=scope)if "access_token" in result:return result["access_token"]else:print("Erreur d'acquisition du token MSAL:")print(result.get("error"))print(result.get("error_description"))print(result.get("correlation_id"))sys.exit(1)

imap_oauth2.py

import base64

import imaplibimport sysdef generate_oauth2_string(username, access_token):"""Génère la chaîne d’authentification XOAUTH2 encodée en base64."""auth_string = f'user={username}\x01auth=Bearer {access_token}\x01\x01'return base64.b64encode(auth_string.encode()).decode()def connect_to_imap_oauth2(server: str, username: str, access_token: str):"""Connexion IMAP via XOAUTH2 (OAuth2) pour Office365."""imap = imaplib.IMAP4_SSL(server)imap.debug = 4auth_string = generate_oauth2_string(username, access_token)try:resp_code, resp_data = imap.authenticate('XOAUTH2', lambda x: auth_string.encode())if resp_code != 'OK':print("Erreur d'authentification IMAP OAuth2:", resp_data)sys.exit(1)print("Connexion IMAP OAuth2 réussie")return imapexcept imaplib.IMAP4.error as e:print(f"Erreur IMAP OAuth2: {e}")sys.exit(1)

-----------------------

Note de la modérationNous sommes sur un forum francophone, on y parle couramment le français. Merci d'écrire en français, ça simplifie la compréhension pour tous (et aussi un peu le travail des modérateurs - cette réponse a été traduite "manuellement"). 😉

Microsoft 365 et Office | Abonnement, compte, facturation | Pour le business | Autres

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire

Réponse acceptée par l’auteur de la question

Anonyme
2025-06-05T17:20:29+00:00

Cette réponse a été automatiquement traduite. Par conséquent, il peut y avoir des erreurs grammaticales ou des formulations étranges.

Cher client,  

Je suis désolé que vous ayez un problème, et d’après la situation que vous avez rencontrée, nous comprenons profondément le désagrément causé et nous nous en excusons. 

D’après sa description, il semble que vous rencontriez un problème avec l’authentification dans Exchange. 

Si je comprends bien, comme notre catégorie se concentre sur les produits Office 365, le problème que vous avez rencontré est lié à Exchange Online, pour vous assurer d’obtenir une aide professionnelle et éviter des informations incorrectes de notre part, nous vous suggérons de publier sur Exchange Online - Microsoft Q&A pour une assistance experte. Il s’agit d’un canal spécifique lié à Exchange Online. La raison pour laquelle je vous demande de poster un nouveau sujet est que dans le forum Answers, nous avons des ressources limitées et très peu de connaissances sur Exchange Online, et dans Exchange Online - Microsoft Q&A , vous obtiendrez le groupe de répondants le plus qualifié, et d’autres partenaires qui lisent régulièrement les forums peuvent partager leurs connaissances ou apprendre de votre interaction. 

Toutes nos excuses pour vous avoir redirigé vers une autre communauté, car les membres de la catégorie publiée se concentrent sur les utilisateurs ayant des préoccupations avec Microsoft 365 et ont des connaissances limitées sur Exchange Online, donc pour obtenir une assistance rapide et meilleure, nous vous redirigeons de la bonne manière. 

Je vous remercie de votre patience et de votre compréhension, et je vous remercie de votre temps et de votre coopération. 

Sinceres salutations 

Jay-Tr– MSFT | Spécialiste du support communautaire Microsoft

Cette réponse a-t-elle été utile ?

1 personne a trouvé cette réponse utile.
0 commentaires Aucun commentaire

0 réponses supplémentaires