API IMAP en Python : imaplib, IMAPClient, Guide XOAUTH2 OAuth (2026)

Guide Python de l'API IMAP

API IMAP Python: imaplib, IMAPClient & Guide OAuth XOAUTH2

Un guide complet pour construire des clients d'e-mails IMAP en Python en 2026 : des bases d'imaplib de la bibliothèque standard aux modèles de production IMAPClient, l'authentification OAuth XOAUTH2 pour Gmail et Outlook, et quand une API d'e-mail unifiée vous épargne entièrement la complexité.

imap_client.py
import imaplib, email from email.en-tête import décoder_en_tête # Connexion via OAuth XOAUTH2 courriel = imaplib.IMAP4_SSL('imap.gmail.com') auth_str = construire_xoauth2(utilisateur, jeton) courriel.authentifier('XOAUTH2', lambda x : auth_str) # Récupérer les messages non lus courriel.sélectionner('BOÎTE DE RÉCEPTION') _, identifiants = courriel.recherche(Aucun, 'INVISIBLES') pour identifiant d'utilisateur en id[0].divisé(): _, données = courriel.fetch(uid, '(RFC822)') message = courriel.message_des_octets(données[0][1])
Récupération d'e-mails depuis Gmail, Outlook, IMAP...
Définition

Qu'est-ce qu'un client Python IMAP ?

Un API IMAP Python Un client est tout programme Python qui communique avec un serveur de messagerie en utilisant le protocole IMAP4 (RFC 3501) pour lire, rechercher, organiser et synchroniser les messages électroniques. Contrairement à SMTP qui n'envoie que des courriels, IMAP donne à votre application un accès bidirectionnel à une boîte aux lettres distante : vous pouvez récupérer les en-têtes, lire les corps, définir des drapeaux, déplacer des messages entre les dossiers et écouter les nouvelles arrivées en temps réel en utilisant IMAP IDLE.

Définition rapide

