0Pricing
AI Agents · Leçon

Se connecter à Gmail via l’API

Bibliothèque cliente Google API, consentement OAuth2 et sélection de la portée Gmail.

Se connecter à Gmail via l’API est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.

Pourquoi utiliser l’API Gmail plutôt que SMTP ?

L’automatisation traditionnelle des e-mails utilise SMTP/IMAP, mais l’API Gmail offre bien davantage : lire des conversations, effectuer des recherches par requête, gérer des libellés et envoyer des messages avec une authentification complète. Elle prend également en charge OAuth 2.0, de sorte que votre agent ne stocke jamais de mot de passe, uniquement un jeton d’accès à portée limitée.

L’API Gmail fait partie des API Google Workspace, accessibles via la bibliothèque google-api-python-client.

# Install required libraries:
# pip install google-api-python-client google-auth google-auth-oauthlib

# The Gmail API lets agents:
# - List and search messages (labels, queries)
# - Read full message content and attachments
# - Send messages via OAuth (no password needed)
# - Manage labels and threads
# - Watch for new messages via push notifications

print('Gmail API is part of Google Workspace APIs')

Authentification : compte de service ou authentification utilisateur

Deux approches d’authentification existent pour l’API Gmail :

  • Compte de service : idéal pour un usage Workspace ou organisationnel avec délégation à l’échelle du domaine ; aucune interaction utilisateur n’est requise
  • OAuth utilisateur (OAuth2 avec écran de consentement) : requis pour les comptes Gmail personnels ; l’utilisateur autorise l’accès une fois, puis l’agent utilise un jeton de renouvellement

Pour la plupart des automatisations réalisées par un agent, les comptes de service sont préférables pour leur fiabilité.

# Service Account approach:
# 1. Go to Google Cloud Console -> APIs & Services -> Credentials
# 2. Create a Service Account
# 3. Download the JSON key file
# 4. In Google Workspace Admin: enable domain-wide delegation
# 5. Grant required scopes to the service account

# User OAuth approach:
# 1. Create OAuth 2.0 Client ID (Desktop or Web App type)
# 2. Download credentials.json
# 3. First run: user sees consent screen and grants access
# 4. Agent stores token.json with refresh token for subsequent runs

print('Choose service account for org automation, OAuth for personal Gmail')

Structure du fichier JSON d’identifiants OAuth2

Google fournit des identifiants dans un fichier JSON que votre agent charge pour s’authentifier. Pour OAuth utilisateur, il s’agit d’un fichier credentials.json téléchargé depuis Google Cloud Console. Le fichier contient l’ID client, le secret et l’URI de redirection — ne le validez jamais dans le système de gestion de versions.

# credentials.json structure (User OAuth — Desktop app type):
# {
#   "installed": {
#     "client_id": "123456789.apps.googleusercontent.com",
#     "client_secret": "GOCSPX-abc123xyz",
#     "redirect_uris": ["urn:ietf:wg:oauth:2.0:oob", "http://localhost"],
#     "auth_uri": "https://accounts.google.com/o/oauth2/auth",
#     "token_uri": "https://oauth2.googleapis.com/token"
#   }
# }

# service-account.json structure:
# {
#   "type": "service_account",
#   "project_id": "my-project",
#   "private_key_id": "abc123",
#   "private_key": "-----BEGIN PRIVATE KEY-----\n...",
#   "client_email": "agent@my-project.iam.gserviceaccount.com",
#   "client_id": "..."
# }

print('Store credential files outside your git repository')

Portées de l’API Gmail

Les portées OAuth définissent précisément ce que votre agent peut consulter. Demandez uniquement les portées dont vous avez besoin : c’est le principe du moindre privilège. Les portées Gmail vont de la lecture seule à l’accès complet.

  • gmail.readonly — lire tous les e-mails
  • gmail.send — envoyer uniquement, sans lecture
  • gmail.modify — lire, envoyer et modifier les libellés
  • gmail.compose — créer uniquement des brouillons
# Gmail API scope constants
SCOPE_READONLY = 'https://www.googleapis.com/auth/gmail.readonly'
SCOPE_SEND = 'https://www.googleapis.com/auth/gmail.send'
SCOPE_MODIFY = 'https://www.googleapis.com/auth/gmail.modify'
SCOPE_COMPOSE = 'https://www.googleapis.com/auth/gmail.compose'

# Calendar scopes (often used alongside Gmail)
SCOPE_CALENDAR_READ = 'https://www.googleapis.com/auth/calendar.readonly'
SCOPE_CALENDAR_EVENTS = 'https://www.googleapis.com/auth/calendar.events'

