Gmail Gelen Kutunuzu Google Cloud Functions ile Güçlendirin

1. Giriş

Milyarlarca işletme ve kişi, iletişim kurmak ve veri işlemek için Gmail'i ve diğer G Suite hizmetlerini kullanıyor. Google, bu hizmetlerdeki bilgilere programatik olarak erişmenize yardımcı olmak için G Suite API'leri sunar. Günlük iş akışınızı kolayca otomatikleştirmek için API'leri kullanabilirsiniz. Bu laboratuvarda, gelen iletilerdeki e-postaları otomatik olarak kategorilere ayıran ve bu kategorileri bir Google e-tablosuna kaydeden güçlü bir Gmail uzantısı oluşturacaksınız. Bu uzantı G Suite'in RESTful API'lerini, Google Cloud Functions'ı ve diğer Google Cloud Platform hizmetlerini kullanacak.

Ne oluşturacaksınız?

Bu laboratuvarda, G Suite API'lerine ve diğer Google Cloud Platform hizmetlerine bağlı birkaç Cloud Functions işlevi oluşturup dağıtacaksınız. Bu işlevler:

  • Gmail ve Google E-Tablolar verilerinize güvenli erişimi yetkilendirme
  • Gelen postalara ekli resimleri ayıkla
  • Cloud Vision API kullanarak bu görüntüleri kategorilere ayırın
  • Bu kategorileri, gönderenin adresini ve ekin adını bir Google E-Tablosu'na yazın

Öğrenecekleriniz

  • G Suite RESTful API'leriyle ilgili temel bilgiler
  • Google Cloud Functions ve diğer Google Cloud Platform hizmetleriyle ilgili temel bilgiler
  • Google Cloud Functions kullanarak Gmail'e programatik olarak erişme

Gerekenler

2. Öncelikle

API'leri etkinleştirme

Bu laboratuvarda aşağıdaki Google ürünlerini/hizmetlerini kullanacaksınız:

  • 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, ayrı kod snippet'lerini ("işlevler") basit ve ölçeklenebilir şekilde çalıştırmanıza olanak tanıyan, Google'ın "Hizmet Olarak Sunucusuz İşlevler" platformudur.

Google Cloud Functions'ı etkinleştirmek için ekranınızın sol üstündeki üçgen menüyü tıklayarak sol gezinme kenar çubuğunu açın:

f457988e33594bb6.png

Gezinme menüsünde Cloud Functions'ı bulun ve tıklayın. Projenizde Google Cloud Functions'ı etkinleştirmek için API'yi etkinleştir'i tıklayın.

Google Cloud Pub/Sub

Google Cloud Pub/Sub, veri akışı ve etkinlik teslimi için basit ve ölçeklenebilir bir temel sunar. Bu laboratuvarda Gmail ile Google Cloud Functions arasında kurye görevi görür.

Google Cloud Pub/Sub'ı etkinleştirmek için sol gezinme kenar çubuğunu açın, Pub/Sub'ı bulup tıklayın. Projenizde Google Cloud Pub/Sub'ı etkinleştirmek için API'yi etkinleştir'i tıklayın.

Google Cloud Datastore

Google Cloud Datastore, ölçeklenebilir ve dağıtılmış bir sunucusuz veritabanıdır.

Google Cloud Datastore'u etkinleştirmek için sol gezinme kenar çubuğunda Datastore'u bulup tıklayın. Yeni sayfada Datastore Modunu Seç'i tıklayın.

98012c91fd4080d4.png

Bu laboratuvarda dilediğiniz veritabanı konumunu kullanabilirsiniz. Google Cloud Datastore'u etkinleştirmek için Create Database'i (Veritabanı Oluştur) tıklayın. tamamlanması birkaç dakika sürebilir.

Google Cloud Vizyonu

Google Cloud Vision API, görüntülerinizden analizler elde etmek için önceden eğitilmiş modeller kullanan güçlü bir makine öğrenimi hizmetidir.

