n8n ile Gmail Entegrasyonu ve E-posta Otomasyonu

E-posta otomasyonu denince çoğu insan hemen Python scripti ya da karmaşık SMTP konfigürasyonları düşünür. Oysa n8n ile Gmail’i entegre etmek, hem görsel hem de son derece esnek bir yaklaşım sunuyor. Birkaç yıl önce bir müşterimizin “gelen her destek e-postasını Slack’e ilet, kritik olanları da SMS at” talebini n8n olmadan çözmeye çalışmıştım. Üç günlük Python macerası ve onlarca satır kod sonrası çalışan bir şey çıkarmıştım ama sürdürülebilir değildi. Şimdi aynı iş akışını n8n’de 20 dakikada kuruyorum.

Gmail Entegrasyonu İçin Ön Gereksinimler

n8n’i zaten çalışır hale getirdiğinizi varsayıyorum. Eğer Docker üzerinde ayağa kaldırmadıysanız, önce bunu yapmanızı öneririm. Gmail entegrasyonu için iki yöntem var: OAuth2 ve App Password. Google hesabınızda 2FA aktifse App Password kullanabilirsiniz, kurumsal Google Workspace hesapları için ise OAuth2 zorunlu hale geliyor çoğu zaman.

Google Cloud Console’da OAuth2 Ayarları

Önce Google Cloud Console’da bir proje oluşturmanız ve Gmail API’yi etkinleştirmeniz gerekiyor:

# gcloud CLI kuruluysa şu komutlarla hızlıca yapabilirsiniz
gcloud projects create n8n-gmail-automation --name="N8N Gmail Automation"
gcloud config set project n8n-gmail-automation
gcloud services enable gmail.googleapis.com

CLI tercih etmiyorsanız Console üzerinden de yapabilirsiniz. Önemli olan OAuth2 consent screen’i doğru yapılandırmak. Eğer sadece kendi hesabınız için kullanacaksanız “Internal” seçeneği yeterli, ama birden fazla Google hesabını yönetecekseniz “External” seçip test kullanıcılarına hesapları eklemeniz gerekiyor.

Credentials bölümünden OAuth 2.0 Client ID oluştururken Application type olarak “Web application” seçin. Authorized redirect URI kısmına n8n instance adresinizi şu formatta girin:

# n8n OAuth callback URL formatı
https://your-n8n-domain.com/rest/oauth2-credential/callback

# Lokal geliştirme ortamı için
http://localhost:5678/rest/oauth2-credential/callback

Client ID ve Client Secret’ı bir yere not edin, n8n’de credential tanımlarken lazım olacak.

App Password ile Daha Hızlı Başlangıç

Test ortamları veya kişisel projeler için App Password çok daha pratik:

# Gmail SMTP ayarları App Password ile
# Host: smtp.gmail.com
# Port: 587 (TLS) veya 465 (SSL)
# Username: [email protected]
# Password: xxxx xxxx xxxx xxxx (16 haneli app password)

Google hesabınızda “Uygulama Şifreleri” bölümünden 16 haneli bir şifre üretiyorsunuz ve bunu n8n’deki Gmail credential’ına giriyorsunuz. Üretim ortamları için bunu önermem ama geliştirme aşamasında zaman kazandırıyor.

n8n’de Gmail Credential Tanımlaması

n8n arayüzünde Settings > Credentials > Add Credential yolunu izleyin ve “Gmail OAuth2 API” seçeneğini arayın. Client ID ve Client Secret’ı girdikten sonra “Connect” butonuna tıkladığınızda Google’ın OAuth akışına yönlendiriliyorsunuz. İzinleri onayladığınızda credential kaydediliyor.

Bir sorunla sık karşılaşıyorum: n8n’i reverse proxy arkasında çalıştırıyorsanız ve HTTPS yoksa OAuth callback çalışmıyor. Bu durumda ya n8n’e HTTPS ekleyin ya da ngrok gibi bir araçla geçici tunnel açın:

# Geliştirme ortamında ngrok ile HTTPS tunnel
ngrok http 5678

# Çıktıda görünen HTTPS URL'yi OAuth redirect URI olarak kullanın
# Örnek: https://abc123.ngrok.io/rest/oauth2-credential/callback

İlk Workflow: Gelen E-postaları Filtreleme ve Sınıflandırma

En temel senaryo ile başlayalım. Müşteri destek e-postalarını öncelik seviyesine göre filtreleyen ve farklı kanallara yönlendiren bir workflow kuracağız.

Workflow’un mantığı şu: Gmail’de belirli bir etikete sahip e-postalar geldiğinde tetiklenecek, konu satırını analiz edecek, öncelik belirleyecek ve Slack’e ya da doğrudan ilgili kişiye iletecek.

