0Pricing
AI Agents · Lektion

Über die API mit Gmail verbinden

Google-API-Clientbibliothek, OAuth2-Einwilligung und Auswahl der Gmail-Scopes.

Über die API mit Gmail verbinden ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

Warum die Gmail API statt SMTP verwenden?

Die herkömmliche E-Mail-Automatisierung verwendet SMTP/IMAP, aber die Gmail API bietet deutlich mehr: Threads lesen, nach Suchanfragen suchen, Labels verwalten und mit vollständiger Authentifizierung senden. Außerdem unterstützt sie OAuth 2.0, sodass Ihr Agent kein Passwort speichert – sondern nur ein Zugriffstoken mit begrenztem Gültigkeitsbereich.

Die Gmail API ist Teil der Google Workspace APIs und wird über die Bibliothek google-api-python-client angesprochen.

# 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')

Authentifizierung: Service Account oder User Auth

Für die Gmail API gibt es zwei Authentifizierungsansätze:

  • Service Account: am besten für Arbeitsbereiche und Organisationen mit domainweiter Delegierung; keine Benutzerinteraktion erforderlich
  • User OAuth (OAuth2 mit Einwilligungsbildschirm): für persönliche Gmail-Konten erforderlich; der Benutzer gewährt einmalig Zugriff, danach verwendet der Agent ein Refresh-Token

Für die meisten Automatisierungsaufgaben mit Agenten werden Service Accounts wegen ihrer Zuverlässigkeit bevorzugt.

# 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')

Struktur der OAuth2-Anmeldedaten im JSON-Format

Google stellt Anmeldedaten in einer JSON-Datei bereit, die Ihr Agent zur Authentifizierung lädt. Bei User OAuth handelt es sich um eine credentials.json-Datei, die aus der Google Cloud Console heruntergeladen wurde. Die Datei enthält Ihre Client-ID, Ihr Secret und die Weiterleitungs-URI – übertragen Sie sie niemals in die Versionsverwaltung.

# 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')

Gmail API-Scopes

OAuth-Scopes legen genau fest, worauf Ihr Agent zugreifen kann. Fordern Sie nur die benötigten Scopes an – das entspricht dem Prinzip der geringsten Berechtigungen. Die Gmail-Scopes reichen von schreibgeschütztem Zugriff bis hin zu vollständigem Zugriff.

  • gmail.readonly — alle E-Mails lesen
  • gmail.send — nur senden, nicht lesen
  • gmail.modify — lesen, senden und Labels ändern
  • gmail.compose — nur Entwürfe erstellen
# 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')

User OAuth: Authentifizierungsablauf bei der ersten Anmeldung

Wenn ein Benutzer den Agenten zum ersten Mal ausführt, öffnet dieser einen Browser, damit der Benutzer die Berechtigung erteilen kann. Der Agent speichert das daraus resultierende Token in token.json. Bei späteren Ausführungen lädt er das gespeicherte Token und aktualisiert es automatisch – eine Interaktion mit dem Browser ist nicht erforderlich.

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

Authentifizierung mit einem Service Account

Für automatisierte Agenten, die ohne Benutzerinteraktion ausgeführt werden, sind Service Accounts ideal. Der Agent authentifiziert sich mit einem privaten Schlüssel und übernimmt die Identität eines Google-Workspace-Benutzers über eine domainweite Delegierung. Kein Einwilligungsbildschirm, kein Browser – nur eine JSON-Schlüsseldatei.

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')

Gmail-Serviceobjekt erstellen

Sobald Sie über Anmeldedaten verfügen, verwenden Sie googleapiclient.discovery.build(), um das Gmail-Serviceobjekt zu erstellen. Dies ist die zentrale Schnittstelle für alle Aufrufe der Gmail API. Übergeben Sie den Dienstnamen 'gmail' und die 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'])

Calendar-Serviceobjekt erstellen

Dieselbe Einrichtung der Anmeldedaten funktioniert auch für Google Calendar. Erstellen Sie das Serviceobjekt einfach mit 'calendar' und 'v3'. Wenn Sie Gmail und Calendar in einem Agenten benötigen, erstellen Sie beide Services aus demselben Anmeldedatenobjekt.

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"]}')

Google-API-Fehler behandeln

Fehler der Google API werden als googleapiclient.errors.HttpError ausgelöst. Der Fehler enthält einen HTTP-Statuscode und einen JSON-Body mit den Fehlerdetails. Fangen Sie diesen Fehler immer ab und protokollieren Sie den Status sowie die Meldung zur Fehlersuche.

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

Google-API-Kontingente und Ratenbegrenzungen

Die Gmail API verfügt über Nutzungskontingente: Standardmäßig stehen 1 Milliarde Kontingenteinheiten pro Tag zur Verfügung, wobei jeder Aufruf je nach Vorgang 1 bis 100 Einheiten kostet. Das Lesen von Nachrichten kostet mehr als das Auflisten. Verwenden Sie Batch-Anfragen und exponentielles Backoff bei 429- oder 503-Fehlern, um die Kontingente einzuhalten.

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')

Anmeldedaten sicher speichern

Übertragen Sie token.json, credentials.json oder service-account.json niemals in die Versionsverwaltung. Fügen Sie sie zu .gitignore hinzu. Speichern Sie die JSON-Datei des Service Accounts in der Produktion in einer Umgebungsvariablen oder einem Secrets Manager und laden Sie sie zur Laufzeit.

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')

Schnelltest: Service Account oder User OAuth

Testen Sie Ihr Verständnis der Authentifizierungsmethoden der Gmail API.

Zusammenfassung: Verbindung mit der Gmail API

Sie können nun einen Agenten mit Gmail verbinden:

  • User OAuth: InstalledAppFlow verwenden und token.json speichern; bei späteren Ausführungen automatisch aktualisieren
  • Service Account: JSON-Schlüssel laden und für die Delegierung .with_subject(user_email) aufrufen
  • Scopes: das erforderliche Minimum anfordern (gmail.readonly, gmail.send, calendar.events)
  • Den Service mit build('gmail', 'v1', credentials=creds) erstellen
  • HttpError für API-Fehler abfangen; bei 429/503 wiederholen
  • Anmeldedatendateien niemals übertragen – in der Produktion Umgebungsvariablen verwenden

Häufig gestellte Fragen

Ist die Lektion „Über die API mit Gmail verbinden“ kostenlos?

Ja — der vollständige Text von „Über die API mit Gmail verbinden“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Über die API mit Gmail verbinden“?

Google-API-Clientbibliothek, OAuth2-Einwilligung und Auswahl der Gmail-Scopes. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Agents zu starten?

Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Über die API mit Gmail verbinden“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?

Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Über die API mit Gmail verbinden
  2. E-Mails programmgesteuert lesen und senden
  3. Kalenderereignisse erstellen und abfragen
  4. Einen einfachen E-Mail-Assistenten als Agent erstellen
← Zurück zu AI Agents