IMAP (Protocole d'accès aux messages Internet) est un protocole standard qui permet aux clients de récupérer et de gérer les courriels stockés sur un serveur distant. Un client IMAP Python se connecte via le port TLS 993, s'authentifie (Basic ou OAuth XOAUTH2), puis émet des commandes IMAP pour récupérer, rechercher, marquer et organiser les messages. Python fournit trois niveaux d'abstraction : la bibliothèque standard imaplib, le plus haut niveau IMAPClient wrapper, et des options entièrement asynchrones comme aioimaplib. Pour une présentation complète de l'architecture IMAP et des cas d'utilisation, consultez notre Guide du développeur de l'API IMAP.

Synchronisation des e-mails pour SaaS

Synchronisez les boîtes de réception des utilisateurs dans votre CRM, ATS ou helpdesk. Python IMAP vous permet d'interroger ou de pousser (IDLE) les nouveaux messages dans votre base de données sans gérer un serveur de messagerie complet.

Pipelines d'automatisation et d'IA

Extraire, classifier et acheminer les e-mails entrants à l'aide de Python. Votre client IMAP alimente une file d'attente de traitement : analyse de factures, création de tickets, notation de prospects ou résumé par LLM.

Outils de développement

Testez la délivrabilité des e-mails, créez des outils pour atteindre la boîte de réception zéro ou auditez la délivrabilité. Python IMAP vous donne un accès programmatique à la même boîte aux lettres que celle que vos utilisateurs voient. Consultez notre Guide API d'envoi d'e-mails pour l'écosystème complet.

Comparaison de bibliothèques

Les 3 options de pile IMAP en Python

Choisir la bonne bibliothèque Python IMAP dépend de votre cas d'utilisation : un script rapide, un service de production ou un pipeline asynchrone. Voici comment les principales options se comparent avant de nous plonger dans des exemples de code pour chacune.

Bibliothèque Type Support OAuth Asynchrone Aides d'Analyse Meilleur pour
imaplib Stdlib (sans dépendances) Manuelle Non Minime Scripts simples, aucune dépendance externe
IMAPClient Enveloppe tierce partie Manuelle Non Bien Production IMAP sans asynchrone
aioimaplib Bibliothèque asynchrone Manuelle Oui, Limitée Pipelines et IDLE asyncio à grande échelle
Unipile APILe meilleur REST/SDK unifié Intégré Oui, Plein Production multi-fournisseurs à grande échelle
imaplib — Stdlib
OAuth :Configuration manuelle
Asynchrone :Non
Analyse :Minime
Meilleur pour :Scripts simples, zéro dépendance
IMAPClient — Emballage
OAuth :Configuration manuelle
Asynchrone :Non
Analyse :Bons aides
Meilleur pour :Production IMAP, pas d'asynchrone
aioimaplib — Asynchrone
OAuth :Configuration manuelle
Asynchrone :Oui (asyncio)
Analyse :Limitée
Meilleur pour :Pipelines asyncio, IDLE à grande échelle
Unipile APILe meilleur
OAuth :Intégré
Asynchrone :Oui,
Analyse :JSON structuré complet
Meilleur pour :Production multi-fournisseurs à grande échelle

Évitez la complexité de l'IMAP. Unipile abstrait imaplib, OAuth, et la logique multi-fournisseurs en une seule API REST. Une intégration pour Gmail, Outlook et n'importe quel serveur IMAP.

Commencez à construire gratuitement
Tutoriel de code

Démarrage rapide : Connexion à l'IMAP avec imaplib

La bibliothèque standard Python comprend imaplib - aucune installation requise. Voici un guide complet, de la connexion à la récupération du corps, avec des commentaires honnêtes sur les points faibles.

1
Connectez-vous et authentifiez-vous

Utilisez imaplib.IMAP4_SSL sur le port 993 pour une connexion cryptée. Pour Gmail et Outlook, voir les adresses de serveur dans notre Guide de connexion au serveur IMAP. L'authentification de base (mot de passe) fonctionne pour les serveurs IMAP qui l'autorisent encore – mais Gmail et Outlook exigent maintenant OAuth XOAUTH2 (couvert dans la section 5).

connect.py
import imaplib # : Connexion à Gmail via IMAP (port TLS 993) courriel = imaplib.IMAP4_SSL('imap.gmail.com', 993) # Authentification de base (mot de passe d'application uniquement – OAuth recommandé) courriel.Se connecter('user@gmail.com', 'mot de passe d'application') # Répertorier toutes les boîtes aux lettres statut, boîtes aux lettres = courriel.list() pour boîte en boîtes aux lettres : print(boîte).décoder('utf-8')) courriel.déconnexion()
2
Sélectionnez un dossier et recherchez des messages

Le select() l'appel ouvre une boîte aux lettres et renvoie le nombre de messages. rechercher() renvoie une chaîne d'octets séparée par des espaces des identifiants de message, pas des identifiants uniques. Vous devez décoder et diviser manuellement.

search.py
# Sélectionnez la Boîte de réception (ou n'importe quel dossier) statut, nombre = courriel.sélectionner('BOÎTE DE RÉCEPTION') print(Messages : {count[0].decode()}') # : Rechercher les messages non lus statut, ids_messages = courriel.recherche(Aucun, 'INVISIBLES') ïdes = msg_ids[0].divisé() print(Nombre d'éléments non lus : {len(ids)}') # Recherche par expéditeur _, from_ids = courriel.recherche(Aucun, 'DE', 'boss@company.com') # Recherche par plage de dates récent = courriel.recherche(Aucun, 'DEPUIS', '01-janv.-2026')
3
Récupérer les en-têtes et analyser le corps

C'est ici que imaplib devient désordonné. La réponse brute est une liste de tuples contenant des octets. Vous devez indexer données[0][1] pour accéder au message brut, puis le passer au l'email module pour l'analyse. Les en-têtes sont encodés selon la RFC 2047 et nécessitent décodage_en_tête().

fetch_body.py
import l'email from email.en-tête import décoder_en_tête déf déchiffrer_chaine(valeur) : "Décodage de la valeur d'en-tête encodée RFC 2047." pièces = décoder_en_tête(valeur) décodé = [] pour part, encl en pièces si isinstancepart, octets): décodé.ajouterpart.décoder(enclos ou 'utf-8', erreurs='remplacer')) sinon: décodé.ajouterpartie return ' '.rejoindre(décodé) pour identifiant d'utilisateur en ids[-5:]: # : les 5 derniers messages _, données = courriel.fetch(uid, '(RFC822)') cru = données[0][1] Les difficultés liées au déballage des tuples # message = courriel.message_des_octetscru sujet = déchiffrer_chaine(msg['Sujet'] ou '') expéditeur = déchiffrer_chaine(msg['De'] ou '') # : analyse MIME des éléments pour un corps de texte brut si message.est_multipart(): pour part en message.marche(): si en partie.obtenir_type_de_contenu() == 'text/plain': corps = en partie.get_payload(décoder=Vrai).décoder('utf-8', erreurs='remplacer') print(De : {sender} | Sujet : {subject}')

Les points douloureux d'imaplib : les réponses brutes en octets nécessitent un indexation tuple soigneuse (données[0][1]), les en-têtes sont encodés en RFC 2047 et doivent décodage_en_tête(), les corps MIME multiparts nécessitent une analyse complète marcher(), et il n’y a pas de fonctions d’aide intégrées pour les identifiants uniques (UID) par rapport aux numéros de séquence. Pour les charges de travail de production, envisagez IMAPClient (Section 4) ou un API IMAP unifiée au lieu de cela.

Bibliothèque de production

Aller plus loin : IMAPClient pour la production

Une fois que vous passez en production avec imaplib, vous remarquez rapidement son analyse de réponse fragile, sa gestion incohérente des UID et l'absence d'aides pour les tâches courantes. IMAPClient est un wrapper pythonique qui lisse ces aspérités tout en restant proche de la spécification IMAP.

Pourquoi imaplib casse-t-il en production
Les réponses sont des tuples d'octets bruts — indexation fragile de tuples données[0][1]
Aucune récupération basée sur l'UID par défaut (utiliser uid() (enveloppe manuellement)
Aucune aide intégrée pour l'analyse MIME ou l'extraction du corps
IDLE nécessite une gestion manuelle des sockets
Le décodage d'en-tête RFC 2047 est votre problème
Ce que IMAPClient vous offre
Réponses de dictionnaire structurées - aucun déballage de tuple requis
mode UID par défautuse_uid=True)
Nettoyeur rechercher(), chercher(), bouger(), copier() API
Prise en charge intégrée de l'IDLE avec inactif() / idle_check()
Fonctionne avec n'importe quel serveur IMAP - Gmail, Outlook, IMAP personnalisé.
imapclient_example.py
from imapclient import IMAPClient import imprimer joliment # Connexion via IMAPClient (use_uid=True par défaut) serveur = IMAPClient('imap.gmail.com', ssl=Vrai, use_uid=Vrai) serveur.Se connecter('user@gmail.com', 'mot de passe d'application') # Sélectionner et rechercher serveur.sélectionner_dossier('BOÎTE DE RÉCEPTION') messages = serveur.recherche(['INVISIBLES']) print({len(messages)} messages non lus') # Fetch - renvoie un dictionnaire structuré, et non des octets bruts response = serveur.fetch(messages[:10], ['ENVELOPPE', 'CORPS[]', 'DRAPEAUX']) pour uid, données en réponse.articles(): enveloppe = données[ENVELOPPE'] print(UID {uid} : {envelope.subject}') # Déplacer les messages vers un dossier serveur.bouger(messages[:5], 'Archives') # EN ATTENTE - attend les nouveaux messages (jusqu'à 29 minutes sur Gmail) serveur.inactif() réponses = serveur.vérification_inactivité(délai d'attente=60) print('Réponse IDLE :', réponses) serveur.idle_done() serveur.déconnexion()

Même IMAPClient nécessite une gestion manuelle des jetons OAuth et une gestion multi-fournisseurs. Unipile abstrait tout cela - rafraîchissement OAuth, bizarreries du fournisseur, reconnexions IDLE - derrière une seule API REST. Voir notre version complète Guide API d'envoi d'e-mails.

Construisez-le avec Unipile
OAuth XOAUTH2

OAuth XOAUTH2 en Python : Gmail et Microsoft 365

L'authentification par mot de passe de base est morte pour les grands fournisseurs. Gmail l'a bloquée pour les comptes standards depuis mai 2022. Microsoft 365 a déprécié l'authentification de base pour IMAP en septembre 2024. XOAUTH2 (un mécanisme SASL OAuth 2.0) est désormais la seule façon de niveau production d'authentifier un client IMAP Python. Pour une explication complète du flux OAuth, consultez notre Guide API email OAuth.

Comment fonctionne XOAUTH2

XOAUTH2 est un mécanisme d'authentification SASL qui encode un jeton OAuth Bearer dans une chaîne base64 avec le format : email={email}\x01auth=Bearer {token}\x01\x01. Cette chaîne est transmise à imaplib.IMAP4_SSL.authenticate('XOAUTH2', callback). Le rappel renvoie la chaîne encodée en base64. Il vous incombe d'obtenir et de renouveler le jeton d'accès OAuth via les points de terminaison d'identité de Google ou de Microsoft avant d'établir la connexion IMAP. Pour les étendues Gmail requises, consultez notre Guide des étendues de l'API Gmail.