Google Cloud Vision API'yi etkinleştirmeyle ilgili bilgi için aşağıdaki talimatlara bakın.

Gmail API, Google Sheets API ve Google Cloud Vision API'yi etkinleştirme

Sol gezinme kenar çubuğunu tekrar açın ve API'ler ve Hizmetler. Kitaplık'ı tıklayın. API ve Hizmetler alanına Gmail yazın. Arama sonuçlarında, Gmail API'yi seçin ve Etkinleştir'i tıklayın.

API Kitaplığı sayfasına geri dönün. Google Sheets API'yi arayın ve etkinleştirin.

Süreç tekrarlanır. Cloud Vision API'yi bulup etkinleştirin.

Google Cloud Shell'i açın

Bu laboratuvarda, çoğu işlemi gerçekleştirmek için Google Cloud Shell'i kullanacaksınız. Cloud Shell, Google Cloud Platform kaynaklarınıza doğrudan tarayıcınız üzerinden komut satırı erişimi sunarak bunları yerel makine kullanmadan yönetmenize olanak tanır.

Google Cloud Shell'i açmak için üstteki mavi yatay çubuktaki Cloud Shell'i Etkinleştir düğmesini tıklayın:

fd5c2925ca9cdfdd.png

Ekranın alt kısmında yeni bir panel görünür:

34f498402e910802.png

Cloud Shell Kod Düzenleyici'yi başlatmak için Kod düzenleyiciyi başlat düğmesini tıklayın:

10f8631ef48bed22.png

Cloud Shell Kod Düzenleyici yeni bir pencerede açılır.

Kodu indirme

Projeyi klonlamak için Cloud Shell'inizde aşağıdaki komutu çalıştırın:

git clone https://github.com/googlecodelabs/gcf-gmail-codelab.git

cd gcf-gmail-codelab

Cloud Shell Kod Düzenleyici'de yeni gcf-gmail-codelab klasörünü göreceksiniz.

3. Mimariye genel bakış

Bu laboratuvarın iş akışı aşağıda belirtilmiştir:

79c5d3e43f674b33.png

  1. Kullanıcı, Gmail push bildirimlerini ayarlar: Gelen kutusuna her yeni ileti geldiğinde Gmail, Cloud Pub/Sub'a bildirim gönderir.
  2. Cloud Pub/Sub, yeni mesaj bildirimini Google Cloud Functions'a gönderir.
  3. Yeni ileti bildirimi geldiğinde, bir Cloud Functions örneği Gmail'e bağlanır ve yeni iletiyi alır.
  4. Postada ek olarak bir resim varsa Cloud Functions örneği, eki analiz etmek için Cloud Vision API'yi çağırır.
  5. Cloud Functions örneği, iletiyi kimin gönderdiğini ve ekin nereye indirileceğini belirterek seçtiğiniz bir Google E-Tablosunu günceller.

4. Gmail'e erişim yetkisi verme

E-postalarınızı otomatik olarak okuyacak bir Cloud Functions işlevi ayarlamadan önce bu işlevin Gmail'e erişimini yetkilendirmeniz gerekir. Google'a bir OAuth istemcisi kaydetmeniz ve ilişkili bir istemci kimliği oluşturmanız gerekir.

OAuth istemcisi kaydedin

Google Cloud Console'un sol gezinme menüsünden API'ler ve Hizmetler. OAuth izin ekranı'nı tıklayın.

91b2a3bac30bb2c5.png

Uygulama adı alanına GCF + Gmail Codelab gibi bir ad yazın. Diğer ayarları olduğu gibi bırakın, sayfayı aşağı kaydırın ve Kaydet'i tıklayın.

İlişkilendirilmiş bir istemci kimliği oluşturun

