Stockage saturé ? 5 Scripts Python efficaces pour nettoyer Gmail
> ./index (Table des matières)
- 1. L'interface graphique Gmail.
- 2. Configuration
- 3. Script 1 : Suppression de masse
- 4. Script 2 : Désabonnement automatique
- 5. Script 3 : Le tri par Intelligence Artificielle
- 6. Script 4 : Détecter les emails lourd en données.
- 7. Script 5 : Extraction Slack
- 8. Comment automatiser cela ?
- Conclusion : Reprenez l'Avantage Tactique
Vous payez probablement 1,99 € par mois à Google pour stocker des newsletters que vous n'avez jamais ouvertes, c'est une taxe sur la flemme numérique, un racket organisé qui m'énerve au plus haut point.
Votre boîte de réception affiche 14 500 emails non lus, votre barre de stockage clignote en rouge cramoisi, et les algorithmes vous harcèlent pour passer au forfait supérieur. En tant que support technique, je passe énormément de temps sur mes journée à troubleshoot des erreurs APIs, et je vous garantis une chose : l'interface web de Gmail est délibérément conçue pour vous retenir captif et vous faire perdre un temps précieux.
Le bouton "Tout sélectionner" est une illusion, il ne charge que 50 ou 100 éléments à la fois. Si vous souhaitez purger 50 000 mails d'un coup, vous allez devoir cliquer 500 fois en plus de subir les temps de chargement et prier pour que le navigateur ne s'effondre pas sous le poids du cache.
Trier ses mails à la main en 2026, c'est accepter de perdre sa journée. Vous n'avez pas besoin d'être un génie de l'informatique pour reprendre la main : un simple copier-coller suffit pour effacer des années de pollution numérique.
Laissez tomber les extensions Chrome qui siphonnent vos données en douce, on va faire ça à l'ancienne.
Voici 5 scripts Python pour nettoyer Gmail qui tournent en local, sur votre propre machine.

1. L'interface graphique Gmail.
L'interface graphique (GUI) de Gmail n'a pas été programmée pour la suppression massive.
Elle est calibrée pour afficher des publicités ciblées et capter votre attention. Lorsque vous tentez de supprimer 5 000 e-mails simultanément via votre navigateur web, vous déclenchez une requête asynchrone lourde qui finit inévitablement par un timeout silencieux.
Le navigateur doit calculer le rendu visuel, charger les trackers... Bref, c'est une usine à gaz!
L'API Gmail, en revanche, est un passe-partout systémique, un accès direct et non filtré aux serveurs de base de données de Google. Là où l'interface humaine vous limite artificiellement, un script Python exécute des purges par milliers en quelques secondes grâce aux requêtes par lots (batch requests).
Vous contournez donc les limitations de l'interface graphique et parlez le langage des machines.
C'est la différence entre vider l'océan avec une petite cuillère et ouvrir les vannes d'un barrage.
2. Configuration
N'ayez pas peur du terminal, ce n'est qu'une interface texte dépourvue des distractions corporatives. Si vous savez écrire une formule Excel, vous savez exécuter un script Python.
Étape 1 : Le Moteur (Python)
Allez sur python.org et téléchargez la dernière version stable. TRÈS IMPORTANT : Lors de l'installation sous Windows, cochez impérativement la case "Add Python to PATH". C'est ce qui permet à votre système de reconnaître les commandes.
Pour plus de détails sur ce sujet, je vous invite à consulter mon guide Comment installer Python sous Mac et Windows.
Étape 2 : Le Terminal
Sur Windows, faites Windows + R, tapez cmd et validez.
Sur Mac, faites Cmd + Espace, tapez Terminal, puis tapez python --version. Si un numéro s'affiche, le moteur tourne.
Étape 3 : OAuth 2.0
L'époque du bricolage avec votre mot de passe en clair est terminée depuis les mises à jour de sécurité de 2025. Nous allons donc créer un jeton d'accès sécurisé (OAuth 2.0).
- Connectez-vous à la Google Cloud Console.
- Créez un "Projet" (nommez-le "Operation-Scorched-Earth").
- Dans la barre de recherche, trouvez l'API "Gmail API" et activez-la.
- Accédez à "Identifiants" (Credentials) > "Créer des identifiants" > "ID client OAuth".
- Sélectionnez "Application de bureau".
- Téléchargez le fichier JSON obtenu. Renommez-le exactement
credentials.json. - Placez ce fichier dans un nouveau dossier sur votre bureau appelé
bunker_gmail.
La première fois que vos scripts s'exécuteront, une page web s'ouvrira pour vous demander l'autorisation, créant un fichier token.json local. Ne partagez jamais ces fichiers.
J'ai également crée un guide détaillé sur Comment obtenir vos identifiants Gmail Oauth 2.0
Étape 4 : Bibliothèques Python
Dans votre terminal, injectez les bibliothèques Python nécessaires avec cette commande :
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib requests