# Combine scopes your agent actually needs
AGENT_SCOPES = [
    SCOPE_READONLY,
    SCOPE_SEND,
    SCOPE_CALENDAR_EVENTS
]
print(f'Using {len(AGENT_SCOPES)} scopes')

OAuth utilisateur : flux d’authentification initiale

La première fois qu’un utilisateur exécute l’agent, celui-ci ouvre un navigateur pour lui permettre d’accorder l’autorisation. L’agent stocke le jeton obtenu dans token.json. Lors des exécutions suivantes, il charge le jeton stocké et le renouvelle automatiquement : aucune interaction avec le navigateur n’est nécessaire.

from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
import os

SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

def get_credentials(token_file='token.json', creds_file='credentials.json'):
    creds = None

    # Load existing token if available
    if os.path.exists(token_file):
        creds = Credentials.from_authorized_user_file(token_file, SCOPES)

    # Refresh or re-authenticate if needed
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())  # auto-refresh
        else:
            # Opens browser for user consent (first time only)
            flow = InstalledAppFlow.from_client_secrets_file(
                creds_file, SCOPES
            )
            creds = flow.run_local_server(port=0)
        # Save token for next run
        with open(token_file, 'w') as f:
            f.write(creds.to_json())

    return creds

Authentification avec un compte de service

Pour les agents automatisés qui s’exécutent sans interaction utilisateur, les comptes de service sont idéaux. L’agent s’authentifie à l’aide d’une clé privée, puis agit au nom d’un utilisateur Google Workspace via une délégation à l’échelle du domaine. Aucun écran de consentement, aucun navigateur : uniquement un fichier de clé JSON.

from google.oauth2 import service_account
import os

SCOPES = [
    'https://www.googleapis.com/auth/gmail.readonly',
    'https://www.googleapis.com/auth/gmail.send'
]

def get_service_account_credentials(impersonate_user):
    service_account_file = os.environ.get(
        'GOOGLE_SERVICE_ACCOUNT_JSON',
        'service-account.json'
    )

    credentials = service_account.Credentials.from_service_account_file(
        service_account_file,
        scopes=SCOPES
    )

    # Impersonate a real user (requires domain-wide delegation in Admin)
    delegated = credentials.with_subject(impersonate_user)
    return delegated

creds = get_service_account_credentials('agent@yourcompany.com')
print('Service account credentials ready')

Créer l’objet de service Gmail

Une fois vos identifiants obtenus, utilisez googleapiclient.discovery.build() pour créer l’objet de service Gmail. Il s’agit de l’interface principale de tous les appels à l’API Gmail. Transmettez le nom du service 'gmail' et la version 'v1'.

from googleapiclient.discovery import build

def build_gmail_service(credentials):
    service = build(
        'gmail',
        'v1',
        credentials=credentials,
        cache_discovery=False  # avoid file warnings in some environments
    )
    return service

# Full setup: credentials -> service
creds = get_credentials()          # or get_service_account_credentials()
gmail = build_gmail_service(creds)

# Test: get user profile
profile = gmail.users().getProfile(userId='me').execute()
print('Email:', profile['emailAddress'])
print('Total messages:', profile['messagesTotal'])

Créer l’objet de service Calendar

La même configuration des identifiants fonctionne avec Google Calendar. Il vous suffit de créer le service avec 'calendar' et 'v3'. Si votre agent a besoin de Gmail et de Calendar, créez les deux services à partir du même objet d’identifiants.

from googleapiclient.discovery import build

def build_google_services(credentials):
    gmail = build(
        'gmail', 'v1',
        credentials=credentials,
        cache_discovery=False
    )
    calendar = build(
        'calendar', 'v3',
        credentials=credentials,
        cache_discovery=False
    )
    return gmail, calendar

# Use both in one agent
creds = get_credentials()
gmail_service, calendar_service = build_google_services(creds)

# Test calendar access
cal_list = calendar_service.calendarList().list().execute()
for cal in cal_list.get('items', []):
    print(f'Calendar: {cal["summary"]}')

Gérer les erreurs de l’API Google

Les erreurs de l’API Google sont levées sous forme de googleapiclient.errors.HttpError. L’erreur contient un code d’état HTTP et un corps JSON contenant les détails de l’erreur. Interceptez toujours cette erreur et consignez le code d’état ainsi que le message pour faciliter le débogage.

