Guide

Gmail API Pagination und Sync erklärt

Die REST-API von Gmail verlangt, dass Sie Pagination-Tokens, History-IDs und partiellen Sync-Status selbst verwalten. Dieser Guide erklärt, wie nextPageToken und historyId funktionieren — mit lauffähigem Code für jedes Muster. Funktioniert mit den unterstützten Providern.

Written by Prem Keshari Senior SRE

Reviewed by Nick Barraclough

VerifiedCLI 3.1.1 · Gmail · last tested May 14, 2026

Wie funktionieren nextPageToken und maxResults in der Gmail API?

Der Gmail-API-Parameter maxResults steuert, wie viele Nachrichten-IDs users.messages.list pro Seite zurückgibt — maximal 500. Gibt es weitere passende Nachrichten, enthält die Antwort ein nextPageToken. Übergeben Sie dieses Token in der nächsten Anfrage als pageToken, bis die Antwort kein weiteres Token mehr enthält.

Für die häufige Suchanfrage gmail api nextPageToken maxResults lautet die Kernregel: maxResults ist nur die Seitengröße, nicht das Gesamtlimit der Ergebnisse. Ein Postfach mit 10.000 passenden Nachrichten erfordert weiterhin wiederholte Anfragen, Token-Persistenz, Retry-Handling und einen zweiten messages.get-Aufruf für jeden Nachrichtentext.

Wie die Gmail-API-Pagination funktioniert

Die Gmail-API-Pagination verteilt große Ergebnismengen auf mehrere HTTP-Antworten, von denen jede ein nextPageToken enthält, das der Aufrufer zurückgeben muss, um den nächsten Batch abzurufen. Der Endpoint messages.list liefert maximal 500 Ergebnisse pro Anfrage — ein Posteingang mit 10.000 Nachrichten benötigt also mindestens 20 sequenzielle API-Aufrufe, um vollständig durchgeblättert zu werden.

Laut der Gmail-API-Dokumentation zu messages.list kostet jeder Aufruf 5 Quota-Einheiten, und die Standard-Seitengröße beträgt 100 (über maxResults bis 500 konfigurierbar). Jede Anfrage erfordert ein gültiges OAuth2-Access-Token. Die Schleife unten zeigt dieses Muster in Python — sie ruft messages.list wiederholt auf, sammelt Nachrichten-IDs und bricht ab, sobald nextPageToken fehlt:

from googleapiclient.discovery import build

service = build("gmail", "v1", credentials=creds)

all_messages = []
page_token = None

while True:
    response = service.users().messages().list(
        userId="me",
        maxResults=500,
        pageToken=page_token,
    ).execute()

    all_messages.extend(response.get("messages", []))
    page_token = response.get("nextPageToken")

    if not page_token:
        break

print(f"Fetched {len(all_messages)} message IDs")

Das sind 18 Zeilen, nur um Nachrichten-IDs zu sammeln. Sie müssen weiterhin für jede ID messages.get aufrufen, um Betreffzeilen, Absender und Nachrichtentexte zu laden — jeder dieser Aufrufe kostet nach der aktuellen Gmail-Quota-Tabelle weitere 20 Quota-Einheiten.

Wie die inkrementelle Gmail-Synchronisierung funktioniert

Die inkrementelle Gmail-Synchronisierung verfolgt Postfachänderungen über eine monoton steigende historyId, sodass Sie nur abrufen, was sich seit Ihrem letzten Sync geändert hat. Eine vollständige Re-Pagination eines Posteingangs mit 10.000 Nachrichten kostet allein in messages.list-Aufrufen mindestens 100 Quota-Einheiten — der Endpoint history.list existiert, um diesen Overhead zu vermeiden, indem er nur neue, gelöschte oder umetikettierte Nachrichten zurückgibt.

Sie speichern die historyId Ihres letzten Syncs. Beim nächsten Lauf rufen Sie history.list mit startHistoryId auf und erhalten nur die seitdem angefallenen Änderungen. Der Gmail-Sync-Guide empfiehlt dies als primären Ansatz, um eine lokale Kopie synchron zu halten. Mit dem Parameter historyTypes filtern Sie nach Änderungstyp: messageAdded, messageDeleted, labelAdded und labelRemoved. Jeder history.list-Aufruf kostet 2 Quota-Einheiten — 60 % günstiger als ein messages.list-Aufruf mit 5 Einheiten. Die Python-Funktion unten durchläuft paginierte History-Einträge, sammelt Änderungen und gibt die neueste historyId für Ihren nächsten Sync zurück:

def get_changes_since(service, start_history_id):
    """Fetch all mailbox changes since the given historyId."""
    changes = []
    page_token = None

    while True:
        response = service.users().history().list(
            userId="me",
            startHistoryId=start_history_id,
            historyTypes=["messageAdded", "messageDeleted"],
            pageToken=page_token,
        ).execute()

        changes.extend(response.get("history", []))
        page_token = response.get("nextPageToken")

        if not page_token:
            break

    new_history_id = response.get("historyId")
    return changes, new_history_id

Es gibt einen Haken: History-IDs laufen nach etwa 30 Tagen ab. Ist Ihre gespeicherte historyId zu alt, gibt history.list ein 404 Not Found (gelegentlich auch 410 Gone) zurück, und Sie müssen auf einen vollständigen Sync ausweichen. Ihr Code muss beide Pfade abdecken.

Die Probleme beim Selberbauen

Einen produktionsreifen Gmail-Sync-Client zu bauen bedeutet, den OAuth2-Token-Lebenszyklus, den Fallback bei abgelaufener History, Rate Limiting und partielle Fehler zu behandeln — alles in Code, den Sie selbst pflegen. Was als 20-zeilige Pagination-Schleife beginnt, wächst auf 80-120 Zeilen, sobald Sie Token-Refresh-Callbacks, exponentielles Backoff für 429-Antworten und zwei Codepfade für Delta- vs. Voll-Sync ergänzen. Die Sonderfälle häufen sich:

  • OAuth2-Token-Management — Gmail-Access-Tokens laufen alle 3.600 Sekunden ab. Ihre Sync-Schleife muss abgelaufene Tokens erkennen, sie über das Refresh-Token erneuern und die fehlgeschlagene Anfrage wiederholen. Das bedeutet: ein Token-Refresh-Callback, Fehlerbehandlung und Retry-Logik.
  • Fallback bei abgelaufener historyId — Gibt history.list 404 zurück, müssen Sie den Delta-Sync verwerfen und stattdessen einen vollständigen Pagination-Sync fahren. Zwei Codepfade, beide müssen korrekt funktionieren.
  • Rate Limiting — Neue Gmail-API-Projekte erhalten 6.000 Quota-Einheiten pro Minute, pro Nutzer und Projekt. Ein messages.list-Aufruf kostet 5 Einheiten, ein messages.get 20 Einheiten und ein history.list 2 Einheiten. Wer ein großes Postfach synchronisiert, braucht clientseitiges Throttling und exponentielles Backoff bei 429 Too Many Requests.
  • Partielle Seitenfehler — Ein Netzwerkfehler mitten in der Pagination bedeutet, dass Sie nur die Hälfte der Ergebnisse haben. Wiederholen Sie von vorn oder ab dem letzten Page-Token? Sie müssen den Zustand mitführen.
  • Setup-Aufwand für die Gmail API — Bevor Sie auch nur eine Zeile Code gegen die Gmail API schreiben, brauchen Sie ein Google-Cloud-Projekt, einen OAuth-Consent-Screen, Client-ID und -Secret sowie eine in console.cloud.google.com konfigurierte Redirect-URI. Das sind 15-20 Minuten Klickarbeit in Webformularen.

Eine zuverlässige Sync-Schleife, die alle fünf Punkte abdeckt, umfasst 80-120 Zeilen Python — noch ohne Logging, Persistenz oder Multi-Account-Unterstützung.

Gmail-Pagination steht meist neben angrenzenden Integrationsaufgaben: Kalender-Event-Sync, providerneutrales Auflisten des Posteingangs, Webhook-Zustellung, API-Quota-Planung und agentensicherer E-Mail-Zugriff. Nutzen Sie diese Übersicht, wenn Sie einen spezifischeren Implementierungspfad brauchen.