Credentials (Kimlik Bilgisi) sekmesine geçin. Create Credentials'ı (Kimlik Bilgileri Oluştur) tıklayın ve OAuth client ID (OAuth istemci kimliği) seçeneğini belirleyin. Web uygulaması türünü seçin, uygulamaya bir ad verin (burada GCF + Gmail Codelab'i tekrar kullanabilirsiniz) ve Oluştur'u tıklayın. Kısıtlamalar alanlarını şimdilik boş bırakın.

Pop-up pencerede döndürülen istemci kimliğini ve istemci gizli anahtarını yazın. Bu değerleri tekrar görüntülemek için sayfada müşterinizin adını tıklayabilirsiniz:

1160d8027ea52d90.png

Yetkilendirme sürecini gerçekleştirme

Örnek kodda auth/index.js, az önce oluşturduğunuz istemci kimliğini ve istemci gizli anahtarını kullanarak yetkilendirme işlemini gerçekleştirmek için birlikte çalışan iki Cloud Functions (auth_init ve auth_callback) Cloud Functions işlevini belirtir.

Kodu incelemek için Cloud Shell Kod Düzenleyici'de auth/index.js öğesini açın.

Yetkilendirme işlemi iki tür jeton döndürür: erişim jetonları ve yenileme jetonları.

  • Erişim jetonları, sahip olduğu kullanıcılara verilerinize kapsamlı erişim sağlayan kısa ömürlü kimlik kanıtlarıdır; auth_callback bunları Cloud Datastore'a kaydeder.
  • Yenileme jetonları yeni erişim jetonları almak için kullanılır ve önemli ölçüde daha uzundur.

Bunlar genellikle şifrelenir ve/veya erişim jetonlarından ayrı olarak depolanır.

Cloud Shell Kod Düzenleyici'de auth/env_vars.yaml öğesini düzenleyin. YOUR-GOOGLE-CLIENT-ID ve YOUR-GOOGLE-CLIENT-SECRET değerlerini kendi değerlerinizle değiştirin. Daha fazla bilgi için önceki adıma bakın. YOUR-GOOGLE-CLIENT-CALLBACK-URL ve YOUR-PUBSUB-TOPIC değerlerini şimdilik olduğu gibi bırakın.

a2b4853c39a78bc6.png

auth/env_vars.yaml öğesini düzenledikten sonra, Cloud Functions'ı dağıtmak için Cloud Shell'de aşağıdaki komutu çalıştırın:

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

Cloud Functions'ın dağıtılması birkaç dakika sürebilir. İstenirse Google Cloud SDK'ya beta komutlarını yükleme izni verin.

Ardından, Google Cloud Console'a gidin ve soldaki gezinme menüsünden Cloud Functions'ı tıklayın. Cloud Functions listesinde auth_callback öğesini tıklayın ve Tetikleyici sekmesine geçin.

cb094bd341f9b299.png

45678a327c80e0f1.png

Sayfadaki URL'yi kopyalayın. Cloud Functions sayfasına dönün ve Cloud Functions listesinde auth_init simgesini tıklayın. Genel sekmesinde Düzenle'yi tıklayın. Ortam değişkenleri, ağ iletişimi, zaman aşımları ve daha fazlası'nı tıklayın ve GOOGLE_CALLBACK_URL değerini, az önce kopyaladığınız URL ile değiştirin.

939ca3bd38047282.png

Değişiklikleri uygulamak için Dağıt'ı tıklayın. İşlemi tekrarlayın ve auth_callback uygulamasını da güncelleyin.

Son olarak, sol gezinme menüsünü açın ve API'ler ve Hizmetler > Alan doğrulaması. Yetkilendirilmiş alan eklemek için Alan ekle'yi tıklayın. Örneğin, daha önce kopyaladığınız URL

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

Aşağıdakileri yetkili alan olarak eklemeniz gerekir:

us-central1-my-project.cloudfunctions.net

Onaylamak için Alan ekle'ye basın.

4348748f232ceb87.png