Gmail Gmail
Outlook Microsoft 365
gmail_xoauth2.py
import imaplib, base64, json from google.oauth2.credentials import Indentifications from google.auth.transport.requests import Requête déf construire_chaîne_xoauth2(adresse_electronique_utilisateur, jeton_acces) "Générer la chaîne SASL XOAUTH2 pour l'authentification IMAP." chaine_auth = f'utilisateur={user_email}\x01authentification=Bearer {access_token}\x01\x01' return base64.b64encode(chaîne_authentification.encoder('ascii')) déf obtenir_jeton_valide(dictionnaire_identifiants) "Rafraîchir le token si expiré en utilisant la librairie google-auth." identifiants = Identifiants.informations_utilisateur_autorisé(dico_identifiants) si identifiants.expiré et credss.jeton_rafraîchissement : identifiants.Actualiser(Requête()) return identifiants.jeton # - Paramètres IMAP requis pour Gmail : https://mail.google.com/ email_utilisateur = 'user@gmail.com' access_token = obtenir_jeton_valide(dico_identifiants) courriel = imaplib.IMAP4_SSL('imap.gmail.com') chaine_auth = construire_chaîne_xoauth2(adresse_courriel_utilisateur, jeton_d_accès) courriel.authentifier('XOAUTH2', lambda x: chaîne_authentification) # Utilisez-le désormais comme d'habitude courriel.sélectionner('BOÎTE DE RÉCEPTION') _, identifiants = courriel.recherche(Aucun, 'TOUT') print(Total des messages : {len(ids[0].split())}')
Exigence de portée Gmail : Le jeton d'accès doit être obtenu avec le https://mail.google.com/ portée (pas gmail.lecture seule seul - cette portée n'accorde pas l'accès IMAP). Voir notre Guide des étendues de l'API Gmail pour une analyse complète. Vous devez également activer l'IMAP dans les paramètres de Gmail et utiliser un ID client Google Cloud OAuth 2.0 avec l'URI de redirection correcte.
outlook_xoauth2.py
import imaplib, base64 import msal déf construire_chaîne_xoauth2(adresse_electronique_utilisateur, jeton_acces) chaine_auth = f'utilisateur={user_email}\x01authentification=Bearer {access_token}\x01\x01' return base64.b64encode(chaîne_authentification.encoder('ascii')) # MSAL - Bibliothèque d'authentification Microsoft pour Python CLIENT_ID = 'votre-identifiant-client-azure-app' ID_LOCATAIRE = 'votre-identifiant-locataire' Portée de # pour l'accès IMAP (Outlook / Microsoft 365) PORTEE = ['https://outlook.office365.com/IMAP.AccessAsUser.All'] application = msal.ApplicationClientPublic(CLIENT_ID, autorité=https://login.microsoftonline.com/{TENANT_ID}') # Obtenir un jeton (de manière interactive ou via un jeton de rafraîchissement) résultat = application.acquérir_jeton_par_code_autorisation(code, périmètre=SCOPE, redirect_uri=redirect_uri) access_token = résultat['jeton_d'accès'] # : Connexion à Outlook via IMAP avec XOAUTH2 email_utilisateur = 'user@outlook.com' courriel = imaplib.IMAP4_SSL('outlook.office365.com') chaine_auth = construire_chaîne_xoauth2(adresse_courriel_utilisateur, jeton_d_accès) courriel.authentifier('XOAUTH2', lambda x: chaîne_authentification) courriel.sélectionner('BOÎTE DE RÉCEPTION')
Microsoft 365 IMAP note : Depuis septembre 2024, Microsoft a désactivé l'authentification de base pour IMAP sur tous les locataires Microsoft 365. Vous devez utiliser XOAUTH2. Enregistrez une application Azure AD, activez la permission "IMAP.AccessAsUser.All" et utilisez MSAL pour l'acquisition de jetons. Pour Microsoft Graph comme alternative à IMAP, consultez notre Guide OAuth de messagerie Microsoft Graph.

OAuth XOAUTH2 fait plus de 50 lignes par fournisseur. Unipile gère les rafraîchissements de jetons, les échanges XOAUTH2 et les particularités spécifiques aux fournisseurs afin que votre code Python se concentre sur la logique métier, et non sur la mécanique d'authentification.

Créez votre flux OAuth
Matrice des fournisseurs

Réalité Multipartenaire