3. Script 1 : Suppression de masse
L'API Gmail limite la suppression à 1000 e-mails par appel, et sa fonction de recherche ne renvoie que des petits lots de messages. Si vous souhaitez supprimer 50 000 mails de l'onglet "Promotions", un script basique va s'arrêter au bout de 100 mails.
Mon script inclut un mécanisme de pagination : il aspire tous les identifiants existants, puis les exécute par rafales de 1000 pour contourner les radars de Google.
Créez un fichier clean_batch.py dans votre dossier et collez ceci :
import os.path
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
# Autorisation maximale de modification
SCOPES = ['https://mail.google.com/']
def get_service():
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 build('gmail', 'v1', credentials=creds)
def scorched_earth_promotions():
service = get_service()
# Cible : Onglet Promotions, plus vieux qu'un an
query = 'category:promotions older_than:1y'
try:
print(">> Scan des archives en cours. Cela peut prendre un instant...")
messages =
# Pagination : Récupère les messages jusqu'à épuisement
request = service.users().messages().list(userId='me', q=query, maxResults=500)
while request is not None:
response = request.execute()
messages.extend(response.get('messages',))
request = service.users().messages().list_next(previous_request=request, previous_response=response)
if not messages:
print(">> La zone est déjà propre.")
return
print(f">> {len(messages)} fantômes verrouillés. Exécution de la purge...")
ids_to_delete = [msg['id'] for msg in messages]
# Découpage en rafales de 1000 (Limite stricte de l'API)
for i in range(0, len(ids_to_delete), 1000):
batch = ids_to_delete[i:i + 1000]
service.users().messages().batchDelete(
userId='me',
body={'ids': batch}
).execute()
print(f" -> Salve envoyée : {len(batch)} e-mails incinérés.")
print(">> Nettoyage terminal terminé avec succès.")
except HttpError as error:
print(f" Le système a rejeté la requête: {error}")
if __name__ == '__main__':
scorched_earth_promotions()
Lancez le script via le terminal avec python clean_batch.py et regardez vos gigaoctets occupés fondre en temps réel.
4. Script 2 : Désabonnement automatique
Vous êtes abonné à des newsletters inutiles? Plutôt que de cliquer manuellement sur "Se désabonner" dans chaque mail, ce script scanne les en-têtes cachées (Headers) de vos e-mails récents pour traquer la balise standard List-Unsubscribe.
Il identifie les "pollueurs" et leur applique silencieusement un label "A_DESABONNER".
Créez unsubscribe_scan.py :
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
SCOPES = ['https://mail.google.com/']
def label_newsletters():
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
service = build('gmail', 'v1', credentials=creds)
try:
label_body = {'name': 'A_DESABONNER', 'labelListVisibility': 'labelShow', 'messageListVisibility': 'show'}
created_label = service.users().labels().create(userId='me', body=label_body).execute()
label_id = created_label['id']
except Exception:
labels = service.users().labels().list(userId='me').execute()
label_id = next(l['id'] for l in labels['labels'] if l['name'] == 'A_DESABONNER')
print(">> Déploiement du radar sur les 30 derniers jours...")
results = service.users().messages().list(userId='me', q='is:unread newer_than:30d', maxResults=100).execute()
messages = results.get('messages',)
count = 0
for msg in messages:
txt = service.users().messages().get(userId='me', id=msg['id'], format='metadata').execute()
headers = txt['payload']['headers']
if any(h['name'] == 'List-Unsubscribe' for h in headers):
service.users().messages().modify(userId='me', id=msg['id'], body={'addLabelIds': [label_id]}).execute()
count += 1
print(f">> Analyse terminée. {count} parasites identifiés dans le dossier 'A_DESABONNER'.")
if __name__ == '__main__':
label_newsletters()