n8n’in Gmail Trigger node’u polling bazlı çalışıyor, yani belirli aralıklarla Gmail’i kontrol ediyor. Gerçek zamanlı webhook desteği için Google Pub/Sub kurulumu gerekiyor ama çoğu senaryo için 1-5 dakikalık polling yeterli.

Gmail Trigger Konfigürasyonu

Node ayarlarında şunları yapılandırın:

# Gmail Trigger Node Parametreleri
# Credential: Az önce tanımladığınız OAuth2 credential
# Resource: Message
# Event: Message Received
# Filters:
#   - Label: support (özel etiket)
#   - Include Spam/Trash: false

Önemli: “Mark as Read” seçeneğini aktif etmezseniz aynı e-postayı defalarca işleyebilirsiniz. Production’da bu seçenek mutlaka açık olmalı.

IF Node ile Öncelik Belirleme

Gelen e-postanın konu satırını analiz etmek için IF node kullanıyoruz:

# IF Node koşulları (n8n expression syntax)
# Koşul 1 - Kritik öncelik:
{{ $json.subject.toLowerCase().includes('urgent') || 
   $json.subject.toLowerCase().includes('kritik') ||
   $json.subject.toLowerCase().includes('acil') }}

# Koşul 2 - Yüksek öncelik:
{{ $json.subject.toLowerCase().includes('important') ||
   $json.subject.toLowerCase().includes('önemli') }}

Bu yaklaşım basit ama işe yarıyor. Daha sofistike bir sınıflandırma için n8n’in OpenAI entegrasyonu ile konu satırını ve e-posta gövdesini analiz ettirebilirsiniz. Ancak önce basit yöntemle başlayıp ihtiyaç duydukça karmaşıklaştırmanızı öneririm.

Gerçek Dünya Senaryosu: Fatura Takip Otomasyonu

Bu workflow’u bir muhasebe ekibi için kurmuştum ve gerçekten büyük zaman tasarrufu sağladı. Senaryo şu: Tedarikçilerden gelen fatura e-postaları otomatik olarak kategorize edilecek, PDF ekleri indirilecek, ilgili klasöre kaydedilecek ve muhasebe yazılımına bildirim gönderilecek.

# Workflow node sırası:
# 1. Gmail Trigger (Tetikleyici)
# 2. Filter: Ekli e-postalar (has_attachment: true)
# 3. Gmail Get Attachment (PDF'i al)
# 4. Google Drive Upload (Klasöre kaydet)
# 5. HTTP Request (Muhasebe API'sine bildirim)
# 6. Gmail Send (Alındı e-postası gönder)

Gmail node’unda eki almak için şu expression kullanılıyor:

# Ek adını ve içeriğini almak için
# Node: Gmail > Get Message
# Include: Attachment Data: true

# Ek verisine erişim
{{ $json.attachments[0].name }}
{{ $json.attachments[0].data }}  # Base64 encoded
{{ $json.attachments[0].mimeType }}

Google Drive’a yüklerken dikkat etmeniz gereken bir nokta var: n8n’deki Google Drive node’u dosyayı binary data olarak bekliyor. Gmail’den gelen attachment Base64 formatında olduğu için bir dönüşüm adımı gerekiyor. Bunun için “Move Binary Data” node’unu kullanabilirsiniz.

Set Node ile Veri Dönüşümü

Workflow’lar arasında veri taşırken Set node’u çok işime yarıyor:

# Fatura bilgilerini yapılandırmak için Set Node
# sender: {{ $json.from.value[0].address }}
# subject: {{ $json.subject }}
# date: {{ $json.date }}
# attachmentCount: {{ $json.attachments.length }}
# invoiceId: {{ $now.format('YYYYMMDD') }}-{{ $json.from.value[0].address.split('@')[0] }}

Bu şekilde sonraki node’lara temiz ve yapılandırılmış veri aktarıyorsunuz. Karmaşık workflow’larda bu adımı atlamak debugging süreçlerini çok zorlaştırıyor, deneyimlerimden söylüyorum.

E-posta Gönderme: Template Kullanımı

n8n ile e-posta göndermek Gmail Send node’u ile çok kolay ama template yönetimi biraz dikkat istiyor. HTML e-postalar için inline CSS kullanmanız gerekiyor çünkü çoğu e-posta istemcisi harici CSS dosyalarını desteklemiyor.