Chaque fournisseur a ses propres particularités d'authentification, adresses de serveur et limites de débit. Voici ce que votre client IMAP Python doit gérer pour chacun d'eux. Pour les noms d'hôte de serveur et les détails des ports TLS, consultez notre section dédiée Guide de connexion au serveur IMAP.

Logo Gmail
Gmail
imap.gmail.com:993
Auth:XOAUTH2 requis
Portée :https://mail.google.com/
inactifSoutenu (29 minutes max)
Excentricités :Les libellés Gmail correspondent aux dossiers IMAP. Activez IMAP dans les paramètres.
Nécessite un projet Google Cloud avec un client OAuth 2.0. Voir Guide des étendues Gmail pour les détails du champ d'application.
Logo Outlook
Outlook / Microsoft 365
outlook.office365.com:993
Auth:XOAUTH2 requis
Portée :IMAP.AccéderEnTantQuUtilisateur.Tout
inactifSoutenu
Excentricités :Authentification de base désactivée en septembre 2024. Application Azure AD + consentement administrateur requis pour M365.
Pour une alternative REST à IMAP, consultez Guide OAuth de messagerie Microsoft Graph.
Logo IMAP
IMAP générique
votre-serveur:993
Auth:Connexion/mot de passe OK
inactifVarie selon le serveur
Excentricités :Nommage de dossier spécifique au serveur, les CAPACITÉS varient, certains manquent de l'IDLE.
Exemple :Fastmail, ProtonMail Bridge, Postfix/Dovecot auto-hébergé
Couvre pratiquement n'importe quel serveur IMAP4rev1. Voir Guide de l'API IMAP pour la liste complète.
Yahoo Mail
imap.mail.yahoo.com:993
Auth:Mot de passe d'application requis (pas de XOAUTH2 pour des tiers)
inactifSoutenu
Yahoo a abandonné le support XOAUTH2 pour les applications tierces. Générez un mot de passe spécifique à l'application dans les paramètres de sécurité du compte Yahoo.
iCloud Mail
imap.mail.me.com:993
Auth:Mot de passe d'application requis
inactifSoutenu
L'authentification à deux facteurs doit être activée sur l'identifiant Apple. Générez un mot de passe d'application sur appleid.apple.com.

Prendre en charge plusieurs fournisseurs signifie maintenir des flux d'authentification, des configurations de serveur et des solutions de contournement spécifiques séparément. Unipile normalise Gmail, Outlook et n'importe quel serveur IMAP en une API unique. Lisez notre Comparaison des fournisseurs d'API d'e-mail pour le contexte.

Construire un courriel multi-fournisseurs
Alternative API unifiée

Quand ignorer IMAP complètement : approche par API unifiée

Après avoir parcouru imaplib, IMAPClient et XOAUTH2, une vérité devient évidente : l'IMAP brut en Python nécessite des centaines de lignes de code répétitif pour chaque fournisseur que vous supportez. Unipile est un API IMAP unifiée qui abstrait tout cela dans une seule interface REST. Vous liez les comptes utilisateur (Gmail, Outlook ou tout serveur IMAP) avec OAuth, et Unipile gère tous les détails du protocole pour vous.

Avec imaplib brut (50 lignes par fournisseur)
raw_imap.py
# 1. Obtenir un jeton OAuth (plus de 50 lignes) # 2. Créer une chaîne XOAUTH2 # 3. Se connecter et s'authentifier # 4. Sélectionner un dossier # 5. Rechercher des messages # 6. Récupérer les octets bruts # 7. Analyser les données du tuple [0][1] # 8. Décodage des en-têtes RFC 2047 # 9. Parcours des éléments MIME # 10. Fixations de poignées # 11. Gérer les délais d'inactivité # 12. Se reconnecter en cas d'erreur # 13. Répétez l'opération pour Outlook... # 14. Répétez l'opération pour les serveurs IMAP...
Avec l'API REST Unipile (5 lignes)
unipile_email.py
import demandes # Récupérer les e-mails de n'importe quel compte associé r = requêtes.obtenir( 'https://api6.unipile.com/api/v1/emails', en-têtes={'X-API-KEY': clé_api}, params={'identifiant_de_compte': id_compte} ) courriels = r.json()['articles'] # fonctionne avec Gmail, Outlook et tout autre client IMAP
OAuth géré pour vous

Unipile gère l'acquisition, le rafraîchissement et l'expiration des jetons XOAUTH2 pour Gmail et Outlook. Aucune configuration MSAL ou google-auth n'est nécessaire dans votre code.