5. Script 3 : Le tri par Intelligence Artificielle
Les filtres Gmail classiques basés sur des mots-clés sont obsolètes.
En 2026, on utilise l'IA pour analyser la sémantique, mais attention : envoyer vos e-mails professionnels à l'API d'OpenAI est une violation flagrante de confidentialité et une hérésie de sécurité.
Nous allons donc utiliser une IA locale (comme Ollama faisant tourner le modèle Mistral ou Llama sur votre machine). De ce fait, vos données ne quitteront jamais votre disque dur.
Installez Ollama (ollama.com), lancez-le, et créez local_ai_sorter.py :
import requests
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
def analyze_with_local_ai(text):
# Appel à votre modèle local (aucune donnée n'est envoyée sur Internet)
url = "http://localhost:11434/api/generate"
prompt = f"Analyse cet e-mail. Réponds STRICTEMENT par le mot 'URGENT' ou 'POUBELLE'. Email: {text[:500]}"
data = {
"model": "mistral",
"prompt": prompt,
"stream": False
}
try:
response = requests.post(url, json=data)
return response.json().get("response", "").strip()
except Exception:
return "ERREUR_SERVEUR_LOCAL"
def smart_sort():
creds = Credentials.from_authorized_user_file('token.json', ['https://www.googleapis.com/auth/gmail.readonly'])
service = build('gmail', 'v1', credentials=creds)
results = service.users().messages().list(userId='me', maxResults=5).execute()
messages = results.get('messages',)
print(">> Interrogation de l'IA locale en cours...")
for msg in messages:
message = service.users().messages().get(userId='me', id=msg['id'], format='full').execute()
content = message.get('snippet', '')
decision = analyze_with_local_ai(content)
print(f"Message ID {msg['id']} -> Verdict IA : {decision}")
if __name__ == '__main__':
smart_sort()
6. Script 4 : Détecter les emails lourd en données.
Le texte ne pèse rien, ce qui sature vos 15 Go gratuits, ce sont les PowerPoints de 40 Mo que le management vous envoie en boucle. Malheureusement, la conception technique des e-mails rend impossible la suppression de la pièce jointe seule (le message est immuable).
La tactique? On repère le mail lourd en données, on logue son existence, et on s'apprête à l'éliminer.
Créez heavy_cleaner.py :
import csv
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
def find_heavy_emails():
creds = Credentials.from_authorized_user_file('token.json', ['https://mail.google.com/'])
service = build('gmail', 'v1', credentials=creds)
print(">> Traque des e-mails massifs (>10 Mo)...")
results = service.users().messages().list(userId='me', q='larger:10M').execute()
messages = results.get('messages',)
with open('cibles_lourdes.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow()
for msg in messages:
m = service.users().messages().get(userId='me', id=msg['id'], format='metadata').execute()
headers = m['payload']['headers']
subject = next((h['value'] for h in headers if h['name'] == 'Subject'), 'Sans sujet')
date = next((h['value'] for h in headers if h['name'] == 'Date'), 'Inconnue')
size_mb = int(m['sizeEstimate']) / (1024 * 1024)
writer.writerow([msg['id'], subject, date, f"{size_mb:.2f} MB"])
print(f" {subject} -> {size_mb:.2f} MB")
print(">> Rapport 'cibles_lourdes.csv' généré. Vérifiez avant d'ordonner la frappe.")
if __name__ == '__main__':
find_heavy_emails()

7. Script 5 : Extraction Slack
La productivité silencieuse, c'est de ne plus ouvrir sa boîte mail du tout.
Ce script extrait les e-mails cruciaux et les pousse directement sur votre messagerie d'équipe (Slack, Discord) via un Webhook.
Vous avez l'air d'être réactif, alors que l'automatisation fait le pont à votre place.
import requests
import json
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
SLACK_WEBHOOK_URL = "VOTRE_WEBHOOK_SLACK_ICI"
def daily_digest():
creds = Credentials.from_authorized_user_file('token.json', ['https://www.googleapis.com/auth/gmail.readonly'])
service = build('gmail', 'v1', credentials=creds)
results = service.users().messages().list(userId='me', q='is:unread newer_than:1d').execute()
messages = results.get('messages',)
if not messages:
requests.post(SLACK_WEBHOOK_URL, json={"text": ">> Bunker sécurisé. Aucun nouveau message."})
return
report = "📡 *Interception des Communications du Jour* :\n"
for msg in messages[:5]:
m = service.users().messages().get(userId='me', id=msg['id'], format='metadata').execute()
headers = m['payload']['headers']
subject = next((h['value'] for h in headers if h['name'] == 'Subject'), 'No Subject')
sender = next((h['value'] for h in headers if h['name'] == 'From'), 'Unknown').split('<')
report += f"• *{sender.strip()}* : {subject}\n"
requests.post(SLACK_WEBHOOK_URL, json={"text": report})
print(">> Transmission furtive envoyée.")
if __name__ == '__main__':
daily_digest()

8. Comment automatiser cela ?
Exécuter ces scripts à la main est une insulte au concept d'automatisation, le véritable but est que la machine travaille pendant que vous dormez ou que vous faites semblant d'être en réunion.
Sur Windows (Le Planificateur)
Ouvrez le "Planificateur de tâches" natif de Windows, puis créez une tâche basique déclenchée "Tous les jours" à 03h00 du matin.
Dans l'action, pointez vers votre exécutable Python (python.exe) et passez en argument le nom de votre script (clean_batch.py).
Votre ordinateur fera le ménage seul.
L'Approche Raspberry Pi & Cron
Les puristes de "L'Automatiste" feront tourner ça sur un Raspberry Pi planqué derrière la box internet, via un cron job. C'est l'approche "Set and Forget".
Une fois configuré, vous reprenez définitivement le contrôle sur votre temps de cerveau disponible.
Conclusion : Reprenez l'Avantage Tactique
Google compte sur votre résignation pour vous facturer du stockage cloud, en utilisant ces scripts Python, vous brisez la chaîne. Vous pouvez commencer par le script de désabonnement, puis, quand vous serez en confiance, lancez le script de suppression.
Votre boîte mail n'est plus votre supérieure hiérarchique ; c'est un simple flux de données que vous domptez désormais par des lignes de commandes..
> Base_de_Données_FAQ
Q: Est-ce que ces scripts Python fonctionnent avec un compte Gmail gratuit ?
Q: J'ai une erreur 'Less Secure Apps' quand je lance mon script, que faire ?
Q: Est-ce risqué d'utiliser un script pour supprimer des emails ?
Q: Combien d'emails puis-je supprimer par jour avec l'API ?
Q: Faut-il savoir coder pour utiliser ces outils ?
Rejoignez la Résistance.
Recevez le Pack de Survie Office + 1 astuce d'automatisation par semaine.
Données protégées. Zéro spam.
Jérémy
J'ai passé 6 ans dans le Support Technique à résoudre des cas complexes. Maintenant, je montre aux employés de bureau comment gagner du temps avec Python et Google Suite.
@Twitter