# Gmail Send Node - HTML Template Örneği
# To: {{ $json.from.value[0].address }}
# Subject: Re: {{ $json.subject }}
# Content Type: HTML
# Message Body:
# E-posta gövdesi için HTML template
<html>
<body style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
  <div style="background-color: #f4f4f4; padding: 20px;">
    <h2 style="color: #333;">Talebiniz Alındı</h2>
    <p>Sayın {{ $('Gmail Trigger').item.json.from.value[0].name }},</p>
    <p>Talebiniz <strong>{{ $now.format('DD.MM.YYYY HH:mm') }}</strong> tarihinde alındı.</p>
    <p>Referans numaranız: <strong>{{ $json.invoiceId }}</strong></p>
    <hr style="border: 1px solid #ddd;">
    <p style="color: #666; font-size: 12px;">Bu e-posta otomatik olarak gönderilmiştir.</p>
  </div>
</body>
</html>

n8n expression syntax’ında çift süslü parantez içinde JavaScript yazabiliyorsunuz. Önceki node’ların verilerine erişmek için $('NodeAdı').item.json.fieldName formatını kullanıyorsunuz. Bunu kavramak başta biraz zaman alıyor ama alıştıktan sonra çok güçlü.

Hata Yönetimi ve Error Handling

Production workflow’larında en çok ihmal edilen konu hata yönetimi. Gmail API rate limit’lerine takılmak, token süresinin dolması veya ağ sorunları iş akışını durdurabilir. n8n’de hata yönetimi için birkaç katman var:

# Error Trigger Node kullanımı
# Workflow > Settings > Error Workflow kısmından
# hata yakalama workflow'u tanımlayabilirsiniz

# Örnek hata bildirimi için Slack message:
Workflow Hatası!
Workflow: {{ $workflow.name }}
Node: {{ $execution.error.node.name }}
Hata: {{ $execution.error.message }}
Zaman: {{ $now.format('DD.MM.YYYY HH:mm:ss') }}

Gmail API için özel olarak dikkat etmeniz gereken rate limit değerleri var. Gmail API günlük 1 milyar quota birimi veriyor ama bir e-posta okuma 5 birim, gönderme 100 birim harcıyor. Yüksek hacimli işlemler için bu limitleri göz önünde bulundurun.

Retry mantığı için n8n’in built-in “On Error” seçeneğini kullanabilirsiniz:

# Node Settings > On Error
# Stop Workflow: Hata durumunda durdur (varsayılan)
# Continue: Hatayı yoksay ve devam et
# Continue (using error output): Hatayı yakala ve özel akışa yönlendir

# Retry on Fail seçeneği ile:
# Retry Count: 3
# Wait Between Tries: 5000 ms

Gelişmiş Senaryo: E-posta Tabanlı Onay Sistemi

Bu senaryoyu bir yazılım şirketinin deployment süreçleri için kurmuştum. Fikir şu: Bir deployment talep edildiğinde ilgili yöneticiye e-posta gönderiliyor, yönetici “Onayla” veya “Reddet” linkine tıklıyor, n8n bu yanıtı yakalıyor ve CI/CD pipeline’ı tetikliyor ya da durduruyor.

# Onay e-postası için link oluşturma
# n8n webhook URL'si kullanılıyor

# Onay linki:
https://your-n8n.com/webhook/deploy-approve?token={{ $json.deployToken }}&action=approve

# Red linki:
https://your-n8n.com/webhook/deploy-approve?token={{ $json.deployToken }}&action=reject

İkinci workflow webhook trigger ile başlıyor:

# Webhook Node Konfigürasyonu
# HTTP Method: GET
# Path: deploy-approve
# Authentication: None (token ile kendi authentication'ımızı yapıyoruz)

# Gelen parametreleri okuma:
# {{ $json.query.token }}
# {{ $json.query.action }}

Token doğrulama için basit bir Redis veya n8n’in kendi statik data depolama yeteneğini kullanabilirsiniz. Büyük ölçekli sistemler için harici bir veritabanı daha güvenli olacaktır.

Gmail Etiket Otomasyonu

n8n üzerinden Gmail etiketlerini programatik olarak yönetmek, inbox’ı düzenli tutmak için harika. Özellikle büyük ekiplerde ortak bir Gmail hesabı kullanılıyorsa bu çok değerli:

# Gmail node ile etiket ekleme/kaldırma
# Resource: Message
# Operation: Modify
# Message ID: {{ $json.id }}

# Eklenecek etiketler için Label IDs:
# INBOX, STARRED, IMPORTANT gibi sistem etiketleri
# ya da Label_XXXXXXXXX formatında özel etiket ID'leri

# Etiket ID'lerini bulmak için Gmail API:
GET https://gmail.googleapis.com/gmail/v1/users/me/labels
Authorization: Bearer YOUR_ACCESS_TOKEN

