Ce guide a été rédigé par notre équipe éditoriale et vérifié en croisant les sources officielles.En savoir plus sur notre méthode
- Version : google-api-python-client 2.196.0 (Apache 2.0, gratuit) — Python 3.10+ requis
- Ce qu'il faut faire : créer un projet Google Cloud, activer la Gmail API, télécharger credentials.json et lancer le script
- Piège fréquent : choisir le type OAuth "Application web" au lieu de "Application de bureau" provoque l'erreur redirect_uri_mismatch
- Délai : 20 minutes de la création du projet Google au premier email envoyé
Introduction
Vous allez automatiser l'envoi et la lecture d'emails Gmail avec Python et la Gmail API v1 en 20 minutes, en utilisant google-api-python-client 2.196.0 et OAuth 2.0. Licence Apache 2.0 — gratuit. Documentation officielle Gmail API Python.
Ce que vous allez construire et pourquoi en 2026
Un script Python qui se connecte à votre boîte Gmail via OAuth 2.0, lit les messages non lus, envoie des emails automatiques et classe les messages par label. Prérequis : Python 3.10+ installé (python3 --version pour vérifier), un compte Google, 8 Go RAM minimum. Temps estimé : 20 minutes sur macOS/Linux, 30 minutes sur Windows. La Gmail API offre 1 milliard de requêtes/jour gratuitement — de quoi automatiser des dizaines de milliers d'emails.
Installation : commandes exactes à copier
mkdir gmail-automate && cd gmail-automate
python3 -m venv venv
source venv/bin/activate # Windows: venvScriptsactivate
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
Résultat attendu : Successfully installed google-api-python-client-2.196.0 google-auth-httplib2-0.2.0 google-auth-oauthlib-1.2.1. Erreur courante : error: externally-managed-environment sur Ubuntu 24.04 → utiliser le venv comme indiqué ci-dessus, ou pip install --break-system-packages (non recommandé).
Configuration : les fichiers et variables à définir
1. Aller sur Google Cloud Console → Créer un projet → Activer la Gmail API.
2. Menu → Google Auth platform → Branding : nommer l'application, ajouter un email de support, sélectionner le type Interne si vous avez un domaine Google Workspace, sinon Externe.
3. Menu → Google Auth platform → Clients → Create Client → type Application de bureau → télécharger le fichier JSON → renommer en credentials.json et le placer à la racine du projet.
4. Ajouter credentials.json et token.json au fichier .gitignore — ces fichiers contiennent des secrets OAuth, ne jamais les committer.
Le code du projet : construire la fonctionnalité principale
Créer gmail_auto.py :
import os.path
import base64
from email.mime.text import MIMEText
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError # Scopes : lecture + envoi + modification des labels
SCOPES = [ "https://www.googleapis.com/auth/gmail.readonly", "https://www.googleapis.com/auth/gmail.send", "https://www.googleapis.com/auth/gmail.modify",
] def get_credentials(): """Authentifier via OAuth 2.0 et retourner les credentials.""" creds = None if os.path.exists("token.json"): creds = Credentials.from_authorized_user_file("token.json", SCOPES) if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES) creds = flow.run_local_server(port=0) with open("token.json", "w") as token: token.write(creds.to_json()) return creds def list_unread_emails(service, max_results=10): """Lister les emails non lus.""" results = service.users().messages().list( userId="me", labelIds=["INBOX", "UNREAD"], maxResults=max_results ).execute() messages = results.get("messages", []) if not messages: print("Aucun email non lu.") return [] for msg in messages: msg_detail = service.users().messages().get(userId="me", id=msg["id"], format="metadata", metadataHeaders=["From", "Subject"]).execute() headers = {h["name"]: h["value"] for h in msg_detail.get("payload", {}).get("headers", [])} print(f" De : {headers.get('From', 'inconnu')} | Objet : {headers.get('Subject', '(sans objet)')}") return messages def send_email(service, to, subject, body_text): """Envoyer un email via la Gmail API.""" message = MIMEText(body_text) message["to"] = to message["subject"] = subject raw = base64.urlsafe_b64encode(message.as_bytes()).decode() message_body = {"raw": raw} sent = service.users().messages().send(userId="me", body=message_body).execute() print(f"Email envoyé — ID : {sent['id']}") return sent def label_emails(service, message_ids, label_name): """Ajouter un label personnalisé à une liste de messages.""" # Trouver ou créer le label labels = service.users().labels().list(userId="me").execute().get("labels", []) label_id = None for label in labels: if label["name"].lower() == label_name.lower(): label_id = label["id"] break if not label_id: created = service.users().labels().create(userId="me", body={"name": label_name, "labelListVisibility": "labelShow", "messageListVisibility": "show"}).execute() label_id = created["id"] print(f"Label '{label_name}' créé — ID : {label_id}") # Appliquer le label for msg_id in message_ids: service.users().messages().modify(userId="me", id=msg_id, body={"addLabelIds": [label_id]}).execute() print(f"Label '{label_name}' appliqué à {len(message_ids)} email(s)") if __name__ == "__main__": creds = get_credentials() service = build("gmail", "v1", credentials=creds) print("=== Emails non lus ===") unread = list_unread_emails(service) print("\n=== Envoi d'un email de test ===") send_email(service, "votre-email@gmail.com", "Test Gmail API", "Ceci est un email automatique envoyé via la Gmail API Python.") if unread: print("\n=== Classification automatique ===") ids = [m["id"] for m in unread[:5]] label_emails(service, ids, "AutoTraite")
Le script utilise 3 scopes OAuth : gmail.readonly pour lire, gmail.send pour envoyer, gmail.modify pour modifier les labels. La première exécution ouvre un navigateur pour l'autorisation Google — le token est sauvegardé dans token.json pour les exécutions suivantes.
Tester et valider que ça fonctionne
Lancer le script :
source venv/bin/activate
python gmail_auto.py
Première exécution : le navigateur s'ouvre pour l'autorisation Google. Autoriser l'application → le token est sauvegardé dans token.json. Exécutions suivantes : le token existant est rafraîchi automatiquement.
Résultat attendu dans le terminal :
=== Emails non lus === De : expediteur@example.com | Objet : Réunion demain De : newsletter@service.fr | Objet : Votre résumé hebdomadaire
=== Envoi d'un email de test ===
Email envoyé — ID : 18c4d5e6f7a8b9
=== Classification automatique ===
Label 'AutoTraite' créé — ID : Label_1234
Label 'AutoTraite' appliqué à 2 email(s)
Si vous recevez Error 400: redirect_uri_mismatch, vérifiez que le type de client OAuth est bien "Application de bureau" (pas "Application web"). Si HttpError 403, vérifiez que la Gmail API est activée dans Google Cloud Console.
Déployer et utiliser en production
Pour automatiser ce script en cron (exécution quotidienne à 8h) :
# Crontab
0 8 * * * cd /chemin/vers/gmail-automate && /chemin/vers/venv/bin/python gmail_auto.py >> /var/log/gmail-automate.log 2>&1
Pour un usage serveur sans navigateur (headless), remplacer flow.run_local_server(port=0) par :
flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
creds = flow.run_console() # Affiche une URL à copier dans un navigateur
Pour surveiller les nouveaux emails en temps réel, utiliser les Push Notifications de la Gmail API : service.users().watch(userId="me", body={"topicName": "projects/votre-projet/topics/gmail"}).execute() — chaque nouvel email déclenche un Pub/Sub vers votre endpoint.
Pour mettre à jour les packages : pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib.
Aller plus loin : 3 extensions concrètes
1. Répondeur automatique intelligent : combiner avec l'API OpenAI ou Mistral (pip install openai) pour générer des réponses contextuelles aux emails. Lire le corps du message avec service.users().messages().get(userId="me", id=msg_id, format="full"), extraire le texte du payload, l'envoyer à l'IA, puis répondre via send_email().
2. Filtrage anti-spam avancé : créer des filtres Gmail via l'API (service.users().settings().filters().create()) qui déplacent automatiquement les emails correspondant à des critères (expéditeur, sujet, mots-clés) vers un label spécifique ou la corbeille.
3. Rapport quotidien par email : combiner list_unread_emails() avec send_email() pour envoyer un résumé quotidien des emails non lus à votre adresse, classés par label. Programmer avec cron ou GitHub Actions pour une exécution automatique.
Étapes à suivre5
Étape 1 — Installer Python et les dépendances
Vérifier que Python 3.10+ est installé :python3 --versiondoit afficher 3.10 ou supérieur. Si ce n'est pas le cas, installer Python via pyenv :curl https://pyenv.run | bashpuispyenv install 3.12.3 && pyenv global 3.12.3. Ajouter pyenv au PATH dans~/.bashrc:echo "export PYENV_ROOT=$HOME/.pyenv" >> ~/.bashrc && echo "export PATH=$PYENV_ROOT/bin:$PATH" >> ~/.bashrc && echo "eval "$(pyenv init -)"" >> ~/.bashrc. Recharger le shell :source ~/.bashrc. Créer le répertoire :mkdir gmail-automate && cd gmail-automate. Créer le venv :python3 -m venv venv && source venv/bin/activate. Installer les packages :pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib. Vérifier :pip show google-api-python-clientdoit afficher Version 2.196.0 ou supérieure. Créer le fichierrequirements.txt:pip freeze > requirements.txtpour figer les versions. Cette étape prend 5 minutes.Étape 2 — Configurer Google Cloud et OAuth 2.0
Aller sur Google Cloud Console. Créer un projet : Menu → IAM & Admin → Create Project → nommergmail-automate→ noter le Project ID affiché. Activer la Gmail API : Menu → APIs & Services → Enable APIs and Services → chercherGmail API→ cliquer Enable. Configurer l'écran de consentement OAuth : Menu → Google Auth platform → Branding → nommer l'applicationGmail Automate, ajouter un email de support, choisir le type Interne (Google Workspace) ou Externe (compte personnel). Si Externe, ajouter votre email dans Test users sinon l'erreurError 403: access_deniedbloquera l'authentification. Créer les identifiants OAuth : Menu → Google Auth platform → Clients → Create Client → type Application de bureau → nommergmail-automate-desktop→ télécharger le fichier JSON → renommer encredentials.json→ le placer à la racine du projet. Ajoutercredentials.jsonettoken.jsonau fichier.gitignore— ne jamais committer ces fichiers contenant des secrets OAuth.Étape 3 — Construire le script d'automatisation
Créer le fichiergmail_auto.pyavec le code complet de la section principale ci-dessus. Les points clés : (1)SCOPEScontient les 3 autorisations nécessaires —gmail.readonlypour lire les emails,gmail.sendpour envoyer,gmail.modifypour modifier les labels. Ne jamais utiliser le scopegmail.settings.basicqui nécessite une vérification Google. (2)get_credentials()gère le flux OAuth complet : première exécution = autorisation dans le navigateur (le token est sauvegardé danstoken.json), exécutions suivantes = rafraîchissement automatique du token viacreds.refresh(Request()). (3)list_unread_emails()utiliseusers().messages().list(userId="me", labelIds=["INBOX","UNREAD"], maxResults=10)puis récupère chaque message avecusers().messages().get(). (4)send_email()encode le message en base64 URL-safe avecbase64.urlsafe_b64encode()comme requis par la Gmail API. (5)label_emails()crée le labelAutoTraiteviausers().labels().create()s'il n'existe pas, puis l'applique avecusers().messages().modify(userId="me", id=msg_id, body={"addLabelIds": [label_id]}).Étape 4 — Tester et debugger
Lancer le script :source venv/bin/activate && python gmail_auto.py. Première exécution : le navigateur s'ouvre → autoriser l'application → le token est sauvegardé danstoken.json. Si le navigateur ne s'ouvre pas, copier l'URL affichée dans le terminal et la coller dans votre navigateur. Vérifier les résultats : (1) les emails non lus s'affichent dans le terminal avec expéditeur, objet et date, (2) un email de test arrive dans la boîte de réception, (3) le label AutoTraite est créé et appliqué aux messages traités. Erreurredirect_uri_mismatch: le type OAuth est « Application web » au lieu de « Application de bureau » → recréer les identifiants avec le bon type dans Google Cloud Console. ErreurHttpError 403: la Gmail API n'est pas activée → aller dans Google Cloud Console > APIs & Services > Enable APIs and Services > Gmail API > Enable. ErreurHttpError 400: le scope est insuffisant → vérifier que les 3 scopes sont bien dans SCOPES. Erreurinvalid_grant: le token a expiré → supprimertoken.jsonet relancer le script pour réautoriser.Étape 5 — Automatiser avec cron et déployer
Pour une exécution quotidienne à 8h :crontab -epuis ajouter0 8 * * * cd /chemin/vers/gmail-automate && /chemin/vers/venv/bin/python gmail_auto.py >> /var/log/gmail-automate.log 2>&1. Pour un usage serveur sans navigateur, remplacerflow.run_local_server(port=0)parflow.run_console()qui affiche une URL à ouvrir manuellement — idéale pour les VPS headless. Pour surveiller les emails en temps réel, utiliser les Push Notifications :service.users().watch(userId="me", body={"topicName": "projects/votre-projet/topics/gmail"}).execute()— chaque nouvel email déclenche un événement Google Pub/Sub vers votre endpoint. Pour mettre à jour les dépendances :pip install --upgrade google-api-python-client. Rotation des logs : créer le fichier/etc/logrotate.d/gmail-automateavec/var/log/gmail-automate.log { daily rotate 30 compress missingok }pour éviter que le fichier de log ne grossisse indéfiniment. Sécurité : restreindre les permissions du fichiertoken.jsonavecchmod 600 token.json.
Conseils pratiques
- Ajoutez "https://www.googleapis.com/auth/gmail.settings.basic" aux SCOPES si vous devez modifier les filtres ou les paramètres Gmail via l'API — le scope gmail.modify ne suffit pas pour les settings.
- Pour les emails HTML (pas texte brut), remplacez MIMEText(body_text) par MIMEMultipart('alternative') avec une partie texte et une partie HTML : part1 = MIMEText(body_text, 'plain') et part2 = MIMEText(body_html, 'html').
- La Gmail API limite les requêtes à 250 requêtes par seconde par utilisateur. Si vous traitez plus de 250 emails, ajoutez time.sleep(1) entre les appels ou utilisez le batch : batch = service.new_batch_http_request() pour grouper les appels.
Points d'attention
- Erreur Error 400: redirect_uri_mismatch : vous avez sélectionné le type OAuth "Application web" au lieu de "Application de bureau". Solution : supprimer les identifiants existants dans Google Cloud Console → Create Client → choisir "Application de bureau" → télécharger le nouveau fichier credentials.json.
- Erreur HttpError 403: Request had insufficient authentication scopes : vous n'avez pas inclus tous les scopes nécessaires. Solution : vérifier que SCOPES contient bien gmail.readonly, gmail.send et gmail.modify. Si vous modifiez les scopes, supprimer token.json et relancer le script pour réautoriser.
- Erreur Default Credentials Error ou FileNotFoundError: credentials.json : le fichier credentials.json n'est pas dans le répertoire de travail. Solution : vérifier avec ls -la credentials.json que le fichier est bien à la racine du projet, à côté de gmail_auto.py. Ne pas le placer dans un sous-répertoire.
Questions fréquentes4
L'API Gmail est-elle gratuite ?
Oui. La Gmail API offre 1 milliard de requêtes par jour gratuitement. Il n'y a aucun coût, même pour un usage intensif. La limite est de 250 requêtes par seconde par utilisateur. Pour la plupart des automatisations personnelles, cette limite n'est jamais atteinte.
Quelle version de Python est nécessaire pour google-api-python-client 2.196.0 ?
python3 --version. En production, privilégiez Python 3.12 (supporté jusqu'en octobre 2028).Peut-on utiliser l'API Gmail sans ouvrir un navigateur ?
flow.run_local_server(port=0) par flow.run_console() dans le script. Cette méthode affiche une URL dans le terminal que vous copiez dans un navigateur sur n'importe quel appareil, puis vous collez le code d'autorisation dans le terminal. Idéal pour les serveurs headless.API Gmail vs IMAP : lequel choisir pour l'automatisation ?
imaplib) uniquement si vous devez accéder à une boîte non-Gmail (Outlook, Yahoo) ou si vous avez besoin d'accéder aux dossiers IMAP spécifiques que la Gmail API n'expose pas.Guides Technologie & IA
Voir toutMistral AI 2026: comment utiliser Le Chat et Vibe
Construire un chatbot local avec Ollama et Python en 30 minutes
Pixels de suivi dans les emails en 2026 : détecter, bloquer et protéger sa vie privée
Utiliser DeepSeek V4 en 2026 pour améliorer la recherche
Utiliser Claude Opus 4.7 en 2026 pour améliorer la productivité
Poursuivez votre lecture
Multi-catégoriesDéclaration de revenus 2026 : guide détaillé
Comment déclarer une pension de retraite étrangère aux impôts en France en 2026
Comment faire déclaration revenus expatrié
Comment déclarer comptes bancaires étrangers en 2026
"Impôts du Cœur" : les agents des finances publiques proposent leur aide à la déclaration de revenus sur le marché
Comment refuser un loyer supérieur à 30 % du revenu en 2026 ?
Équipe éditoriale GuidePratiquefr
Rédacteurs spécialisés en droit, fiscalité et finances
Rédigé et vérifié par notre équipe de rédacteurs spécialisés. Sources officielles consultées : service-public.fr, legifrance.gouv.fr, impots.gouv.fr, ameli.fr. Dernière vérification : 27 mai 2026.
Méthodologie de vérification :notre charte éditoriale
Sources officielles consultées
Les informations de ce guide sont recoupées avec les sources officielles suivantes :
Les informations contenues dans ce guide sont fournies à titre indicatif et ne remplacent pas un conseil professionnel personnalisé. Consultez toujours le site officiel de l'administration concernée pour vérifier les informations en vigueur.