Credentials (Kimlik Bilgisi) sayfasına geri dönün. OAuth istemcinizin adını tıklayın ve kopyaladığınız URL'yi Yetkili yönlendirme URI'si olarak ekleyin. Onaylamak için Enter tuşuna basın.

/auth_callback bölümünü URL'den kaldırın ve geri kalanını Yetkili JavaScript kaynağı olarak ekleyin. Örneğin, URL'niz

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

Aşağıdakini kaynak olarak eklemeniz gerekir:

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

159bad719432582c.png

Onaylamak için Enter'a basın, değişiklikleri uygulamak için ise Kaydet'i tıklayın.

5. Gmail push bildirimlerini ayarlama

Yetkilendirme işlemi başarılı olursa auth_callback, push bildirimlerini ayarlamak için otomatik olarak Gmail API'yi çağırır.

Gmail push bildirimleri almak için bir Pub/Sub konusu oluşturmanız gerekir. Konunun tüm aboneleri, Gmail'den ulaştıklarında gelen ileti bildirimlerini otomatik olarak alır.

Pub/Sub konusu oluşturmak için Google Cloud Console'a gidip Pub/Sub'ı tıklayın > Konular'ı tıklayın. Konu Oluştur'u tıklayın. Konunun adını (ör. gmail-watch) yazın ve Oluştur'u tıklayın. Ayrıca, Gmail'e Pub/Sub konunuza ileti gönderme izni vermeniz gerekir: Az önce oluşturduğunuz konunun içerik menüsünü (üç dikey nokta) tıklayın ve İzinler'i seçin; Üye ekle'yi tıklayın, gmail-api-push@system.gserviceaccount.com adlı kullanıcıyı yeni üye olarak belirtin ve Pub/Sub > rolünü verin. Pub/Sub Yayıncısı; son olarak, değişiklikleri uygulamak için Kaydet'i tıklayın.

Hangi Pub/Sub konusunun kullanılacağını belirtmek için auth_callback adlı Cloud Functions işlevini güncelleyin. Soldaki gezinme menüsünden Cloud Functions'ı tıklayın ve Cloud Functions listesinden auth_callback'i seçin. Genel sekmesinde Düzenle'yi tıklayın. More'u (Diğer) tıklayın ve PUBSUB_TOPIC değerini az önce oluşturduğunuz Pub/Sub konusunun adıyla değiştirin. Değişiklikleri uygulamak için Kaydet'i tıklayın.

Artık Gmail push bildirimlerini yetkilendirmeye ve ayarlamaya hazırsınız. Yeni değişiklikler tamamlanana kadar bekleyin, ardından Cloud Functions sayfasına dönün, Cloud Functions listesinde auth_init öğesini seçin ve Tetikleyici sekmesine geçin. URL'yi tıkladığınızda Google ile oturum açma sayfasına yönlendirilirsiniz:

348ab0a7e0c9cd03.png

Size ait bir Gmail hesabıyla oturum açın. Hesabın gelen kutusuna gelen her yeni ileti bir push bildirimini tetikler. Oturum açtıktan sonra aşağıdaki sayfayı göreceksiniz:

cfdad62fd02de004.png

Erişimi yetkilendirmek için İzin ver'i tıklayın. auth_callback yetkilendirme işlemini tamamlayacak, erişim jetonlarını kaydedecek ve Gmail push bildirimlerini sizin için ayarlayacaktır. Bu işlem tamamlandığında tarayıcınızda Successfully set up Gmail push notifications mesajını görürsünüz.

Bu codelab, yetkilendirme iş akışını sizin için otomatikleştirmek üzere @google-cloud/express-oauth2-handlers paketini kullanır. Daha fazla bilgi için GitHub'daki kod deposuna bakın.

6. Gelen mesajları işle

Daha önce belirttiğimiz gibi, oluşturduğunuz Pub/Sub konusunun tüm aboneleri, gelen kutunuza yeni mesajlar geldiğinde bildirim alır. pubsub/index.js, konunun abonesi olarak dağıtıldıktan sonra yeni mesajları okuyacak, ekli görüntüleri kategorilere ayıracak ve bu kategorileri bir Google E-Tablosu'na aktaracak watchGmailMessages adlı bir Cloud Functions işlevini belirtir.