from googleapiclient.errors import HttpError
import json

def safe_gmail_call(service, user_id='me'):
    try:
        profile = service.users().getProfile(userId=user_id).execute()
        return profile
    except HttpError as e:
        status = e.resp.status
        try:
            error_body = json.loads(e.content.decode())
            message = error_body.get('error', {}).get('message', str(e))
        except Exception:
            message = str(e)

        if status == 401:
            print('AUTH ERROR: Credentials invalid or expired')
        elif status == 403:
            print(f'PERMISSION ERROR: {message}')
            print('Check scopes and domain-wide delegation settings')
        elif status == 429:
            print('QUOTA EXCEEDED: Gmail API rate limit hit')
        else:
            print(f'Gmail API error {status}: {message}')
        return None

Quota et limites de débit de l’API Google

L’API Gmail applique des quotas d’utilisation : 1 milliard d’unités de quota par jour par défaut, chaque appel coûtant de 1 à 100 unités selon l’opération. La lecture de messages coûte plus cher que leur énumération. Utilisez des requêtes groupées et une temporisation exponentielle en cas d’erreurs 429/503 pour rester dans les limites.

import time
from googleapiclient.errors import HttpError

def gmail_call_with_retry(func, max_retries=5):
    for attempt in range(max_retries):
        try:
            return func()
        except HttpError as e:
            if e.resp.status in (429, 500, 503):
                wait = (2 ** attempt) + 1
                print(f'Quota/server error. Waiting {wait}s (attempt {attempt+1})')
                time.sleep(wait)
            elif e.resp.status == 403:
                # Check if it's a quota exceeded vs permission error
                import json
                body = json.loads(e.content.decode())
                reason = body.get('error', {}).get('errors', [{}])[0].get('reason', '')
                if reason == 'rateLimitExceeded':
                    time.sleep(2 ** attempt)
                else:
                    raise  # real permission error, don't retry
            else:
                raise
    raise Exception(f'Gmail API call failed after {max_retries} attempts')

Stocker les identifiants en toute sécurité

Ne validez jamais token.json, credentials.json ou service-account.json dans le système de gestion de versions. Ajoutez-les à .gitignore. En production, stockez le fichier JSON du compte de service dans une variable d’environnement ou un gestionnaire de secrets, puis chargez-le au moment de l’exécution.

import json
import os
from google.oauth2 import service_account

SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

def get_credentials_from_env():
    # Load service account JSON from environment variable
    sa_json = os.environ.get('GOOGLE_SERVICE_ACCOUNT_JSON')
    if not sa_json:
        raise EnvironmentError(
            'GOOGLE_SERVICE_ACCOUNT_JSON env var not set. '
            'Set it to the contents of your service-account.json'
        )

    sa_info = json.loads(sa_json)
    credentials = service_account.Credentials.from_service_account_info(
        sa_info,
        scopes=SCOPES
    )
    return credentials

# In production: export GOOGLE_SERVICE_ACCOUNT_JSON=$(cat service-account.json)
creds = get_credentials_from_env()
print('Service account loaded from env var')

Vérification rapide : compte de service ou OAuth utilisateur

Vérifiez votre compréhension des méthodes d’authentification de l’API Gmail.

Récapitulatif de la connexion à l’API Gmail

Vous pouvez maintenant connecter un agent à Gmail :

  • OAuth utilisateur : utilisez InstalledAppFlow et stockez token.json ; renouvellement automatique lors des exécutions suivantes
  • Compte de service : chargez la clé JSON et appelez .with_subject(user_email) pour la délégation
  • Portées : demandez le minimum nécessaire (gmail.readonly, gmail.send, calendar.events)
  • Créez le service avec build('gmail', 'v1', credentials=creds)
  • Interceptez HttpError pour les erreurs d’API ; réessayez en cas de 429/503
  • Ne validez jamais les fichiers d’identifiants ; utilisez des variables d’environnement en production

Questions Fréquemment Posées

La leçon « Se connecter à Gmail via l’API » est-elle gratuite ?

Oui — le texte complet de « Se connecter à Gmail via l’API » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Se connecter à Gmail via l’API » ?

Bibliothèque cliente Google API, consentement OAuth2 et sélection de la portée Gmail. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Agents ?

Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Se connecter à Gmail via l’API » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?

Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Se connecter à Gmail via l’API
  2. Lire et envoyer des e-mails par programmation
  3. Créer et interroger des événements d’agenda
  4. Créer un assistant e-mail simple sous forme d’agent
← Retour à AI Agents