Issue with Gmail Storage Cleanup
I hit my Gmail storage limit and need to clean up old messages. The web interface only lets me remove about 100 messages at once which takes forever.
I’m trying to build a Python script using Gmail API to remove messages older than 2 weeks. I set up OAuth in Google Cloud Console but getting permission errors.
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import pickle
import os
from datetime import datetime, timedelta
import logging
logging.basicConfig(level=logging.INFO)
API_SCOPES = ['https://www.googleapis.com/auth/gmail.modify']
def authenticate_gmail():
credentials = None
if os.path.exists('auth_token.pickle'):
with open('auth_token.pickle', 'rb') as file:
credentials = pickle.load(file)
if not credentials or not credentials.valid:
if credentials and credentials.expired and credentials.refresh_token:
credentials.refresh(Request())
else:
auth_flow = InstalledAppFlow.from_client_secrets_file(
'client_secrets.json', API_SCOPES)
credentials = auth_flow.run_local_server(port=0)
with open('auth_token.pickle', 'wb') as file:
pickle.dump(credentials, file)
return credentials
def check_permissions(credentials):
if credentials and credentials.scopes:
logging.info(f"Available scopes: {credentials.scopes}")
needed_scopes = set(API_SCOPES)
current_scopes = set(credentials.scopes)
if needed_scopes.issubset(current_scopes):
logging.info("Permission check passed")
else:
missing = needed_scopes - current_scopes
logging.error(f"Missing permissions: {missing}")
def cleanup_old_messages(gmail_service, test_mode=False):
try:
cutoff_date = (datetime.now() - timedelta(days=14)).strftime('%Y/%m/%d')
search_query = f'in:inbox before:{cutoff_date}'
all_messages = []
result = gmail_service.users().messages().list(userId='me', q=search_query).execute()
if 'messages' in result:
all_messages.extend(result['messages'])
while 'nextPageToken' in result:
result = gmail_service.users().messages().list(
userId='me', q=search_query, pageToken=result['nextPageToken']).execute()
all_messages.extend(result['messages'])
logging.info(f"Found {len(all_messages)} messages to process")
if test_mode:
logging.info("Test mode active - no actual deletion")
return
for message in all_messages:
try:
gmail_service.users().messages().delete(userId='me', id=message['id']).execute()
logging.info(f"Removed message: {message['id']}")
except Exception as error:
logging.error(f"Failed to remove message {message['id']}: {error}")
except Exception as error:
logging.error(f"Cleanup process failed: {error}")
def run_cleanup():
creds = authenticate_gmail()
check_permissions(creds)
service = build('gmail', 'v1', credentials=creds)
cleanup_old_messages(service)
if __name__ == '__main__':
run_cleanup()
I keep getting 403 errors saying insufficient permissions even though I’m using the modify scope. Do I need to publish this app or is there another way to get deletion permissions for personal use?