Réponses JSON normalisées

Aucun octet brut, aucun déballage de tuple, aucun décodage RFC 2047. Chaque e-mail revient sous forme de JSON structuré propre avec les en-têtes, le corps et les pièces jointes analysés.

Webhooks en temps réel

Au lieu de gérer les sessions inactives (IDLE) et les reconnexions, Unipile pousse les nouveaux événements d'e-mail vers votre point de terminaison webhook. Pas de sondage, pas de gestion de socket.

Multi-fournisseur par défaut

Un point de terminaison API dessert Gmail, Outlook et tout serveur IMAP. Ajoutez de nouveaux fournisseurs en liant des comptes - aucune modification de code requise de votre côté.

Envoyer des e-mails aussi

Unipile couvre le cycle de vie complet des e-mails. Lire, rechercher, déplacer, marquer et envoyer – le tout depuis la même API. Voir notre Guide pour envoyer des e-mails en Python côté expéditeur.

Comptes liés par utilisateur

Chacun de vos utilisateurs lie son propre compte via OAuth. Unipile agit en tant qu'intermédiaire technique indépendant pour le compte de chaque utilisateur authentifié – et non comme un pool d'identifiants partagés.

Problèmes de production

Les pièges courants en production

Après avoir mis en place un client IMAP Python localement, la production révèle des cas limites qui peuvent entraîner une perte de données silencieuse, une interruption de connexion ou un encodage de caractères incorrect. Voici les problèmes les plus courants et comment les résoudre.

2026 Changement majeur : fin du support de l'authentification de base pour IMAP par Microsoft

Microsoft a finalisé la suppression de l'authentification de base pour IMAP sur tous les locataires Microsoft 365 en Septembre 2024. Tout code Python utilisant mail.connexion(utilisateur, mot_de_passe) contre outlook.office365.com recevra désormais ÉCHEC D'AUTHENTIFICATION. La migration vers XOAUTH2 (section 5) est obligatoire pour toutes les intégrations IMAP Microsoft 365 / Outlook. Les déploiements Exchange locaux peuvent encore prendre en charge l'authentification de base en fonction de la configuration du serveur.

01
IMAP IDLE délai d'attente (29 minutes sur Gmail)

Gmail met fin silencieusement aux connexions IDLE après environ 29 minutes. Si votre code ne renouvelle pas la session IDLE, de nouveaux messages cessent d'arriver sans qu'aucune exception ne soit levée.

Réparer : Régler une minuterie sur idle_done() toutes les 25 minutes, puis appelez immédiatement inactif() encore. Utilise select_folder('BOÎTE DE RÉCEPTION', readonly=False) pour vérifier à nouveau le nombre de messages lors de la reconnexion.
02
Erreurs de décodage de charset RFC 2047

Les en-têtes d'e-mail comme Sujet et De utilisent l'encodage RFC 2047 (Ceci est un exemple de texte encodé en Base64.). Appeler str(msg['Objet']) directement sur une valeur d'octets renvoie des données corrompues ou provoque une erreur Erreur de décodage Unicode.

Réparer : Toujours utiliser email.header.decode_header() et gérer explicitement le codage de chaque partie. Passer erreurs='remplacer' à .décoder() pour éviter les plantages sur des en-têtes malformés.
03
Analyse des pièces jointes à partir de messages multipartites

Les pièces jointes vivent dans des parties MIME imbriquées. Appelons get_payload() sur un message multipartie renvoie une liste de parties, et non le contenu. Les images en ligne sont Content-Disposition : inline et avoir un ID de contenu.

Réparer : Promener toutes les pièces avec msg.marcher(), Vérifier get_content_disposition() pour pièce jointe, et appelez get_payload(decode=True) sur des pièces jointes pour obtenir des octets décodés.
04
Pool de connexions et sécurité des threads

imaplib.IMAP4_SSL les instances ne sont PAS thread-safe. L'utilisation d'une seule connexion sur plusieurs threads entraîne des réponses brouillées. La création d'une nouvelle connexion par requête est coûteuse et limitée en débit.

Réparer : Utilisez un pool de connexions (une connexion par thread worker) ou une bibliothèque asynchrone comme aioimaplib. Toujours implémenter un rétro-agissement exponentiel pour les tentatives de reconnexion après IMAP4.abandon exceptions.
05
Limites de taux et épuisement des quotas

Gmail limite les connexions IMAP à 15 connexions simultanées par compte et applique des quotas de bande passante (2 500 Mo/jour via IMAP). La récupération de corps RFC822 entiers à grande échelle atteindra rapidement ces limites.

