Stärken Sie Ihren Gmail-Posteingang mit Google Cloud Functions

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 an, 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, die E-Mails in eingehenden Nachrichten automatisch kategorisiert und diese Kategorien in einer Google-Tabelle speichert. Diese Erweiterung verwendet die RESTful APIs der G Suite, Google Cloud Functions und andere Google Cloud Platform-Dienste.

Umfang

In diesem Lab erstellen und stellen Sie Cloud Functions-Funktionen bereit, die mit G Suite APIs und anderen Google Cloud Platform-Diensten verbunden sind. Diese Funktionen:

  • Sicheren Zugriff auf Ihre Gmail- und Google Tabellen-Daten autorisieren
  • An eingehende E-Mails angehängte Bilder extrahieren
  • Diese Bilder mithilfe der Cloud Vision API kategorisieren
  • Schreiben Sie diese Kategorien, die Adresse des Absenders und den Namen des Anhangs in eine Google-Tabelle.

Lerninhalte

  • G Suite RESTful APIs – Grundlagen
  • Grundlagen von Google Cloud Functions und anderen Google Cloud Platform-Diensten
  • Mit Google Cloud Functions programmatisch auf Gmail zugreifen

Voraussetzungen

  • Ein Google-Konto mit Zugriff auf Gmail und Google Tabellen. Falls Sie noch keines haben, erstellen Sie eines.
  • Grundkenntnisse in JavaScript/Node.js

2. Das Wichtigste zuerst

APIs aktivieren

In diesem Lab nutzen 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“) einfach und skalierbar ausführen können.

Klicken Sie zum Aktivieren von Google Cloud Functions oben links auf das Dreistrich-Menü, um die linke Navigationsseitenleiste zu öffnen:

f457988e33594bb6.png

Klicken Sie im Navigationsmenü auf Cloud Functions. 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 er als Kurierdienst zwischen Gmail und Google Cloud Functions.

Um Google Cloud Pub/Sub zu aktivieren, öffnen Sie die linke Navigationsleiste, suchen Sie 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.

Klicken Sie in der linken Navigationsleiste auf Datenspeicher, um Google Cloud Datastore zu aktivieren. Klicken Sie auf der neuen Seite auf Datenspeichermodus auswählen.

98012c91fd4080d4.png

Für dieses Lab können Sie einen beliebigen Datenbankspeicherort verwenden. Klicken Sie auf Datenbank erstellen, um Google Cloud Datastore zu aktivieren. kann dies einige Minuten dauern.

Google Cloud Vision

Die Google Cloud Vision API ist ein leistungsstarker Dienst für maschinelles Lernen, der mit vortrainierten Modellen Informationen aus Ihren Bildern gewinnt.

In der folgenden Anleitung erfahren Sie, wie Sie die Google Cloud Vision API aktivieren.

Gmail API, Google Sheets API und Google Cloud Vision API aktivieren

Öffnen Sie wieder die linke Navigationsleiste und suchen Sie nach APIs und Dienste. Klicke auf Mediathek. Klicken Sie im Menü Search for APIs & Dienste Gmail ein. Wählen Sie in den Suchergebnissen Gmail API aus und klicken Sie auf Aktivieren.

Gehen Sie zurück zur Seite „API-Bibliothek“. Suchen Sie nach 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 führen Sie die meisten Vorgänge mit Google Cloud Shell aus. Cloud Shell bietet Ihnen Befehlszeilenzugriff auf Ihre Google Cloud Platform-Ressourcen direkt von Ihrem Browser aus, sodass Sie sie ohne lokalen Computer verwalten können.

Klicken Sie zum Öffnen von Google Cloud Shell in der oberen blauen horizontalen Leiste auf die Schaltfläche Cloud Shell aktivieren:

fd5c2925ca9cdfdd.png

Unten auf dem Bildschirm wird ein neues Steuerfeld angezeigt:

34f498402e910802.png

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

10f8631ef48bed22.png

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

Der neue Ordner gcf-gmail-codelab sollte im Cloud Shell-Code-Editor angezeigt werden.

3. Architekturübersicht

Hier der Workflow in diesem Lab:

79c5d3e43f674b33.png

  1. Der Nutzer richtet Gmail-Push-Benachrichtigungen ein: Jedes Mal, wenn eine neue Nachricht im Posteingang eingeht, wird von Gmail eine Benachrichtigung an Cloud Pub/Sub gesendet.
  2. Cloud Pub/Sub übermittelt die Benachrichtigung über eine neue Nachricht an Google Cloud Functions.
  3. Nach Erhalt der Benachrichtigung über eine neue Nachricht stellt eine Cloud Functions-Instanz eine Verbindung zu Gmail her und ruft die neue Nachricht ab.
  4. Wenn die E-Mail ein Bild als Anhang hat, ruft die Cloud Functions-Instanz die Cloud Vision API auf, um den Anhang zu analysieren.
  5. Die Cloud Functions-Instanz aktualisiert eine Google-Tabelle Ihrer Wahl, in der angegeben wird, wer die Nachricht sendet und wo der Anhang heruntergeladen werden soll.

4. Zugriff auf Gmail autorisieren

Bevor Sie eine Cloud Functions-Funktion zum automatischen Lesen Ihrer E-Mails einrichten, müssen Sie den Zugriff auf Gmail autorisieren. Registrieren Sie einen OAuth-Client bei Google und erstellen Sie eine zugehörige Client-ID.

OAuth-Client registrieren

Suchen Sie im linken Navigationsmenü der Google Cloud Console nach APIs und Dienste. Klicken Sie auf OAuth-Zustimmungsbildschirm.

