0Pricing
AI Agents · Ders

API Üzerinden Gmail'e Bağlanma

Google API istemci kitaplığı, OAuth2 izni ve Gmail kapsamı seçimi.

API Üzerinden Gmail'e Bağlanma, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.

SMTP Yerine Gmail API'si Neden Kullanılır?

Geleneksel e-posta otomasyonu SMTP/IMAP kullanır; ancak Gmail API'si çok daha fazlasını sunar: ileti dizilerini okuma, sorguyla arama, etiketleri yönetme ve tam kimlik doğrulamayla gönderme. Ayrıca OAuth 2.0'ı desteklediği için ajanınız hiçbir zaman parola saklamaz; yalnızca sınırlı kapsamlı bir erişim belirteci saklar.

Gmail API'si, Google Workspace API'lerinin bir parçasıdır ve google-api-python-client kitaplığı aracılığıyla kullanılır.

# Install required libraries:
# pip install google-api-python-client google-auth google-auth-oauthlib

# The Gmail API lets agents:
# - List and search messages (labels, queries)
# - Read full message content and attachments
# - Send messages via OAuth (no password needed)
# - Manage labels and threads
# - Watch for new messages via push notifications

print('Gmail API is part of Google Workspace APIs')

Kimlik Doğrulama: Hizmet Hesabı ve Kullanıcı Kimlik Doğrulaması

Gmail API'si için iki kimlik doğrulama yaklaşımı vardır:

  • Hizmet Hesabı: alan genelinde yetkilendirmeyle çalışma alanı veya kurumsal kullanım için en uygunudur; kullanıcı etkileşimi gerekmez
  • Kullanıcı OAuth'u (izin ekranlı OAuth2): kişisel Gmail hesapları için gereklidir; kullanıcı erişim iznini bir kez verir, ajan yenileme belirtecini kullanır

Çoğu ajan otomasyonu için hizmet hesapları, güvenilirlikleri nedeniyle tercih edilir.

# Service Account approach:
# 1. Go to Google Cloud Console -> APIs & Services -> Credentials
# 2. Create a Service Account
# 3. Download the JSON key file
# 4. In Google Workspace Admin: enable domain-wide delegation
# 5. Grant required scopes to the service account

# User OAuth approach:
# 1. Create OAuth 2.0 Client ID (Desktop or Web App type)
# 2. Download credentials.json
# 3. First run: user sees consent screen and grants access
# 4. Agent stores token.json with refresh token for subsequent runs

print('Choose service account for org automation, OAuth for personal Gmail')

OAuth2 Kimlik Bilgilerinin JSON Yapısı

Google, kimlik doğrulamak için ajanınızın yüklediği kimlik bilgilerini bir JSON dosyasında sağlar. Kullanıcı OAuth'u için bu dosya, Google Cloud Console'dan indirilen credentials.json dosyasıdır. Dosya istemci kimliğinizi, gizli anahtarınızı ve yönlendirme URI'nizi içerir; bunu hiçbir zaman sürüm denetimine göndermeyin.

# credentials.json structure (User OAuth — Desktop app type):
# {
#   "installed": {
#     "client_id": "123456789.apps.googleusercontent.com",
#     "client_secret": "GOCSPX-abc123xyz",
#     "redirect_uris": ["urn:ietf:wg:oauth:2.0:oob", "http://localhost"],
#     "auth_uri": "https://accounts.google.com/o/oauth2/auth",
#     "token_uri": "https://oauth2.googleapis.com/token"
#   }
# }

# service-account.json structure:
# {
#   "type": "service_account",
#   "project_id": "my-project",
#   "private_key_id": "abc123",
#   "private_key": "-----BEGIN PRIVATE KEY-----\n...",
#   "client_email": "agent@my-project.iam.gserviceaccount.com",
#   "client_id": "..."
# }

print('Store credential files outside your git repository')

Gmail API Kapsamları

OAuth kapsamları, ajanınızın tam olarak nereye erişebileceğini belirler. Yalnızca ihtiyacınız olan kapsamları isteyin; bu, en az ayrıcalık ilkesidir. Gmail kapsamları salt okunur erişimden tam erişime kadar değişir.

  • gmail.readonly — tüm postaları okuma
  • gmail.send — yalnızca gönderme, okuma yok
  • gmail.modify — okuma, gönderme ve etiketleri değiştirme
  • gmail.compose — yalnızca taslak oluşturma
# Gmail API scope constants
SCOPE_READONLY = 'https://www.googleapis.com/auth/gmail.readonly'
SCOPE_SEND = 'https://www.googleapis.com/auth/gmail.send'
SCOPE_MODIFY = 'https://www.googleapis.com/auth/gmail.modify'
SCOPE_COMPOSE = 'https://www.googleapis.com/auth/gmail.compose'