Réparer : Récupérer les en-têtes d'abord (RFC822.EN-TÊTE), puis récupérez les corps sélectivement. Utiliser BODY.PEEK[] au lieu de RFC822 pour éviter de marquer automatiquement comme lu. Implémenter une décroissance exponentielle sur [DÉPASSEMENT DE QUOTA] réponses.
06
expiration du jeton OAuth en milieu de session

Les jetons d'accès de Google et Microsoft expirent après 3 600 secondes (1 heure). Si votre session IMAP est toujours ouverte lorsque le jeton expire, la prochaine commande après l'expiration échouera silencieusement ou renverra NON.

Réparer : Suivre le expire à timestamp. Avant chaque opération par lots, vérifiez si le jeton expire dans moins de 5 minutes et actualisez-le de manière proactive. Stockez les jetons d'actualisation en toute sécurité. C'est exactement ce que Unipile gère automatiquement.

Éviter les 6 pièges demande des infrastructures considérables. Unipile gère les reconnects IDLE, l'actualisation des jetons, la limitation de débit et la normalisation multi-fournisseurs - afin que vous puissiez vous concentrer sur la logique de votre produit. Fait partie de notre solution complète Guide API d'envoi d'e-mails.

Construire sans les écueils
FAQ

Questions fréquemment posées

Questions courantes sur les clients IMAP Python, imaplib, IMAPClient, l'authentification XOAUTH2, et quand utiliser une API de messagerie unifiée à la place.

01
Quelle est la meilleure bibliothèque Python pour IMAP ?
Pour les scripts simples, imaplib de la bibliothèque standard est suffisant avec zéro dépendance. Pour une utilisation en production, IMAPClient fournit une API plus propre avec des réponses structurées et un support IDLE intégré. Pour les charges de travail asynchrones à grande échelle, aioimaplib s'intègre avec asyncio. Si vous avez besoin d'une prise en charge multi-fournisseurs (Gmail, Outlook et serveurs IMAP personnalisés) avec gestion automatique de OAuth, une interface unifiée API IMAP comme Unipile supprime la plupart de la complexité.
02
imaplib peut-il lire les e-mails Gmail en Python ?
Oui. Connectez-vous à imap.gmail.com sur le port 993 en utilisant imaplib.IMAP4_SSL. Cependant, Gmail n'accepte plus la connexion par nom d'utilisateur/mot de passe simple pour les applications tierces. Vous devez utiliser OAuth XOAUTH2 authentification avec un jeton d'accès obtenu de Google en utilisant https://mail.google.com/ champ. Voir notre Guide des étendues de l'API Gmail Pour la ventilation complète de la portée. Les mots de passe d'application fonctionnent toujours pour les comptes personnels avec la vérification en deux étapes activée, mais OAuth est requis pour les applications.
03
Qu'est-ce que XOAUTH2 en Python ?
XOAUTH2 est un mécanisme SASL (Simple Authentication and Security Layer) utilisé pour authentifier les connexions IMAP avec un jeton OAuth 2.0 Bearer au lieu d'un mot de passe. En Python, vous encodez la chaîne email={email}\x01auth=Bearer {token}\x01\x01 en base64, puis le passer à imaplib.IMAP4_SSL.authenticate('XOAUTH2', callback). Ceci remplace l'authentification de base obsolète pour Gmail et Microsoft 365. Des exemples d'implémentation complets se trouvent dans la section 5 de ce guide. Voir aussi notre Guide API email OAuth.
04
Comment utiliser OAuth avec imaplib ?
Pour utiliser OAuth avec imaplib : 1) Obtenir un jeton d'accès auprès du fournisseur (Google OAuth 2.0 ou Microsoft MSAL). 2) Construire la chaîne XOAUTH2 : base64(f'utilisateur={email}\x01auth=Bearer {token}\x01\x01'). 3) Appel mail.authentifier('XOAUTH2', lambda x: auth_string). Pour Gmail, utilisez le authentification Google Bibliothèque pour gérer le rafraîchissement des jetons. Pour Outlook/Microsoft 365, utilisez le msal Bibliothèque Python. Les deux nécessitent l'enregistrement d'une application OAuth dans la console Google Cloud ou Azure AD. Le code complet imap python oauth se trouve dans la section 5 ci-dessus.
05
imaplib vs IMAPClient - lequel devrais-je utiliser ?
Utilisez imaplib quand vous avez besoin de zéro dépendance externe ou seulement d'un simple script unique. Utilisez IMAPClient pour le code de production : il renvoie des dictionnaires structurés au lieu de tuples d'octets bruts, utilise des UID par défaut, fournit plus propre rechercher()/chercher()/bouger() méthodes, et comprend un support IDLE intégré. Les deux nécessitent que vous gériez vous-même la gestion des jetons OAuth. Aucun n'est asynchrone - pour les pipelines basés sur asyncio, envisagez aioimaplib. Installer IMAPClient avec pip install imapclient.
06
Comment lire les e-mails d'Outlook avec Python IMAP ?
Se connecter à outlook.office365.com sur le port 993 en utilisant imaplib.IMAP4_SSL. Depuis septembre 2024, l'authentification de base est désactivée pour Microsoft 365 - vous devez utiliser XOAUTH2. Enregistrez une application Azure AD, demandez le IMAP.AccéderEnTantQuUtilisateur.Tout la permission, obtenir un jeton d'accès en utilisant le msal Bibliothèque Python, puis authentifiez-vous avec mail.authentifier('XOAUTH2', ...). Pour les comptes Outlook.com personnels, le même flux OAuth s'applique. Pour les détails du serveur et la configuration TLS, consultez notre Guide de connexion au serveur IMAP.
07
IMAP fonctionne-t-il avec Microsoft 365 ?
Oui, Microsoft 365 prend en charge IMAP à outlook.office365.com:993. Cependant, depuis septembre 2024, Microsoft a complètement désactivé l'authentification de base pour IMAP sur les locataires Microsoft 365. Vous devez utiliser OAuth 2.0 avec le mécanisme SASL XOAUTH2. Votre administrateur Azure AD peut également avoir besoin d'activer l'accès IMAP dans le centre d'administration Exchange. Une alternative consiste à utiliser le Microsoft Graph API (REST) qui évite complètement IMAP et fournit des métadonnées plus riches.
08
Comment gérer IMAP IDLE en Python ?
IMAP IDLE permet au serveur de pousser des notifications lorsque de nouveaux messages arrivent. Avec IMAPClient : appelez server.idle() pour entrer en mode IDLE, puis server.idle_check(timeout=60) attendre des événements. Gmail se déconnecte silencieusement après environ 29 minutes, vous devez donc renouveler : appelez server.idle_done() toutes les 25 minutes, puis server.idle() Encore. Avec imaplib brut, IDLE nécessite une gestion manuelle au niveau du socket – considérablement plus complexe. Pour les e-mails en temps réel en production, une approche basée sur les webhooks (comme celle qu'offre Unipile) est plus fiable que le maintien de sessions IDLE.
09
Puis-je utiliser l'IMAP asynchrone en Python ?
Oui. Le aioimaplib La bibliothèque fournit un client IMAP4 compatible asyncio pour Python. Elle prend en charge les commandes IMAP standard et IDLE dans un contexte asynchrone, ce qui la rend adaptée aux pipelines à haute concurrence où vous gérez de nombreuses boîtes aux lettres simultanément. Cependant, aioimaplib a une communauté plus petite qu'imaplib ou IMAPClient, et le support OAuth nécessite toujours une implémentation manuelle de XOAUTH2. Pour les équipes qui privilégient la rapidité de développement par rapport à un contrôle granulaire, une API unifiée basée sur REST offre des e-mails en temps réel via des webhooks sans gestion de socket asynchrone.
10
Comment Unipile se compare-t-il à imaplib pour l'intégration de messagerie ?
imaplib gère les jetons OAuth, la construction XOAUTH2, l'analyse des octets bruts, le décodage des en-têtes RFC 2047, la parcours du corps MIME, les boucles de reconnexion IDLE. Unipile est une API REST unifiée qui abstrait tout cela en un seul appel HTTP avec des réponses JSON normalisées, une authentification OAuth intégrée pour Gmail et Outlook, la livraison par webhook pour les nouveaux e-mails et la prise en charge de plusieurs fournisseurs. Le compromis : Unipile est un service géré avec sa propre tarification, tandis qu'imaplib est gratuit mais nécessite un investissement d'infrastructure important. Voir notre complet Guide de l'API IMAP et comparaison des fournisseurs.

Vous avez encore des questions sur l'API IMAP en Python ? Notre équipe peut vous aider à choisir la bonne approche pour votre cas d'utilisation - IMAP brut ou API unifiée.

Parler à un expert
fr_FRFR