91b2a3bac30bb2c5.png

Geben Sie in das Feld Anwendungsname 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.

Verknüpfte 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 auch hier noch einmal GCF + Gmail-Codelab verwenden) und klicken Sie auf Erstellen. Lassen Sie die Felder für die Einschränkungen vorerst leer.

Notieren Sie sich die Client-ID und den Clientschlüssel, die im Pop-up-Fenster zurückgegeben werden. Sie können auf der Seite auf den Namen Ihres Kunden klicken, um diese Werte noch einmal aufzurufen:

1160d8027ea52d90.png

Autorisierungsprozess durchführen

Im Beispielcode gibt auth/index.js zwei Cloud Functions-Funktionen an, auth_init und auth_callback, die gemeinsam den Autorisierungsprozess ausführen. Dabei werden die Client-ID und der gerade erstellte Clientschlüssel verwendet.

Öffnen Sie auth/index.js im Cloud Shell-Codeeditor, um den Code zu prüfen.

Beim Autorisierungsprozess werden zwei Arten von Tokens zurückgegeben: Zugriffstokens und Aktualisierungstokens.

  • Zugriffstokens sind kurzlebige Identitätsnachweise, die jedem, der über ein Token verfügt, eingeschränkten Zugriff auf Ihre Daten gewähren. auth_callback speichert sie in Cloud Datastore.
  • Aktualisierungstokens werden verwendet, um neue Zugriffstokens zu erhalten, und sind wesentlich langlebiger.

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 eigene 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.

a2b4853c39a78bc6.png

Führen Sie nach dem Bearbeiten von auth/env_vars.yaml den folgenden Befehl in Cloud Shell aus, um 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 die Berechtigung, Betabefehle zu installieren, wenn Sie dazu aufgefordert werden.

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.

cb094bd341f9b299.png

45678a327c80e0f1.png

Kopieren Sie die URL auf der Seite. Gehen Sie zurück zur Cloud Functions-Seite und klicken Sie in der Liste der Cloud Functions-Funktionen 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.

939ca3bd38047282.png

Klicken Sie auf Bereitstellen, um die Änderungen zu übernehmen. Wiederholen Sie den Vorgang und aktualisieren Sie auch auth_callback.

Öffnen Sie abschließend das linke Navigationsmenü und klicken Sie auf APIs und 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

Sie sollten Folgendes als autorisierte Domain hinzufügen:

us-central1-my-project.cloudfunctions.net

Klicken Sie zur Bestätigung auf Domain hinzufügen.

4348748f232ceb87.png

Gehen Sie zurück zur Seite Anmeldedaten. Klicken Sie auf den Namen Ihres OAuth-Clients und fügen Sie die kopierte URL als Autorisierte 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

Sie sollten Folgendes als Ursprung hinzufügen:

https://us-central1-my-project.cloudfunctions.net/

159bad719432582c.png

Drücken Sie zur Bestätigung die Eingabetaste und klicken Sie auf Speichern, um die Änderungen 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 zu eingehenden Nachrichten, sobald diese über Gmail eingehen.

Rufen Sie die Google Cloud Console auf und klicken Sie auf Pub/Sub, um ein Pub/Sub-Thema zu erstellen. 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 ihr die Rolle Pub/Sub > Pub/Sub-Publisher 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 linken Navigationsmenü auf Cloud Functions und wählen Sie in der Liste der Cloud Functions-Funktionen auth_callback 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 gerade erstellten Pub/Sub-Themas. Klicken Sie auf Speichern, um die Änderungen zu übernehmen.

Jetzt können Sie 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 in der Liste der Cloud Functions-Funktionen auth_init aus und wechseln Sie zum Tab Trigger. Klicken Sie auf die URL. Sie werden zur Seite Über Google anmelden weitergeleitet:

348ab0a7e0c9cd03.png

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:

cfdad62fd02de004.png

Klicken Sie auf Zulassen, um den Zugriff zu autorisieren. auth_callback schließt den Autorisierungsprozess ab, speichert die Zugriffstokens und richtet Gmail-Push-Benachrichtigungen für Sie ein. Nach Abschluss dieses Vorgangs sollten Sie die Meldung Successfully set up Gmail push notifications in Ihrem Browser sehen.

In diesem Codelab wird das @google-cloud/express-oauth2-handlers-Paket verwendet, um den Autorisierungsworkflow 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 die 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.

Öffnen Sie pubsub/index.js im Cloud Shell-Codeeditor, um den Code zu prüfen.

Nachrichten werden abgerufen

Eine Gmail-Push-Benachrichtigung enthält die E-Mail-Adresse, mit der die Benachrichtigung verknüpft ist, und eine Verlaufs-ID. Der Einfachheit halber fragen Sie in diesem Codelab einfach die Gmail API nach der neuesten Nachricht, wenn eine Push-Benachrichtigung eingeht. Verwenden Sie für die Suche nach Nachrichten stattdessen die Verlaufs-ID, um ein besseres Ergebnis zu erzielen.

// 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 enthält, 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 beispielsweise ein Bild eines blauen Himmels angezeigt wird, 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. Angenommen, die Adresse in Ihrem Browser sieht so aus:

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 in der Liste der Cloud Functions-Funktionen auth_init aus und suchen Sie nach dem Bereich Umgebungsvariablen.

Code bereitstellen

Führen Sie den folgenden Befehl aus, um die Cloud Functions-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 dem 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 Bild als Anhang. Die von Ihnen erstellte Google-Tabelle wird nach wenigen Sekunden automatisch mit den von Ihnen angegebenen Informationen aktualisiert.