# Calendar scopes (often used alongside Gmail)
SCOPE_CALENDAR_READ = 'https://www.googleapis.com/auth/calendar.readonly'
SCOPE_CALENDAR_EVENTS = 'https://www.googleapis.com/auth/calendar.events'

# Combine scopes your agent actually needs
AGENT_SCOPES = [
    SCOPE_READONLY,
    SCOPE_SEND,
    SCOPE_CALENDAR_EVENTS
]
print(f'Using {len(AGENT_SCOPES)} scopes')

Kullanıcı OAuth'u: İlk Kimlik Doğrulama Akışı

Bir kullanıcı ajanı ilk kez çalıştırdığında izin vermesi için bir tarayıcı açılır. Ajan, elde edilen belirteci token.json dosyasında saklar. Sonraki çalıştırmalarda saklanan belirteci yükler ve otomatik olarak yeniler; tarayıcıyla etkileşim gerekmez.

from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
import os

SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

def get_credentials(token_file='token.json', creds_file='credentials.json'):
    creds = None

    # Load existing token if available
    if os.path.exists(token_file):
        creds = Credentials.from_authorized_user_file(token_file, SCOPES)

    # Refresh or re-authenticate if needed
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())  # auto-refresh
        else:
            # Opens browser for user consent (first time only)
            flow = InstalledAppFlow.from_client_secrets_file(
                creds_file, SCOPES
            )
            creds = flow.run_local_server(port=0)
        # Save token for next run
        with open(token_file, 'w') as f:
            f.write(creds.to_json())

    return creds

Hizmet Hesabı Kimlik Doğrulaması

Kullanıcı etkileşimi olmadan çalışan otomatik ajanlar için hizmet hesapları idealdir. Ajan, özel bir anahtarla kimlik doğrular ve ardından alan genelinde yetkilendirme aracılığıyla bir Google Workspace kullanıcısının kimliğine bürünür. İzin ekranı yok, tarayıcı yok; yalnızca bir JSON anahtar dosyası vardır.

from google.oauth2 import service_account
import os

SCOPES = [
    'https://www.googleapis.com/auth/gmail.readonly',
    'https://www.googleapis.com/auth/gmail.send'
]

def get_service_account_credentials(impersonate_user):
    service_account_file = os.environ.get(
        'GOOGLE_SERVICE_ACCOUNT_JSON',
        'service-account.json'
    )

    credentials = service_account.Credentials.from_service_account_file(
        service_account_file,
        scopes=SCOPES
    )

    # Impersonate a real user (requires domain-wide delegation in Admin)
    delegated = credentials.with_subject(impersonate_user)
    return delegated

creds = get_service_account_credentials('agent@yourcompany.com')
print('Service account credentials ready')

Gmail Hizmet Nesnesini Oluşturma

Kimlik bilgilerine sahip olduğunuzda Gmail hizmet nesnesini oluşturmak için googleapiclient.discovery.build() kullanın. Bu, tüm Gmail API çağrılarının ana arayüzüdür. Hizmet adı olarak 'gmail' ve sürüm olarak 'v1' değerlerini geçirin.

from googleapiclient.discovery import build

def build_gmail_service(credentials):
    service = build(
        'gmail',
        'v1',
        credentials=credentials,
        cache_discovery=False  # avoid file warnings in some environments
    )
    return service

# Full setup: credentials -> service
creds = get_credentials()          # or get_service_account_credentials()
gmail = build_gmail_service(creds)

# Test: get user profile
profile = gmail.users().getProfile(userId='me').execute()
print('Email:', profile['emailAddress'])
print('Total messages:', profile['messagesTotal'])

Takvim Hizmet Nesnesini Oluşturma

Aynı kimlik bilgisi kurulumu Google Takvim için de çalışır. Yalnızca 'calendar' ve 'v3' değerleriyle oluşturun. Aynı ajan içinde hem Gmail'e hem de Takvim'e ihtiyacınız varsa iki hizmeti de aynı kimlik bilgileri nesnesinden oluşturun.

from googleapiclient.discovery import build

def build_google_services(credentials):
    gmail = build(
        'gmail', 'v1',
        credentials=credentials,
        cache_discovery=False
    )
    calendar = build(
        'calendar', 'v3',
        credentials=credentials,
        cache_discovery=False
    )
    return gmail, calendar

# Use both in one agent
creds = get_credentials()
gmail_service, calendar_service = build_google_services(creds)

# Test calendar access
cal_list = calendar_service.calendarList().list().execute()
for cal in cal_list.get('items', []):
    print(f'Calendar: {cal["summary"]}')

Google API Hatalarını İşleme

Google API hataları googleapiclient.errors.HttpError olarak oluşturulur. Hata, bir HTTP durum kodu ve hata ayrıntılarını içeren bir JSON gövdesi barındırır. Hata ayıklama için durum ve iletiyi günlük kaydına yazmak üzere bunu her zaman yakalayın.

from googleapiclient.errors import HttpError
import json

