Leitfaden · Gmail API
Wie sollte ein Produktteam die Gmail API sicher implementieren?
Implementieren Sie die Gmail API als delegierten Zugriff auf ein bestimmtes Gmail-Postfach und nicht als allgemeine Zugangsdaten für die E-Mail-Zustellung. Wählen Sie den kleinsten OAuth-Scope, der die Funktion unterstützt, schützen Sie Autorisierungsstatus und Refresh-Tokens und halten Sie jedes Postfach mandantenbezogen. Erstellen Sie Nachrichten mit einer ausgereiften Bibliothek für Internet-Nachrichten, speichern Sie die zurückgegebene Gmail-Nachrichten-ID und synchronisieren Sie Änderungen über Pub/Sub und History-Einträge. Behandeln Sie die Impersonierung per Service-Account als Entscheidung des Workspace-Administrators. Halten Sie schließlich API-Annahme, Zustellung an den empfangenden Server und Platzierung im Posteingang als getrennte Ergebnisse auseinander.
Das Postfachmodell festlegen, bevor Sie Code schreiben
Die Gmail API arbeitet auf dem Gmail-Postfach eines Nutzers. Sie ist geeignet, wenn ein Produkt dieses Postfach lesen, dessen Labels und Threads organisieren, Entwürfe erstellen, als autorisierter Nutzer senden oder Postfachänderungen synchronisieren muss. Diese Berechtigung ist erheblich weitreichender als der Aufruf einer Anwendungs-E-Mail-API von einer verifizierten Produktdomain. Benennen Sie zuerst die genaue Postfachaufgabe und den Akteur, der den Zugriff erteilt. Ein nutzerorientiertes Produkt verwendet normalerweise OAuth-Einwilligung für jedes verbundene Google-Konto. Eine interne Google-Workspace-Automatisierung könnte stattdessen eine vom Administrator genehmigte domainweite Delegierung nutzen. Wenn Sie nur Belege, Verifizierungslinks, Warnungen oder andere produktausgelöste Nachrichten von einer Domain der eigenen Firma senden wollen, verzichten Sie ganz auf Postfachzugriff und prüfen Sie eine API für transaktionale E-Mails. Diese Architekturentscheidung reduziert unnötigen Zugriff, bevor eine Sicherheitskontrolle oder ein Einwilligungsbildschirm ihn ausgleichen muss.
Den engsten praktikablen Scope autorisieren
Konfigurieren Sie einen OAuth-Client für den richtigen Anwendungstyp, verwenden Sie einen exakt registrierten Redirect-URI und binden Sie die Autorisierungsantwort mit einem unvorhersehbaren State-Wert an die auslösende Browsersitzung. Fordern Sie den Zugriff im Kontext an, wenn der Nutzer die Funktion aktiviert, die ihn braucht. Für eine reine Sende-Integration ist `https://www.googleapis.com/auth/gmail.send` enger gefasst als Scopes, die das Postfach lesen oder ändern. Google stuft `gmail.send` als sensibel ein, während Scopes wie `gmail.readonly`, `gmail.compose` und `gmail.modify` eingeschränkt (restricted) sind. Eine öffentliche App mit sensiblem oder eingeschränktem Zugriff kann eine OAuth-Verifizierung erfordern, und die serverseitige Speicherung oder Übertragung von Daten aus eingeschränkten Scopes kann zusätzliche Anforderungen an Sicherheitsprüfungen auslösen. Fordern Sie Offline-Zugriff nur an, wenn Hintergrundarbeit wirklich nötig ist. Verschlüsseln Sie Refresh-Tokens, ordnen Sie jedes Token genau einem internen Mandanten und einem Google-Subject zu, geben Sie es nie an Browser-Code oder Logs weiter und bieten Sie einen getesteten Trennungsweg, der lokale Zugangsdaten löscht und Hintergrundverarbeitung stoppt.
Service-Accounts und domainweite Delegierung verstehen
Ein Service-Account ist eine Anwendungsidentität und kein Drop-in-Gmail-Postfach. Für sich genommen erhält er keinen Zugriff auf Nachrichten von Mitarbeitenden. Für Google-Workspace-Nutzerdaten muss ein Super-Administrator die numerische Client-ID des Service-Accounts und eine exakte Liste von OAuth-Scopes per domainweiter Delegierung ausdrücklich autorisieren. Die Anwendung fordert dann delegierte Zugangsdaten für einen benannten Nutzer an, und jeder API-Aufruf handelt mit den Berechtigungen dieses Nutzers innerhalb der autorisierten Scopes. Halten Sie das impersonierte Subject in Job-Daten und Audit-Logs explizit fest, damit ein Hintergrund-Worker nicht stillschweigend das Postfach wechseln kann. Verwenden Sie getrennte Service-Accounts für wesentlich unterschiedliche Workloads, vermeiden Sie herunterladbare private Schlüssel, wenn die Laufzeitumgebung verwaltete Zugangsdaten nutzen kann, und prüfen Sie domainweite Freigaben regelmäßig. Private Gmail-Konten haben keinen Workspace-Administrator, der diese organisationsweite Delegierung erteilen könnte. Nutzen Sie für diese Konten daher die OAuth-Einwilligung des Nutzers.
Nachrichten senden, ohne Kontrolle und Nachvollziehbarkeit zu verlieren
Gmail nimmt über `users.messages.send` eine vollständige Internet-E-Mail-Nachricht im Feld `raw` entgegen, base64url-kodiert. Ein Produkt kann auch einen Entwurf erstellen und später senden. Verwenden Sie eine gepflegte Nachrichtenbibliothek, um die Struktur aus From, To, Cc, Bcc, Subject, Date, Message-ID, Text, HTML und Anhängen zu erzeugen, statt Header-Zeilen manuell zusammenzufügen. Validieren Sie Empfänger und Inhalt vor der Kodierung, weisen Sie Header-Injection ab und setzen Sie explizite Größenlimits. Machen Sie die Produktaktion idempotent, bevor Sie Gmail aufrufen: Speichern Sie einen stabilen Anwendungs-Event-Schlüssel, das vorgesehene Postfach-Subject und einen Zustand des Sendeversuchs. Speichern Sie nach einer erfolgreichen Antwort die von Gmail zurückgegebene Nachrichten-ID und Thread-ID zu diesem Event. Wenn der Client nach dem Übertragen der Anfrage in ein Timeout läuft, gleichen Sie den Postfachzustand ab, bevor Sie es erneut versuchen, denn die Nachricht könnte bereits angenommen worden sein. Ein blinder Wiederholungsversuch kann eine doppelte E-Mail erzeugen, auch wenn die ursprüngliche Antwort verloren ging. Nutzen Sie die Erstellung von Entwürfen mit menschlicher Prüfung, wenn Inhalt oder Empfänger eine Freigabe erfordern.
Postfachänderungen mit History-Einträgen synchronisieren
Bei einer serverseitigen Postfach-Integration veröffentlicht ein Gmail-Watch Änderungssignale über Google Cloud Pub/Sub. Die Benachrichtigung ist ein Anstoß zur Synchronisierung und keine vollständige E-Mail-Payload. Speichern Sie die aktuelle History-ID und den Ablaufzeitpunkt aus der Watch-Antwort, bestätigen Sie Benachrichtigungen schnell und rufen Sie `users.history.list` ab der zuletzt erfolgreich übernommenen History-ID auf, um Nachrichten- und Label-Änderungen zu ermitteln. Laden Sie nur die Nachrichten, die die Funktion braucht, und rücken Sie den Checkpoint erst vor, wenn die lokalen Schreibvorgänge erfolgreich waren. Benachrichtigungen können verzögert oder doppelt eintreffen, daher muss die Verarbeitung von Nachrichten und History idempotent sein. Gmail verlangt, einen Postfach-Watch mindestens alle sieben Tage zu erneuern, und empfiehlt tägliche Erneuerung. Planen Sie die Erneuerung deutlich vor dem Ablauf und lösen Sie bei Fehlern Alarm aus. Liegt eine gespeicherte History-ID außerhalb des verfügbaren Bereichs von Gmail, gibt die API HTTP 404 zurück. Behandeln Sie das als definierten Wiederherstellungsweg: Führen Sie eine kontrollierte vollständige Synchronisierung durch, setzen Sie einen neuen Checkpoint und nehmen Sie die inkrementelle Verarbeitung wieder auf, statt die ungültige History-ID endlos zu wiederholen.
Einen gestuften Implementierungs- und Verifizierungsablauf nutzen
Erstens: Dokumentieren Sie, ob die Funktion Mails sendet, liest, ändert oder beobachtet, und ordnen Sie jeder Operation ihren minimalen OAuth-Scope zu. Zweitens: Legen Sie getrennte Google-Cloud-Projekte oder OAuth-Clients für Entwicklung und Produktion an, mit exakten Redirect-URIs und benannten Verantwortlichen für Zugangsdaten. Drittens: Implementieren Sie die Autorisierung mit State-Validierung, Offline-Zugriff nur bei Bedarf, verschlüsselter Token-Speicherung, Token-Widerruf und Zugriffsprüfungen auf Mandantenebene. Viertens: Testen Sie mit kontrollierten Postfächern: verbinden, ein abgelaufenes Access-Token erneuern, die Einwilligung widerrufen, neu verbinden, einmal senden, ein mehrdeutiges Timeout simulieren und die Vermeidung von Duplikaten bestätigen. Fünftens: Richten Sie beim Empfang von Änderungen die Pub/Sub-Berechtigungen ein, starten Sie einen Watch, verarbeiten Sie die History inkrementell, erzwingen Sie eine Wiederherstellung bei veraltetem Checkpoint und prüfen Sie die Watch-Erneuerung. Sechstens: Ergänzen Sie Arbeitswarteschlangen pro Nutzer, begrenzten exponentiellen Backoff, strukturierte Fehlerklassifizierung und Audit-Logs, die Nachrichtentexte und Tokens standardmäßig auslassen. Schließen Sie vor dem Launch die erforderliche Google-Verifizierung und Sicherheitsprüfung ab, veröffentlichen Sie zutreffende Angaben zur Datennutzung und proben Sie Rotation der Zugangsdaten und Löschung von Nutzerdaten.
Kontingente, Wiederholungsversuche und Teilausfälle einplanen
Gmail misst API-Nutzung in Kontingenteinheiten, nicht nur nach Anfragezahl. Die Kontingentseite von Google nennt 1.200.000 Einheiten pro Minute und Projekt sowie 6.000 Einheiten pro Minute, pro Nutzer und pro Projekt. Sie nennt `messages.send`, `drafts.send` und `watch` mit jeweils 100 Einheiten und ein Limit von 500 Empfängern pro Nachricht. Die separaten Nutzer-Versandlimits von Gmail gelten weiterhin über API-, Web- und SMTP-Clients hinweg. Behandeln Sie die Cloud Console und aktuelle Dokumentation als Laufzeit-Konfigurationseingaben, statt veröffentlichte Limits in Geschäftslogik fest zu codieren. Serialisieren oder fair queuen Sie Arbeit pro Postfach, begrenzen Sie Parallelität und wiederholen Sie nur temporäre Antworten mit exponentiellem Backoff mit Jitter und endlicher Frist. Wiederholen Sie Autorisierungs-, Richtlinien-, ungültige-Empfänger- oder fehlerhafte-Nachrichtenfehler nicht, als wären sie Kapazitätsprobleme. Ein Multipart-Batch senkt den Verbindungsaufwand, aber jeder innere Aufruf verbraucht weiter Kontingent und kann unabhängig fehlschlagen.
Annahme, Zustellung und Platzierung im Posteingang getrennt halten
Ein erfolgreicher Aufruf von `messages.send` bedeutet, dass Gmail die autorisierte API-Anfrage angenommen und eine Gmail-Message-Ressource zurückgegeben hat. Er beweist nicht, dass der Mailserver jedes Empfängers die Nachricht akzeptiert hat, und er kann nicht belegen, wie ein empfangendes System die Nachricht eingestuft hat. Zustellung an den Empfängerserver bedeutet, dass das Zielsystem die SMTP-Verantwortung übernommen hat. Die Platzierung im Posteingang ist ein späteres Filterergebnis, etwa primärer Posteingang, Werbung, Quarantäne oder Spam. Die Postfach-API von Gmail ersetzt daher keinen Event-Stream eines Providers, wenn ein Produkt Telemetrie zu Zustellung, Bounces oder Beschwerden für transaktionale E-Mails braucht. Bewahren Sie die Gmail-Nachrichten-ID für den Abgleich auf, beschreiben Sie den für Nutzer sichtbaren Status aber präzise als von Gmail gesendet oder angenommen, sofern kein separater Nachweis die Zustellung stützt. Authentifizierung, erwartete Empfänger, Inhaltsqualität, Sendeverhalten und Zielrichtlinien beeinflussen alle die weitere Behandlung. Eine API-Antwort kann den endgültigen Postfachordner des Empfängers weder bestimmen noch zusagen.
Wissen, wann eine API für transaktionale E-Mails eine andere Aufgabe erfüllt
Verwenden Sie die Gmail API, wenn das Produkt autorisierten Zugriff auf das Gmail-Postfach einer Person oder Organisation benötigt, einschließlich Threads, Labels, Entwürfen oder Postfachsynchronisierung. Eine API für transaktionale E-Mails passt zu einer anderen Architektur: durch die Anwendung ausgelöste Nachrichten von Domains, die die Organisation kontrolliert, ohne delegierte Berechtigung zum Lesen eines Gmail-Postfachs. Ein Produkt kann beide Systemtypen nutzen, wenn die Grenzen klar sind, etwa Gmail OAuth zum Lesen des verbundenen Postfachs eines Support-Agenten und einen separat verifizierten transaktionalen Provider für Produktbelege. Halten Sie Zugangsdaten, Einwilligung, Nachrichtenspeicher, Wiederholungsrichtlinien und Audit-Aufzeichnungen getrennt, damit Postfachberechtigungen nicht in den anwendungsweiten Versand gelangen und eine transaktionale Berechtigung nicht auf das Gmail-Postfach eines Nutzers zugreifen kann.
Häufig gestellte Fragen
Kann ein Service-Account auf jedes Gmail-Postfach zugreifen?
Nein. Ein Service-Account erhält nicht automatisch Zugriff auf Gmail-Nutzerdaten. Ein Google-Workspace-Super-Administrator muss der numerischen Client-ID und den genehmigten Scopes domainweite Delegierung erteilen. Danach impersoniert die Anwendung ausdrücklich einen Nutzer dieser Organisation. Verwenden Sie für private Gmail-Konten stattdessen die OAuth-Einwilligung des Nutzers.
Welchen OAuth-Scope sollte eine reine Sende-Integration für Gmail anfordern?
Prüfen Sie zuerst `https://www.googleapis.com/auth/gmail.send`. Dieser Scope erlaubt das Senden im Namen des Nutzers, ohne allgemeines Lesen des Postfachs zu gewähren. Bestätigen Sie, dass keine Produktanforderung tatsächlich Entwürfe, das Lesen von Nachrichten, Labels oder Änderungen benötigt, bevor Sie einen breiteren Scope anfordern, und berücksichtigen Sie die Verifizierungsregeln von Google für sensible Scopes.
Bedeutet ein erfolgreicher Versand über die Gmail API, dass die Nachricht zugestellt wurde?
Nein. Er bestätigt, dass Gmail die autorisierte API-Operation angenommen und einen Nachrichtendatensatz zurückgegeben hat. Annahme durch den empfangenden Server und Platzierung im Posteingang sind getrennte nachgelagerte Zustände. Bezeichnen Sie die Nachricht nicht als zugestellt und sagen Sie keine Platzierung im Posteingang zu, solange kein anderes vertrauenswürdiges Signal diese Schlussfolgerung stützt.
Enthalten Gmail-Push-Benachrichtigungen die vollständige neue Nachricht?
Nein. Eine Pub/Sub-Benachrichtigung signalisiert, dass sich der Postfachzustand geändert hat, und enthält Informationen zum Fortsetzen der Synchronisierung. Die Anwendung sollte die Gmail-History ab ihrer gespeicherten History-ID abfragen, die benötigten Nachrichtendaten laden, idempotent verarbeiten und danach ihren Checkpoint vorrücken.
Wie oft muss ein Gmail-Postfach-Watch erneuert werden?
Google verlangt, `watch` mindestens alle sieben Tage aufzurufen, und empfiehlt tägliche Erneuerung. Speichern Sie den zurückgegebenen Ablaufzeitpunkt, erneuern Sie davor, überwachen Sie Fehler und halten Sie einen Fallback-Synchronisierungsjob bereit, damit eine verpasste Erneuerung nicht unbemerkt eine unbegrenzte Datenlücke erzeugt.
Wann sollte ein Team statt der Gmail API eine API für transaktionale E-Mails verwenden?
Nutzen Sie eine API für transaktionale E-Mails, wenn die Aufgabe anwendungsausgelöste E-Mails von Domains unter Kontrolle der Organisation ist und keine Funktion Zugriff auf das Gmail-Postfach einer Person braucht. Nutzen Sie die Gmail API, wenn das Produkt ausdrücklich delegierte Postfachnachrichten, Threads, Labels, Entwürfe, Einstellungen oder Send-as-Berechtigung benötigt.
Quellen
- Überblick über die Gmail API — Google for Developers
- Gmail-API-Scopes auswählen — Google for Developers
- Serverseitige Autorisierung implementieren — Google for Developers
- OAuth 2.0 für Webserver-Anwendungen verwenden — Google for Developers
- OAuth 2.0 für Server-zu-Server-Anwendungen verwenden — Google for Developers
- E-Mail-Nachrichten erstellen und senden — Google for Developers
- Push-Benachrichtigungen in der Gmail API konfigurieren — Google for Developers
- Clients mit Gmail synchronisieren — Google for Developers
- Nutzungslimits der Gmail API — Google for Developers
- Fehler der Gmail API beheben — Google for Developers
- Richtlinie zu Nutzerdaten und Entwicklern für Google-Workspace-APIs — Google for Developers
- RFC 5322: Internet Message Format (Format von Internet-Nachrichten) — RFC Editor
- RFC 5321: Simple Mail Transfer Protocol — RFC-Editor