Kodu incelemek için Cloud Shell Kod Düzenleyici'de pubsub/index.js öğesini açın.

Mesajlar alınıyor

Gmail push bildirimlerinde, bildirimin ilişkilendirildiği e-posta adresi ve geçmiş kimliği bulunur. Kolaylık sağlaması açısından, bu codelab'de Gmail API'ye bir push bildirimi geldiğinde en son mesajı sormanız yeterlidir. iletileri aramak için bunun yerine geçmiş kimliğini kullanın.

// 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;

Resim eklerini analiz etme

Mesajda resim eki varsa watchGmailMessages, görüntüye açıklama eklemek için Cloud Vision API'yi çağırır. Bu codelab'de Cloud Vision API'den görüntüyü sınıflandırmasını ve çeşitli görüntü etiketleri döndürmesini isteyeceksiniz. örneğin, mavi gökyüzünün resmiyle birlikte sağlanırsa Cloud Vision API; mavi, gökyüzü ve doğa etiketlerini döndürebilir.

watchGmailMessages, Cloud Vision API'yi çağırmak için Node.js için Cloud Vision API Kitaplığı'nı kullanır:

// 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 E-Tablosunu Güncelle

watchGmailMessages, bu analizin sonuçlarını bir Google E-Tablosu'na aktarır. Gönderenin adı, ekin adı ve resim eklerinin etiketlerini (varsa) içerir.

İlk olarak bir Google E-Tablosu oluşturun. Google E-Tablolar'ı açın ve Yeni bir e-tablo başlat'ın altındaki Boş şablonu tıklayın. E-tablonuzun kimliğini kopyalayın. Örneğin, tarayıcınızdaki adres aşağıdaki gibi görünüyorsa:

https://docs.google.com/spreadsheets/d/abcdefghij01234567890/edit#gid=0

E-tablonuzun kimliği: abcdefghij01234567890. Cloud Shell Kod Düzenleyici'de gcf-gmail-codelab/pubsub/env_vars.yaml değerini güncelleyin ve YOUR-GOOGLE-SHEET-ID değerini kendi değerinizle değiştirin.

watchGmailMessages, bilgi eklemek için Google Sheets API ile bağlantı kurar:

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)
      ]
    }
  });
};

Son bir adım

Cloud Shell Kod Düzenleyici'de gcf-gmail-codelab/pubsub/env_vars.yaml aracını açıp YOUR-GOOGLE-CLIENT-ID, YOUR-GOOGLE-CLIENT-SECRET ve YOUR-GOOGLE-CALLBACK-URL değerlerini kendi değerlerinizle değiştirin. Bu değerleri Google Cloud Console'da bulabilirsiniz: Soldaki gezinme menüsünden Cloud Functions'ı açın, Cloud Functions listesinden auth_init öğesini seçin ve Ortam değişkenleri bölümünü bulun.

Kodu dağıtma

Cloud Functions işlevini dağıtmak için aşağıdaki komutu çalıştırın:

cd ~

cd gcf-gmail-codelab/pubsub

gcloud functions deploy watchGmailMessages --runtime=nodejs8 --trigger-topic=gmail-watch --env-vars-file=env_vars.yaml

Cloud Pub/Sub konunuza gmail-watch dışında bir ad verdiyseniz yukarıdaki komutta gmail-watch öğesini konunuzun adıyla değiştirin. Cloud Functions işlevinin dağıtılması birkaç saniye sürebilir.

7. Deneyin

Tebrikler, tamamladınız! Kendinize resim eki içeren bir e-posta gönderin. Birkaç saniye içinde, oluşturduğunuz Google E-Tablosunun sağladığınız bilgilerle otomatik olarak güncellendiğini göreceksiniz.