Özel etiket ID’lerini bulmak için n8n içinde bir test workflow’u çalıştırıp Gmail Labels List node’u ile tüm etiketleri listeleyebilirsiniz. Bu ID’leri bir kere not alın, workflow’larda doğrudan kullanacaksınız.

Performans ve İzleme

Workflow’larınız production’a çıktığında ne kadar iyi çalıştığını takip etmeniz gerekiyor. n8n’in built-in execution history oldukça işlevsel ama büyük hacimlerde yavaşlayabiliyor. Loki veya Elasticsearch ile log shipping yapabilirsiniz:

# n8n'i log yapılandırmasıyla başlatma
# docker-compose.yml
version: '3.8'
services:
  n8n:
    image: n8nio/n8n
    environment:
      - N8N_LOG_LEVEL=info
      - N8N_LOG_OUTPUT=console,file
      - N8N_LOG_FILE_LOCATION=/home/node/.n8n/logs/n8n.log
      - EXECUTIONS_DATA_SAVE_ON_ERROR=all
      - EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
      - EXECUTIONS_DATA_SAVE_ON_PROGRESS=false
      - EXECUTIONS_DATA_MAX_AGE=168

EXECUTIONS_DATA_SAVE_ON_SUCCESS=none ayarı başarılı execution’ların kaydedilmesini engelliyor. Yüksek hacimli workflow’larda bu database’i şişirmeyin diye önemli bir optimizasyon.

Workflow Execution Sürelerini İzleme

# n8n execution istatistiklerini PostgreSQL'den çekmek için
# (n8n'i PostgreSQL ile kullanıyorsanız)
SELECT 
  workflow_id,
  COUNT(*) as total_executions,
  AVG(EXTRACT(EPOCH FROM (stopped_at - started_at))) as avg_duration_sec,
  SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) as error_count
FROM execution_entity
WHERE started_at > NOW() - INTERVAL '7 days'
GROUP BY workflow_id
ORDER BY total_executions DESC;

Güvenlik Konuları

E-posta otomasyonunda güvenlik ihmal edilmemesi gereken kritik bir alan. Birkaç pratik önlem:

  • OAuth token rotasyonu: n8n OAuth token’ları otomatik yeniliyor ama credential’ların periyodik olarak revoke edilip yeniden tanımlanmasını öneririm
  • Webhook authentication: Dışarıdan tetiklenen webhook’lara mutlaka authentication ekleyin. n8n’in Header Auth veya Basic Auth seçeneklerini kullanın
  • E-posta içeriği sanitizasyonu: Gelen e-posta içeriklerini doğrudan SQL sorgusu veya shell command’a geçirmeyin. n8n expression’larında bile injection riski var, kullanıcı girdilerini her zaman sanitize edin
  • Credential şifreleme: n8n’in N8N_ENCRYPTION_KEY environment variable’ını mutlaka ayarlayın, aksi takdirde credential’lar şifresiz saklanıyor
  • IP kısıtlaması: Gmail API’ye erişen n8n instance’ının IP adresini Google Cloud Console’da allowlist’e ekleyebilirsiniz
# .env dosyasında güvenlik ayarları
N8N_ENCRYPTION_KEY=your-super-secret-32-char-minimum-key
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=your-strong-password
WEBHOOK_URL=https://your-domain.com

Sonuç

n8n ile Gmail entegrasyonu, e-posta otomasyonuna gerçekten farklı bir bakış açısı getiriyor. Görsel workflow editörü sayesinde hem teknik hem de teknik olmayan ekip üyeleri iş akışlarını anlayabiliyor ve düzenleyebiliyor. Birkaç kişilik bir ekipte bile “bu script ne yapıyor” sorusundan kurtuluyorsunuz.

Pratik önerilerim şunlar: Önce basit bir “e-posta gelince Slack’e bildir” workflow’u ile başlayın, sistemi anlayın. Sonra kademeli olarak filtreler, dönüşümler ve yan akışlar ekleyin. Hata yönetimini en baştan kurun, sonradan eklemeye çalışmak çok daha zor. OAuth2 sıkıntıları yaşarsanız doğrudan App Password ile başlayıp ilerleyen aşamada OAuth2’ye geçin.

En son kurduğum workflow günlük yaklaşık 500 e-postayı işliyor ve sıfır manuel müdahale ile çalışıyor. İlk kurulum 2-3 saat aldı, ama o günden bu yana kazandığım zaman hesaba katılamaz. E-posta otomasyonu, sysadmin dünyasında “neden daha önce yapmadım” dedirten konuların başında geliyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir