1. Einführung
Milliarden von Unternehmen und Einzelpersonen nutzen Gmail und andere G Suite-Dienste, um zu kommunizieren und Daten zu verarbeiten. Google bietet G Suite-APIs, mit denen Sie programmatisch auf Informationen in diesen Diensten zugreifen können. Mit den APIs lässt sich Ihr täglicher Workflow ganz einfach automatisieren. In diesem Lab erstellen Sie eine leistungsstarke Gmail-Erweiterung, mit der E‑Mails in eingehenden Nachrichten automatisch kategorisiert und diese Kategorien in einem Google-Tabellenblatt gespeichert werden. Für diese Erweiterung werden die RESTful APIs von G Suite, Google Cloud Functions und andere Google Cloud Platform-Dienste verwendet.
Umfang
In diesem Lab erstellen und stellen Sie einige Cloud Functions bereit, die mit G Suite-APIs und anderen Google Cloud-Diensten verbunden sind. Diese Funktionen:
- Sicheren Zugriff auf Ihre Gmail- und Google Sheets-Daten autorisieren
- Bilder aus Anhängen aller eingehenden E‑Mails extrahieren
- Bilder mit der Cloud Vision API kategorisieren
- Schreibe diese Kategorien, die Absenderadresse und den Namen des Anhangs in eine Google-Tabelle.
Lerninhalte
- Grundlagen von RESTful APIs für G Suite
- Grundlagen von Google Cloud Functions und anderen Google Cloud Platform-Diensten
- Programmatischer Zugriff auf Gmail mit Google Cloud Functions
Voraussetzungen
- Ein Google-Konto mit Zugriff auf Gmail und Google Tabellen. Falls Sie noch kein Google-Konto haben, können Sie hier eins erstellen.
- Grundkenntnisse in JavaScript/Node.js.
2. Das Wichtigste zuerst
APIs aktivieren
In diesem Lab verwenden Sie die folgenden Google-Produkte und ‑Dienste:
- Google Cloud Functions
- Google Cloud Pub/Sub
- Google Cloud Vision API
- Google Cloud Datastore
- Gmail API
- Google Sheets API
Google Cloud Functions
Google Cloud Functions ist die serverlose Functions-as-a-Service-Plattform von Google, mit der Sie einzelne Code-Snippets („Funktionen“) auf einfache und skalierbare Weise ausführen können.
Wenn Sie Google Cloud Functions aktivieren möchten, klicken Sie oben links auf das Dreistrich-Menü, um die linke Navigationsleiste zu öffnen:

Suchen Sie im Navigationsmenü nach Cloud Functions und klicken Sie darauf. Klicken Sie auf API aktivieren, um Google Cloud Functions in Ihrem Projekt zu aktivieren.
Google Cloud Pub/Sub
Google Cloud Pub/Sub ist eine einfache und skalierbare Grundlage für Datenstreaming und Ereignisübermittlung. In diesem Lab fungiert sie als Kurier zwischen Gmail und Google Cloud Functions.
Wenn Sie Google Cloud Pub/Sub aktivieren möchten, öffnen Sie die linke Navigationsleiste, suchen Sie nach Pub/Sub und klicken Sie darauf. Klicken Sie auf API aktivieren, um Google Cloud Pub/Sub in Ihrem Projekt zu aktivieren.
Google Cloud Datastore
Google Cloud Datastore ist eine serverlose Datenbank, die skalierbar und verteilt ist.
Wenn Sie Google Cloud Datastore aktivieren möchten, suchen Sie in der linken Navigationsleiste nach Datastore und klicken Sie darauf. Klicken Sie auf der neuen Seite auf Datastore-Modus auswählen.

Sie können für dieses Lab einen beliebigen Datenbankstandort verwenden. Klicken Sie auf Datenbank erstellen, um Google Cloud Datastore zu aktivieren. Dies kann einige Minuten dauern.
Google Cloud Vision
Die Google Cloud Vision API ist ein leistungsstarker Dienst für maschinelles Lernen, der vortrainierte Modelle verwendet, um Erkenntnisse aus Ihren Bildern zu gewinnen.
Unten finden Sie eine Anleitung zum Aktivieren der Google Cloud Vision API.
Gmail API, Google Sheets API und Google Cloud Vision API aktivieren
Öffnen Sie noch einmal die Navigationsleiste auf der linken Seite und suchen Sie nach APIs & Dienste. Klicke auf Mediathek. Geben Sie im Feld Nach APIs und Diensten suchen Gmail ein. Wählen Sie in den Suchergebnissen Gmail API aus und klicken Sie auf Aktivieren.
Kehren Sie zur Seite „API-Bibliothek“ zurück. Suchen Sie nach der Google Sheets API und aktivieren Sie sie.
Wiederholen Sie den Vorgang. Suchen Sie nach der Cloud Vision API und aktivieren Sie sie.
Google Cloud Shell öffnen
In diesem Lab verwenden Sie Google Cloud Shell für die meisten Vorgänge. Cloud Shell bietet Ihnen direkt über den Browser Befehlszeilenzugriff auf Ihre Google Cloud-Ressourcen. So können Sie sie verwalten, ohne einen lokalen Computer zu verwenden.
Klicken Sie zum Öffnen von Google Cloud Shell in der blauen horizontalen Leiste oben auf die Schaltfläche Cloud Shell aktivieren:

Unten auf dem Bildschirm wird ein neues Feld angezeigt:

Klicken Sie auf die Schaltfläche Code-Editor starten, um den Cloud Shell-Code-Editor zu starten:

Der Cloud Shell-Code-Editor wird in einem neuen Fenster geöffnet.
Code herunterladen
Führen Sie den folgenden Befehl in Cloud Shell aus, um das Projekt zu klonen:
git clone https://github.com/googlecodelabs/gcf-gmail-codelab.git cd gcf-gmail-codelab
Im Cloud Shell-Codeeditor sollte ein neuer Ordner namens gcf-gmail-codelab angezeigt werden.
3. Architekturübersicht
Im Folgenden finden Sie den Workflow dieses Labs:

- Der Nutzer richtet Gmail-Push-Benachrichtigungen ein: Jedes Mal, wenn eine neue Nachricht im Posteingang eingeht, sendet Gmail eine Benachrichtigung an Cloud Pub/Sub.
- Cloud Pub/Sub übermittelt die Benachrichtigung über die neue Nachricht an Google Cloud Functions.
- Wenn die Benachrichtigung über die neue Nachricht eingeht, stellt eine Cloud Functions-Instanz eine Verbindung zu Gmail her und ruft die neue Nachricht ab.
- Wenn die E-Mail ein Bild als Anhang enthält, ruft die Cloud Functions-Instanz die Cloud Vision API auf, um den Anhang zu analysieren.
- Die Cloud Functions-Instanz aktualisiert ein Google-Tabellenblatt Ihrer Wahl und gibt an, wer die Nachricht gesendet hat und wo der Anhang heruntergeladen werden kann.
4. Zugriff auf Gmail autorisieren
Bevor Sie eine Cloud-Funktion einrichten, um Ihre E‑Mails automatisch zu lesen, müssen Sie den Zugriff auf Gmail autorisieren. Sie müssen einen OAuth-Client bei Google registrieren und eine zugehörige Client-ID erstellen.
OAuth-Client registrieren
Suchen Sie im linken Navigationsmenü der Google Cloud Console nach APIs & Dienste. Klicken Sie auf OAuth-Zustimmungsbildschirm.

Geben Sie im Feld Name der Anwendung einen Namen ein, z. B. GCF + Gmail Codelab. Lassen Sie die anderen Einstellungen unverändert, scrollen Sie auf der Seite nach unten und klicken Sie auf Speichern.
Zugeordnete Client-ID erstellen
Wechseln Sie zum Tab Anmeldedaten. Klicken Sie auf Anmeldedaten erstellen und wählen Sie OAuth-Client-ID aus. Wählen Sie den Typ Webanwendung aus, geben Sie einen Namen ein (Sie können hier wieder GCF + Gmail Codelab verwenden) und klicken Sie auf Erstellen. Lassen Sie die Felder für Einschränkungen vorerst leer.
Notieren Sie sich die Client-ID und den Clientschlüssel, die im Pop-up-Fenster angezeigt werden. Sie können auf der Seite auf den Namen Ihres Kunden klicken, um diese Werte noch einmal aufzurufen:

Autorisierungsprozess durchführen
Im Beispielcode werden mit auth/index.js zwei Cloud Functions, auth_init und auth_callback, angegeben, die zusammenarbeiten, um den Autorisierungsprozess mit der Client-ID und dem Client-Secret auszuführen, die Sie gerade erstellt haben.
Wenn Sie den Code prüfen möchten, öffnen Sie auth/index.js im Cloud Shell-Code-Editor.
Beim Autorisierungsprozess werden zwei Arten von Tokens zurückgegeben: Zugriffstokens und Aktualisierungstokens.
- Zugriffstokens sind kurzlebige Identitätsnachweise, die jedem, der sie besitzt, eingeschränkten Zugriff auf Ihre Daten gewähren.
auth_callbackspeichert sie in Cloud Datastore. - Aktualisierungstokens werden verwendet, um neue Zugriffstokens zu erhalten, und sind deutlich länger gültig.
In der Regel werden sie entweder verschlüsselt und/oder getrennt von Zugriffstokens gespeichert.
Bearbeiten Sie auth/env_vars.yaml im Cloud Shell-Code-Editor. Ersetzen Sie YOUR-GOOGLE-CLIENT-ID und YOUR-GOOGLE-CLIENT-SECRET durch Ihre eigenen Werte. Weitere Informationen finden Sie im vorherigen Schritt. Lassen Sie die Werte von YOUR-GOOGLE-CLIENT-CALLBACK-URL und YOUR-PUBSUB-TOPIC vorerst unverändert.

Führen Sie nach dem Bearbeiten von auth/env_vars.yaml den folgenden Befehl in Cloud Shell aus, um die Cloud Functions-Funktionen bereitzustellen:
cd ~ cd gcf-gmail-codelab/auth # Deploy Cloud Function auth_init gcloud functions deploy auth_init --runtime=nodejs8 --trigger-http --env-vars-file=env_vars.yaml # Deploy Cloud Function auth_callback gcloud functions deploy auth_callback --runtime=nodejs8 --trigger-http --env-vars-file=env_vars.yaml
Die Bereitstellung der Cloud Functions-Funktionen kann einige Minuten dauern. Erteilen Sie dem Cloud SDK bei entsprechender Aufforderung die Berechtigung, Betabefehle zu installieren.
Rufen Sie als Nächstes die Google Cloud Console auf und klicken Sie im linken Navigationsmenü auf Cloud Functions. Klicken Sie in der Liste der Cloud Functions-Funktionen auf auth_callback und wechseln Sie zum Tab Trigger.


Kopieren Sie die URL auf der Seite. Kehren Sie zur Seite „Cloud Functions“ zurück und klicken Sie in der Liste der Cloud Functions auf auth_init. Klicken Sie auf dem Tab Allgemein auf Bearbeiten. Klicken Sie auf Umgebungsvariablen, Netzwerk, Zeitlimits und mehr und ersetzen Sie den Wert von GOOGLE_CALLBACK_URL durch die URL, die Sie gerade kopiert haben.

Klicken Sie auf Bereitstellen, um die Änderungen zu übernehmen. Wiederhole den Vorgang und aktualisiere auch auth_callback.
Öffnen Sie das Navigationsmenü auf der linken Seite und klicken Sie auf APIs & Dienste > Domainbestätigung. Klicken Sie auf Domain hinzufügen, um eine autorisierte Domain hinzuzufügen. Wenn die zuvor kopierte URL beispielsweise so aussieht:
https://us-central1-my-project.cloudfunctions.net/auth_callback
Fügen Sie Folgendes als autorisierte Domain hinzu:
us-central1-my-project.cloudfunctions.net
Drücken Sie zur Bestätigung auf Domain hinzufügen.

Kehren Sie zur Seite Anmeldedaten zurück. Klicken Sie auf den Namen Ihres OAuth-Clients und fügen Sie die kopierte URL als autorisierten Weiterleitungs-URI hinzu. Drücken Sie zur Bestätigung die Eingabetaste.
Entfernen Sie den Teil /auth_callback aus der URL und fügen Sie den Rest als autorisierte JavaScript-Quelle hinzu. Wenn Ihre URL beispielsweise so aussieht:
https://us-central1-my-project.cloudfunctions.net/auth_callback
Fügen Sie Folgendes als Ursprung hinzu:
https://us-central1-my-project.cloudfunctions.net/