def safe_gmail_call(service, user_id='me'):
    try:
        profile = service.users().getProfile(userId=user_id).execute()
        return profile
    except HttpError as e:
        status = e.resp.status
        try:
            error_body = json.loads(e.content.decode())
            message = error_body.get('error', {}).get('message', str(e))
        except Exception:
            message = str(e)

        if status == 401:
            print('AUTH ERROR: Credentials invalid or expired')
        elif status == 403:
            print(f'PERMISSION ERROR: {message}')
            print('Check scopes and domain-wide delegation settings')
        elif status == 429:
            print('QUOTA EXCEEDED: Gmail API rate limit hit')
        else:
            print(f'Gmail API error {status}: {message}')
        return None

Google API Kotaları ve Hız Sınırları

Gmail API'sinin kullanım kotaları vardır: Varsayılan olarak günde 1 milyar kota birimi bulunur ve her çağrı, işleme bağlı olarak 1 ila 100 birime mal olur. İletileri okumak listelemekten daha maliyetlidir. Sınırlar içinde kalmak için 429/503 hatalarında toplu istekler ve üstel geri çekilme kullanın.

import time
from googleapiclient.errors import HttpError

def gmail_call_with_retry(func, max_retries=5):
    for attempt in range(max_retries):
        try:
            return func()
        except HttpError as e:
            if e.resp.status in (429, 500, 503):
                wait = (2 ** attempt) + 1
                print(f'Quota/server error. Waiting {wait}s (attempt {attempt+1})')
                time.sleep(wait)
            elif e.resp.status == 403:
                # Check if it's a quota exceeded vs permission error
                import json
                body = json.loads(e.content.decode())
                reason = body.get('error', {}).get('errors', [{}])[0].get('reason', '')
                if reason == 'rateLimitExceeded':
                    time.sleep(2 ** attempt)
                else:
                    raise  # real permission error, don't retry
            else:
                raise
    raise Exception(f'Gmail API call failed after {max_retries} attempts')

Kimlik Bilgilerini Güvenli Saklama

token.json, credentials.json veya service-account.json dosyalarını hiçbir zaman sürüm denetimine göndermeyin. Bunları .gitignore dosyasına ekleyin. Üretimde hizmet hesabı JSON'ını bir ortam değişkeninde veya gizli bilgiler yöneticisinde saklayın ve çalışma zamanında yükleyin.

import json
import os
from google.oauth2 import service_account

SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

def get_credentials_from_env():
    # Load service account JSON from environment variable
    sa_json = os.environ.get('GOOGLE_SERVICE_ACCOUNT_JSON')
    if not sa_json:
        raise EnvironmentError(
            'GOOGLE_SERVICE_ACCOUNT_JSON env var not set. '
            'Set it to the contents of your service-account.json'
        )

    sa_info = json.loads(sa_json)
    credentials = service_account.Credentials.from_service_account_info(
        sa_info,
        scopes=SCOPES
    )
    return credentials

# In production: export GOOGLE_SERVICE_ACCOUNT_JSON=$(cat service-account.json)
creds = get_credentials_from_env()
print('Service account loaded from env var')

Hızlı Sınama: Hizmet Hesabı ve Kullanıcı OAuth'u

Gmail API'sinin kimlik doğrulama yöntemlerini ne kadar anladığınızı sınayın.

Gmail API'sine Bağlanmanın Özeti

Artık bir ajanı Gmail'e bağlayabilirsiniz:

  • Kullanıcı OAuth'u: InstalledAppFlow kullanın ve token.json dosyasını saklayın; sonraki çalıştırmalarda otomatik yenileme yapılır
  • Hizmet Hesabı: JSON anahtarını yükleyin, yetkilendirme için .with_subject(user_email) çağrısını yapın
  • Kapsamlar: gereken en düşük kapsamları isteyin (gmail.readonly, gmail.send, calendar.events)
  • Hizmeti build('gmail', 'v1', credentials=creds) ile oluşturun
  • API hataları için HttpError yakalayın; 429/503 durumlarında yeniden deneyin
  • Kimlik bilgisi dosyalarını hiçbir zaman sürüm denetimine göndermeyin; üretimde ortam değişkenlerini kullanın

Sıkça Sorulan Sorular

“API Üzerinden Gmail'e Bağlanma” dersi ücretsiz mi?

Evet — “API Üzerinden Gmail'e Bağlanma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.

“API Üzerinden Gmail'e Bağlanma” dersinde ne öğreneceğim?

Google API istemci kitaplığı, OAuth2 izni ve Gmail kapsamı seçimi. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Agents öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“API Üzerinden Gmail'e Bağlanma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. API Üzerinden Gmail'e Bağlanma
  2. E-postaları Programlı Olarak Okuma ve Gönderme
  3. Takvim Etkinliği Oluşturma ve Sorgulama
  4. Basit Bir E-posta Asistanı Aracısı Oluşturma
← AI Agents Sayfasına Dön