BedarfPassender GuideInhalt
Kalender-PaginationGoogle-Calendar-API-Paginationevents.list, nextPageToken, syncToken und Sync wiederkehrender Termine
Posteingang auflisten ohne Gmail-API-SetupGmail-E-Mails von der Kommandozeile auflistenSuche, Filter, JSON-Ausgabe, OAuth-Setup und Posteingangszugriff vom Terminal
Beispiele für SuchanfragenBeispiele für Gmail-API-Suchanfragenq, Labels, Kategorien, Datumsfilter, Anhänge und rfc822msgid
Agentensichere API-WahlE-Mail-APIs für KI-Agenten im VergleichGmail, Microsoft Graph, IMAP und providerneutrale API-Abwägungen für Agenten
Fehlermodi der Gmail APIWarum die Gmail API KI-Agenten ausbremstOAuth-Prompts, Pagination-Status, Quota-Druck und MIME-Parsing-Risiken
Quota-PlanungGmail-API-Quotas 2026Methodenkosten, Projektlimits, Pro-Nutzer-Limits und Retry-Planung
Ereignisgesteuerter SyncE-Mail-Webhooks lokal testenLokaler Webhook-Receiver, Tunnel-Tests, Beispiel-Payloads und Signaturprüfungen

Gmail-E-Mails mit einem Befehl auflisten

Nylas CLI ersetzt den gesamten Pagination-und-Sync-Stack durch einen einzigen Terminalbefehl, der OAuth2-Token-Refresh, Rate Limiting und das Abrufen mehrerer Seiten intern erledigt. Wo der Gmail-API-Weg 80-120 Zeilen Python und 15-20 Minuten Gmail-API-Setup in Google Cloud erfordert, reduziert das CLI das auf eine Zeile und eine 2-minütige Installation.

Die folgenden drei Befehle zeigen gängige Muster: aktuelle Nachrichten auflisten, nach Betreff filtern und nach Absender filtern. Jeder führt unter der Haube einen einzigen API-Aufruf aus, während das CLI die Pagination über die Provider-Antworten hinweg verwaltet:

# List the 50 most recent emails
nylas email list --limit 50 --json
# Filter by subject
nylas email search "invoice" --json
# Filter by sender
nylas email list --from "boss@company.com" --json

Das CLI paginiert im Hintergrund durch die Gmail API, erneuert abgelaufene OAuth2-Tokens automatisch und liefert die Ergebnisse als JSON. Kein Gmail-API-Projekt zu registrieren, kein Consent-Screen, keine Redirect-URI. Neu beim CLI? Der Erste-Schritte-Guide behandelt Installation und erste Authentifizierung.

Suchen und filtern

Nylas CLI unterstützt Volltextsuche und Filter auf Feldebene, die auf denselben Gmail-Parameter q abbilden, den auch messages.list verwendet — aber ohne Pagination-Schleife oder OAuth2-Verdrahtung. Die Gmail API benötigt mindestens 3 sequenzielle API-Aufrufe, um zu suchen, zu paginieren und Nachrichtentexte zu laden — das CLI verdichtet das zu einem einzigen Befehl.

Die drei Beispiele unten decken die häufigsten Suchmuster ab: Stichwortsuche, Filtern nach ungelesenen Nachrichten und Filtern nach Zeitraum. Datumsfilter liegen bei nylas email search als --after und --before vor; sie nehmen Daten im Format YYYY-MM-DD entgegen und akzeptieren "*" als Alles-Treffer-Query. Jedes Beispiel liefert vollständiges Nachrichten-JSON inklusive Betreff, Absender und Nachrichtentext:

# Full-text search
nylas email search "quarterly report" --json
# Unread emails only
nylas email list --unread --json
# Emails received in the last 7 days
nylas email search "*" --after 2026-06-02 --json

Das Gmail-API-Äquivalent verlangt, den Query-String zu bauen, ihn an messages.list zu übergeben, mit nextPageToken durch die Ergebnisse zu paginieren und für jede zurückgegebene Nachrichten-ID messages.get aufzurufen, um Betreff und Text zu erhalten. Das sind 4 Schritte und mindestens 10 Quota-Einheiten pro Seite.

Nachrichteninhalte lesen, nicht nur IDs

Der Gmail-API-Endpoint messages.list gibt ausschließlich Nachrichten-IDs zurück — nie Betreff, Absender oder Text. Um echte Inhalte zu lesen, rufen Sie für jede gesammelte ID messages.get auf, und jeder Aufruf kostet weitere 20 Quota-Einheiten. Nach dem Durchblättern von 10.000 Nachrichten machen Sie 10.000 weitere API-Aufrufe mit insgesamt 200.000 Quota-Einheiten — das verbraucht unter dem Pro-Nutzer-Projektlimit von 2026 mehr als 33 Nutzer-Minuten an Quota.