Drücken Sie die Eingabetaste, um die Änderungen zu bestätigen, und klicken Sie auf Speichern, um sie zu übernehmen.
5. Gmail-Push-Benachrichtigungen einrichten
Wenn die Autorisierung erfolgreich ist, ruft auth_callback automatisch die Gmail API auf, um Push-Benachrichtigungen einzurichten.
Wenn Sie Gmail-Push-Benachrichtigungen erhalten möchten, müssen Sie ein Pub/Sub-Thema erstellen. Jeder Abonnent des Themas erhält automatisch Benachrichtigungen über eingehende Nachrichten, sobald sie in Gmail eingehen.
Wenn Sie ein Pub/Sub-Thema erstellen möchten, rufen Sie die Google Cloud Console auf und klicken Sie im linken Navigationsmenü auf Pub/Sub > Themen. Klicken Sie auf Thema erstellen. Geben Sie den Namen des Themas ein, z. B. gmail-watch, und klicken Sie auf Erstellen. Außerdem müssen Sie Gmail die Berechtigung erteilen, Nachrichten an Ihr Pub/Sub-Thema zu senden. Klicken Sie dazu auf das Kontextmenü des gerade erstellten Themas (drei vertikale Punkte) und wählen Sie Berechtigungen aus. Klicken Sie auf Mitglieder hinzufügen, geben Sie gmail-api-push@system.gserviceaccount.com als neues Mitglied an und weisen Sie ihm die Rolle Pub/Sub > Pub/Sub-Publisher zu. Klicken Sie abschließend auf Speichern, um die Änderungen zu übernehmen.
Aktualisieren Sie die Cloud Functions-Funktion auth_callback, um anzugeben, welches Pub/Sub-Thema verwendet werden soll. Klicken Sie im Navigationsmenü links auf Cloud Functions und wählen Sie auth_callback in der Liste der Cloud Functions aus. Klicken Sie auf dem Tab Allgemein auf Bearbeiten. Klicken Sie auf Mehr und ersetzen Sie den Wert von PUBSUB_TOPIC durch den Namen des Pub/Sub-Themas, das Sie gerade erstellt haben. Klicken Sie auf Speichern, um die Änderungen zu übernehmen.
Sie können jetzt Gmail-Push-Benachrichtigungen autorisieren und einrichten. Warten Sie, bis die neuen Änderungen abgeschlossen sind, kehren Sie dann zur Seite Cloud Functions zurück, wählen Sie auth_init in der Liste der Cloud Functions-Funktionen aus und wechseln Sie zum Tab Trigger. Klicken Sie auf die URL. Sie werden zur Seite Über Google anmelden weitergeleitet:

Melden Sie sich mit einem Gmail-Konto an, das Ihnen gehört. Jede neue Nachricht, die im Posteingang des Kontos eingeht, löst eine Push-Benachrichtigung aus. Nach der Anmeldung wird die folgende Seite angezeigt:

Klicken Sie auf Zulassen, um den Zugriff zu autorisieren. auth_callback führt den Autorisierungsprozess durch, speichert die Zugriffstokens und richtet Gmail-Push-Benachrichtigungen für Sie ein. Wenn dieser Vorgang abgeschlossen ist, sollte in Ihrem Browser die Meldung Successfully set up Gmail push notifications angezeigt werden.
In diesem Codelab wird das @google-cloud/express-oauth2-handlers-Paket verwendet, um den Autorisierungsvorgang für Sie zu automatisieren. Weitere Informationen finden Sie im Repository auf GitHub.
6. Eingehende Nachrichten verarbeiten
Wie bereits erwähnt, erhalten alle Abonnenten des von Ihnen erstellten Pub/Sub-Themas Benachrichtigungen, wenn neue Nachrichten in Ihrem Posteingang eingehen. pubsub/index.js gibt eine Cloud Functions-Funktion (watchGmailMessages) an, die nach der Bereitstellung als Abonnent des Themas die neuen Nachrichten liest, angehängte Bilder kategorisiert und diese Kategorien in eine Google-Tabelle exportiert.
Wenn Sie den Code prüfen möchten, öffnen Sie pubsub/index.js im Cloud Shell-Code-Editor.
Nachrichten abrufen
Eine Gmail-Push-Benachrichtigung enthält die E‑Mail-Adresse, der die Benachrichtigung zugeordnet ist, und eine Verlaufs-ID. Aus Gründen der Einfachheit wird in diesem Codelab einfach die Gmail API nach der neuesten Nachricht gefragt, wenn eine Push-Benachrichtigung eingeht. Für ein besseres Ergebnis sollten Sie stattdessen die Verlaufs-ID verwenden, um Nachrichten zu suchen.
// Look up the most recent message.
const listMessagesRes = await gmail.users.messages.list({
userId: email,
maxResults: 1
});
const messageId = listMessagesRes.messages[0].id;
// Get the message using the message ID.
const message = await gmail.users.messages.get({
userId: email,
id: messageId
});
return message;
Bildanhänge analysieren
Wenn die Nachricht einen Bildanhang hat, ruft watchGmailMessages die Cloud Vision API auf, um das Bild zu annotieren. In diesem Codelab bitten Sie die Cloud Vision API, das Bild zu klassifizieren und eine Reihe von Bild-Tags zurückzugeben. Wenn Sie beispielsweise ein Bild eines blauen Himmels bereitstellen, gibt die Cloud Vision API möglicherweise die Tags blau, Himmel und Natur zurück.
watchGmailMessages verwendet die Cloud Vision API-Bibliothek für Node.js, um die Cloud Vision API aufzurufen:
// Tag the attachment using Cloud Vision API
const analyzeAttachment = async (data, filename) => {
var topLabels = ['', '', ''];
if (filename.endsWith('.png') || filename.endsWith('.jpg')) {
const [analysis] = await visionClient.labelDetection({
image: {
content: Buffer.from(data, 'base64')
}
});
const labels = analysis.labelAnnotations;
topLabels = labels.map(x => x.description).slice(0, 3);
}
return topLabels;
};
Google-Tabelle aktualisieren
watchGmailMessages exportiert die Ergebnisse dieser Analyse in eine Google-Tabelle. Sie enthält den Namen des Absenders, den Namen des Anhangs und Tags von Bildanhängen (falls vorhanden).
Erstellen Sie zuerst eine Google-Tabelle. Öffnen Sie Google Tabellen und klicken Sie unter Neue Tabelle anlegen auf die Vorlage Leer. Kopieren Sie die ID des Tabellenblatts. Wenn die Adresse in Ihrem Browser beispielsweise so aussieht:
https://docs.google.com/spreadsheets/d/abcdefghij01234567890/edit#gid=0
Die ID Ihrer Tabelle lautet abcdefghij01234567890. Aktualisieren Sie im Cloud Shell-Codeeditor gcf-gmail-codelab/pubsub/env_vars.yaml und ersetzen Sie YOUR-GOOGLE-SHEET-ID durch Ihren eigenen Wert.
watchGmailMessages stellt eine Verbindung zur Google Sheets API her, um Informationen anzuhängen:
const updateReferenceSheet = async (from, filename, topLabels) => {
await googleSheets.spreadsheets.values.append({
spreadsheetId: SHEET,
range: SHEET_RANGE,
valueInputOption: 'USER_ENTERED',
requestBody: {
range: SHEET_RANGE,
majorDimension: 'ROWS',
values: [
[from, filename].concat(topLabels)
]
}
});
};
Letzter Schritt
Öffnen Sie im Cloud Shell-Codeeditor gcf-gmail-codelab/pubsub/env_vars.yaml und ersetzen Sie YOUR-GOOGLE-CLIENT-ID, YOUR-GOOGLE-CLIENT-SECRET und YOUR-GOOGLE-CALLBACK-URL durch eigene Werte. Sie finden diese Werte in der Google Cloud Console: Öffnen Sie im linken Navigationsmenü Cloud Functions, wählen Sie auth_init in der Liste der Cloud Functions aus und suchen Sie nach dem Abschnitt Umgebungsvariablen.
Code bereitstellen
Führen Sie den folgenden Befehl aus, um die Cloud-Funktion bereitzustellen:
cd ~ cd gcf-gmail-codelab/pubsub gcloud functions deploy watchGmailMessages --runtime=nodejs8 --trigger-topic=gmail-watch --env-vars-file=env_vars.yaml
Wenn Sie Ihrem Cloud Pub/Sub-Thema einen anderen Namen als gmail-watch gegeben haben, ersetzen Sie gmail-watch im obigen Befehl durch den Namen Ihres Themas. Die Bereitstellung der Cloud Functions-Funktion kann einige Sekunden dauern.
7. Jetzt ausprobieren
Herzlichen Glückwunsch, Sie haben es geschafft! Senden Sie sich selbst eine E‑Mail mit einem Bildanhang. Die von Ihnen erstellte Google-Tabelle wird in wenigen Sekunden automatisch mit den von Ihnen angegebenen Informationen aktualisiert.