Das CLI fasst beide Schritte in einem Befehl zusammen. nylas email read <id> lädt eine einzelne Nachricht samt vollständigem Text in einem Aufruf. nylas email search führt eine serverseitige Suche aus und liefert passende Nachrichten mit Inhalt in derselben Antwort. Beide unterstützen über das globale Flag --format drei Ausgabemodi — table, json und yaml — mit --json als Kurzform für den JSON-Modus. Für die rohe RFC822-Quelle, die messages.get mit format=raw liefert, übergeben Sie --mime an nylas email read. Die JSON-Ausgabe lässt sich sauber in jq für die weitere Shell-Verarbeitung pipen.

# Read a single message
nylas email read 18b9a3f2cd47e102 --json

# Search and return full bodies in one round-trip
nylas email search "urgent" --from boss@example.com --json

Threads statt Nachrichten paginieren

Gmail organisiert Nachrichten in Konversations-Threads, und der Endpoint threads.list ist eine eigene paginierte Ressource neben messages.list. Ein Posteingang mit 10.000 Nachrichten löst sich je nach Konversationsdichte typischerweise in 2.000-4.000 Threads auf — das Auflisten von Threads senkt die Gesamtzahl der Seiten also um 60-80 %. Jede Thread-Antwort folgt demselben nextPageToken-Vertrag wie messages.list, plus einem threads[].messages[]-Array mit jeder Nachricht der Konversation.

Die Thread-Oberfläche im CLI spiegelt die Nachrichten-Oberfläche mit fünf Befehlen. nylas email threads list paginiert durch Threads. nylas email threads show lädt einen einzelnen Thread per ID. nylas email threads search nimmt einen Query-String im Gmail-Stil entgegen. nylas email threads mark ändert den Lesestatus aller Nachrichten im Thread auf einmal. nylas email threads delete löscht die gesamte Konversation.

# Paginate threads in pages of 50
nylas email threads list --limit 50 --json

# Mark a whole conversation as read in one command
nylas email threads mark <thread-id> --read

Innerhalb eines bestimmten Labels oder Ordners paginieren

Gmail organisiert Nachrichten über Labels — Systemlabels wie INBOX, SENT, STARRED, UNREAD, SPAM und TRASH plus nutzerdefinierte Labels. Microsoft Graph und IMAP-Provider verwenden stattdessen Ordner. Der Gmail-Endpoint messages.list akzeptiert ein labelIds-Array für Systemlabels oder den Parameter q mit einer Suchsyntax wie label:Receipts für eigene Labels. Pagination-Tokens tragen den Filterumfang mit, sodass ein auf ein Label eingegrenztes Archiv mit 50.000 Nachrichten proportional weniger Seiten liefert.

nylas email search akzeptiert --in, um eine Suche auf ein Label oder einen Ordner einzugrenzen — übergeben Sie "*" als Query, um jede Nachricht darin zu treffen. nylas email folders list liefert jedes Label bzw. jeden Ordner des verbundenen Kontos — dasselbe Flag funktioniert also für Gmail-Labels, Outlook-Ordner und IMAP-Ordnernamen ohne Syntaxänderung. Die Flag-Oberfläche des Suchbefehls umfasst außerdem --unread, --starred und --has-attachment.

# List every label or folder on the connected account
nylas email folders list --json

# Paginate only inside the Receipts label
nylas email search "*" --in Receipts --limit 100 --json

# Combine label scope with a query
nylas email search "stripe" --in Receipts --json

Über mehrere Konten hinweg paginieren

Produktive Sync-Clients verwalten oft mehrere verbundene Postfächer — Sales-Ops aggregiert vier geteilte Posteingänge, ein KI-Agent arbeitet auf fünf Nutzerkonten, ein CRM zieht E-Mail-Signale aus jedem Konto eines Workspace. Die Gmail API erzwingt Quota pro OAuth-Grant, daher funktioniert das parallele Synchronisieren von 10 Konten ohne kontenübergreifendes Throttling — aber der Anwendungscode muss 10 separate Refresh-Tokens, 10 Token-Ablauf-Timer und 10 historyId-Checkpoints verwalten.

Grants sind im CLI Bürger erster Klasse. nylas auth list zeigt jedes verbundene Konto. nylas auth whoami gibt aus, welchen Grant der nächste Befehl verwendet. nylas auth switch wechselt den aktiven Grant. E-Mail- und Kalenderbefehle nehmen zudem eine Grant-ID als optionales Positionsargument entgegen, sodass ein Shell-Skript über Grants iterieren kann, ohne den aktiven Zustand zu wechseln.

# Show every connected grant as JSON
nylas auth list --json

# Run the same sync across every Google grant
for grant in $(nylas auth list --json | jq -r '.[] | select(.provider == "google") | .id'); do
  nylas email search "*" "$grant" --after 2026-05-01 --json
done

Synchronisieren in CI, Cron-Jobs und Headless-Umgebungen

Das OAuth2-Browser-Pop-up der Gmail API ist ein harter Blocker in CI, Docker-Containern, KI-Agent-Sandboxes und jeder unbeaufsichtigten Umgebung. Googles Offline-Access-Flow verlangt, dass die Anwendung während eines einmaligen interaktiven Setups ein Refresh-Token erfasst, es in einem Secret Manager ablegt und programmatisch erneuert. Die empfohlene Alternative (ein Service-Konto mit Domain-Wide Delegation) ist Google-Workspace-Admins vorbehalten und erfordert eine Konfigurationsänderung auf Workspace-Ebene.

Nylas CLI umgeht den Browser vollständig per API-Key-Authentifizierung. nylas auth config --api-key speichert einen Schlüssel lokal, ohne einen Browser anzufassen. nylas auth token erzeugt ein gescoptes Bearer-Token für nachgelagerte API-Aufrufe. nylas auth status meldet den aktuellen Auth-Zustand — nützlich für Health-Checks in containerisierten Deployments.

# In a GitHub Action or cron job — no browser needed
export NYLAS_API_KEY="nyk_..."
nylas auth config --api-key "$NYLAS_API_KEY"
nylas email search "*" --after $(date -u -v-1d +%Y-%m-%d) --json > /var/log/digest.json

In Manus, Replit und ähnlichen KI-Agent-Sandboxes ohne Browser gilt derselbe Ablauf — der Agent richtet einmal einen Schlüssel ein, persistiert ihn in seiner Umgebung, und jeder weitere Befehl läuft ohne interaktive Schritte.

Webhooks statt Polling

Einen Gmail-Posteingang alle 5 Minuten abzufragen erzeugt 288 API-Aufrufe pro Tag und Posteingang. Über 1.000 verbundene Nutzer sind das 288.000 Aufrufe täglich, und die meisten liefern null neue Nachrichten. Gmail bietet als Push-Alternative Cloud Pub/Sub an: Sie erstellen ein Pub/Sub-Topic, geben gmail-api-push@system.gserviceaccount.com die Rolle pubsub.publisher, rufen für jedes Postfach users.watch auf und erneuern den Watch alle 7 Tage, weil Google ihn ablaufen lässt. Die Setup-Kosten sind hoch, und eine verpasste Erneuerung bricht den Sync stillschweigend.

Webhooks im CLI funktionieren ohne Pub/Sub-Topic. nylas webhook create registriert einen HTTPS-Endpoint und eine Liste von Triggern. nylas webhook list zeigt, was registriert ist. nylas webhook triggers gibt jeden unterstützten Ereignistyp aus (message.created, message.updated, thread.replied sowie Kalender- und Kontaktereignisse). nylas webhook test send feuert einen Beispiel-Payload auf Ihren Endpoint, damit Sie den Receiver vor dem Livegang validieren können. nylas webhook verify prüft die HMAC-Signatur eingehender Payloads.

# Register a webhook for new message events
nylas webhook create \
  --url https://example.com/hooks/nylas \
  --triggers message.created \
  --json

# Verify a payload from your receiver
nylas webhook verify \
  --payload-file ./incoming.json \
  --signature "$X_NYLAS_SIGNATURE" \
  --secret "$WEBHOOK_SECRET"

Webhooks feuern bei tatsächlichen Ereignissen — bei einem durchschnittlichen Nutzer typischerweise weniger als 100 pro Posteingang und Tag. Eine Polling-Last von 288.000 Aufrufen pro Tag schrumpft über dieselben 1.000 Posteingänge auf etwa 100.000 Ereignisse pro Tag, und die Latenz zwischen dem Eintreffen einer neuen Nachricht und ihrer Sichtbarkeit in der Anwendung sinkt von bis zu 5 Minuten auf etwa 1 Sekunde.

Wie andere E-Mail-Provider Pagination handhaben

Gmail ist nicht der einzige Provider mit einem Pagination-Vertrag, den man kennen sollte. Microsoft Graph (Outlook und Exchange Online) verwendet @odata.nextLink — eine vollständige URL, der der Client unverändert folgt. IMAP (Yahoo Mail, iCloud Mail, gehostetes IMAP) paginiert nicht im klassischen Sinn: UID SEARCH liefert jede passende UID in einer Antwort — das kann bei großen Postfächern langsam sein, erspart aber clientseitige Cursor-Logik. Exchange Web Services (EWS, bei älteren Exchange-Installationen) nutzt indexbasiertes Paging mit IndexedPageItemView und einem BasePoint-Offset.

ProviderPagination-MethodeCursor-TypMax. Seitengröße
Gmail APInextPageTokenOpaker String500
Microsoft Graph@odata.nextLinkVollständige URL1.000
IMAP (Yahoo, iCloud, gehostet)UID SEARCH + Fetch-RangesSequenznummernKein Seitenlimit
EWS (Legacy-Exchange)IndexedPageItemViewNumerischer Offset1.000

Provider-Guides führen durch dasselbe Pagination-Problem im jeweiligen Vertrag: Outlook-E-Mails von der Kommandozeile auflisten, Exchange-E-Mails auflisten, Yahoo-E-Mails auflisten, iCloud-E-Mails auflisten und IMAP-E-Mails auflisten. Derselbe Befehl nylas email list ist dafür dokumentiert, mit identischen Flags gegen jeden Provider zu laufen.

Das oben beschriebene Provider-Verhalten für Outlook, Exchange, Yahoo, iCloud und IMAP stammt aus der öffentlichen Dokumentation der jeweiligen Provider, nicht aus einem verifizierten End-to-End-Lauf auf jedem Backend. Testen Sie lokal, bevor Sie providerspezifische Workflows produktiv schalten.

Wie lange dauert das Synchronisieren eines Gmail-Posteingangs?

Synthetische Benchmarks gegen ein Testpostfach, ausgeführt über einen privaten Breitbandanschluss (~150 ms mediane Latenz zu Google-Servern), zeigen den Kostenunterschied zwischen manueller Pagination und einem einzigen CLI-Befehl. Die Spalte mit der Python-Schleife umfasst messages.list- + messages.get-Aufrufe mit exponentiellem Backoff bei 429-Antworten. Die CLI-Zahlen enthalten dieselben internen Aufrufe, gebündelt und parallelisiert.

PostfachgrößePython messages.list + messages.getNylas CLIGmail-Quota-Kosten
1.000 Nachrichten~12 Sek.~3 Sek.~6.000 Einheiten
10.000 Nachrichten~2 Min.~30 Sek.~60.000 Einheiten
50.000 Nachrichten~12 Min. (mit Backoff)~3 Min.~300.000 Einheiten
100.000 Nachrichten~25 Min. (mit Backoff)~6 Min.~600.000 Einheiten

Die Quota-Kosten sind durch Gmails Pro-Aufruf-Preise fixiert, nicht durch den Client. Das CLI kann einen messages.list-Aufruf nicht billiger machen — aber es hält Pagination und Retry-Verhalten aus Ihrem Anwendungscode heraus. Eine naive Python-Schleife, die 10.000 vollständige Nachrichtentexte lädt, gibt allein für messages.get-Aufrufe rund 200.000 Quota-Einheiten aus. Diese Zahlen im Blick zu behalten zählt bei der Planung eines frischen Voll-Syncs; siehe nylas email list für die Flags, die Batching und Parallelität steuern.

Häufige Rezepte

Vier Shell-Muster, die E-Mail-Pagination mit Standard-UNIX-Tools kombinieren. Jedes nutzt jq zum Parsen der JSON-Ausgabe und --json für maschinenlesbare Formatierung.

Alle ungelesenen E-Mails zählen

Pipen Sie nylas email list --unread --json durch jq 'length', um eine einzelne Zahl zu erhalten. Nützlich für geskriptete Dashboards oder Oncall-Alerts. Kombinieren Sie mit watch -n 60 für einen Live-Zähler, der sich jede Minute aktualisiert. Die JSON-Ausgabe wird automatisch paginiert — Sie müssen im Wrapper kein nextPageToken behandeln.

nylas email list --unread --json | jq 'length'

Tägliche Digest-Cron-Aufgabe

Ein Digest-Skript, das einmal täglich unter cron läuft, nutzt nylas email search mit --after, gebunden an das gestrige Datum, schreibt JSON in eine temporäre Datei und pipet eine einzeilige Zusammenfassung pro Nachricht in mail. Ersetzen Sie nylas auth login auf der Cron-Maschine durch nylas auth config --api-key, damit kein Browser nötig ist.

# /etc/cron.daily/email-digest.sh
yesterday=$(date -u -v-1d +%Y-%m-%d)
nylas email search "*" --after "$yesterday" --json > /tmp/digest.json
jq -r '.[] | "\(.from) - \(.subject)"' /tmp/digest.json \
  | mail -s "Daily digest" you@example.com

Jede E-Mail mit Anhang von einem bestimmten Absender finden

Verketten Sie nylas email search mit nylas email attachments list, um jeden Anhang eines Absenders in einer Pipeline zu finden. email search wendet die Filter --from und --has-attachment serverseitig an, dann zählt attachments list jeden Treffer auf. Pipen Sie in nylas email attachments download, wenn Sie die Dateien auf der Platte haben wollen.

nylas email search "*" --from billing@stripe.com --has-attachment --json \
  | jq -r '.[].id' \
  | xargs -I{} nylas email attachments list {} --json

OTP-Codes aus aktuellen Login-E-Mails automatisch extrahieren

Holen Sie jede login-bezogene E-Mail seit gestern, extrahieren Sie jede 6-stellige Zahl aus dem Text und geben Sie den ersten Treffer aus. Die Stichwortsuche verification erfasst den häufigsten Transaktionsbetreff; wiederholen Sie mit OTP oder code, um weitere Absender abzudecken. Für sich genommen ist das die Basis des eigenen OTP-Extraktions-Guides. Für Posteingangs-Analysen jenseits einfachen Zählens siehe nylas email ai analyze. PowerShell-Nutzer können diese Muster in PowerShell-E-Mail-Reports adaptieren.

nylas email search "verification" \
  --after "$(date -u -v-1d +%Y-%m-%d)" \
  --json \
  | jq -r '.[].body' \
  | grep -oE '[0-9]{6}' \
  | head -1

Direkter Vergleich

Die Tabelle unten vergleicht den Gmail-API-Ansatz in Python mit Nylas CLI über 9 produktionsrelevante Fähigkeiten. Der größte Unterschied ist die Setup-Zeit: Der Gmail-API-Pfad erfordert 15-20 Minuten Konsolen-Konfiguration plus 80-120 Zeilen Code, während das CLI in etwa 2 Minuten installiert und authentifiziert ist.

FähigkeitGmail API (Python)Nylas CLI
PaginationManuelle nextPageToken-SchleifeIntern erledigt
Inkrementeller Synchistory.list + historyId-TrackingIntern erledigt
AuthentifizierungGCP-Projekt + OAuth-Consent-Screen + Token-Refreshnylas auth login (einmalig)
Token-Ablauf3.600 s — manueller Refresh per CallbackAutomatischer Refresh
Rate Limits6.000 Einheiten/Min./Nutzer/Projekt für neue Projekte — manuelles Throttling + BackoffIntern verwaltet
Fehler-Recovery404, 410, 429 und Token-Fehler behandelnEingebaute Retry-Logik
Sucheq-Parameter + Pagination-Schleifenylas email search "query"
Setup-Zeit15-20 Min. (GCP-Konsole) + 80-120 Zeilen Code2 Min. Installation + Auth
Multi-ProviderNur GmailGmail, Outlook, Exchange, Yahoo, iCloud, IMAP

Häufig gestellte Fragen

Was ist nextPageToken in der Gmail API?

Wenn Sie messages.list aufrufen, gibt die Gmail API bis zu 500 Ergebnisse pro Seite zurück. Existieren weitere Nachrichten, enthält die Antwort einen nextPageToken-String. Diesen übergeben Sie in der nächsten Anfrage als Parameter pageToken, um die folgende Seite zu laden. Sie wiederholen das, bis die Antwort kein nextPageToken mehr enthält — dann haben Sie das Ende erreicht.

Wie funktioniert die inkrementelle Gmail-Synchronisierung mit historyId?

Jede Änderung in einem Gmail-Postfach (neue Nachrichten, Löschungen, Label-Änderungen) erhält eine monoton steigende historyId. Sie speichern die historyId Ihres letzten Syncs und rufen dann history.list mit startHistoryId auf, um nur die seitdem angefallenen Änderungen zu erhalten. History-IDs laufen nach etwa 30 Tagen ab. Ist Ihre gespeicherte ID zu alt, gibt die API 404 zurück und Sie brauchen einen Fallback auf einen vollständigen Sync.

Kann ich Gmail-E-Mails auflisten, ohne die Gmail API einzurichten?

Ja. Nylas CLI erledigt OAuth2 und die Provider-Authentifizierung intern. Führen Sie nylas email list --limit 50 --json aus, um Ihren Gmail-Posteingang aufzulisten — ohne einen Gmail-API-Client in Google Cloud zu registrieren, einen OAuth-Consent-Screen zu konfigurieren oder Access-Tokens zu verwalten. Das CLI funktioniert auf dieselbe Weise über sechs Provider hinweg.

Behandelt das CLI Gmail-API-Rate-Limits?

Ja. Die Gmail API gibt neuen Projekten 6.000 Quota-Einheiten pro Minute, pro Nutzer und Projekt, und ein messages.list-Aufruf kostet 5 Einheiten. Das CLI verwaltet Rate Limiting, Pagination, Token-Refresh und Retry-Logik intern. Sie erhalten die Ergebnisse, ohne Quota-Tracking- oder Backoff-Code zu schreiben.

Kann ich Gmail-Threads statt Nachrichten paginieren?

Ja. nylas email threads list paginiert den Endpoint threads.list statt messages.list. Ein typisches Postfach hat etwa 1 Thread pro 3-4 Nachrichten, die Seitenzahl liegt also 60-80 % niedriger. Kombinieren Sie mit nylas email threads mark, um jede Nachricht einer Konversation mit einem einzigen Befehl als gelesen zu markieren.

Wie liste ich E-Mails nur aus einem bestimmten Gmail-Label auf?

Übergeben Sie den Labelnamen an --in bei nylas email search. Der Befehl nylas email search "*" --in Receipts --json liefert nur Nachrichten mit dem Label Receipts. Mit nylas email folders list sehen Sie jedes Label bzw. jeden Ordner des Kontos. Dasselbe Flag funktioniert für Outlook-Ordner, Yahoo-IMAP-Ordner und iCloud-Ordner ohne Syntaxänderung.

Kann ich Gmail in einem Cron-Job ohne OAuth-Pop-up synchronisieren?

Ja. Verwenden Sie nylas auth config --api-key statt nylas auth login. Der API-Key-Flow öffnet keinen Browser und läuft daher auf Headless-Maschinen, in Docker-Containern, in CI-Pipelines und in KI-Agent-Sandboxes wie Manus. Hinterlegen Sie den Schlüssel als Secret in der Umgebung, die den Cron-Job ausführt.

Wie synchronisiere ich nur die E-Mails der letzten 24 Stunden?

Übergeben Sie --after an nylas email search. Für die letzten 24 Stunden: nylas email search "*" --after $(date -u -v-1d +%Y-%m-%d) --json. Das Flag nimmt ein Datum im Format YYYY-MM-DD entgegen, und das CLI übersetzt es in die Filtersyntax des jeweiligen Providers — bei Gmail wird daraus eine q=after:-Abfrage gegen die API.

Funktioniert das CLI mit Outlook, Yahoo und iCloud auf dieselbe Weise?

Ja. Dieselben Befehle nylas email list, nylas email search und nylas email read funktionieren über Gmail, Outlook, Exchange, Yahoo, iCloud und IMAP hinweg. Das Tool übersetzt jeden Befehl in den providerspezifischen API-Aufruf: Gmails REST-API, Microsoft Graph, IMAP UID SEARCH oder EWS. Provider-Walkthroughs finden Sie in Outlook-E-Mails auflisten, IMAP-E-Mails auflisten und Exchange-E-Mails auflisten.

Was passiert, wenn meine historyId älter als 30 Tage ist?

Gmail gibt bei history.list ein 404 zurück, und Sie müssen auf einen vollständigen Pagination-Sync ausweichen. Das CLI erledigt diesen Fallback automatisch — Sie sehen die 404 nicht und müssen keine zwei Codepfade schreiben. ETag-basierte Concurrency-Kontrolle und If-Match-Handling behandelt Gmail API If-Match und ETag-Handling.

Kann ich Push-Benachrichtigungen statt Polling bekommen?

Ja. nylas webhook create registriert einen HTTPS-Endpoint für Ereignisse wie message.created und thread.replied — ohne Cloud-Pub/Sub-Topic und ohne Google-Workspace-Admin. Führen Sie nylas webhook triggers aus, um jeden unterstützten Ereignistyp zu sehen.

Nächste Schritte

Gmail-Pagination und inkrementelle Synchronisierung gehören zu den häufigsten Herausforderungen bei der API-Integration, aber sie sind nicht die einzigen. Diese verwandten Guides decken angrenzende Workflows ab — E-Mail-Versand, ETag-basierte Concurrency-Kontrolle und die vollständige CLI-Befehlsoberfläche.