Menghubungkan ke Gmail melalui API
Pustaka klien Google API, persetujuan OAuth2, dan pemilihan scope Gmail.
Menghubungkan ke Gmail melalui API adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Mengapa Menggunakan Gmail API, Bukan SMTP?
Otomatisasi email tradisional menggunakan SMTP/IMAP, tetapi Gmail API menawarkan jauh lebih banyak kemampuan: membaca rangkaian percakapan, mencari berdasarkan kueri, mengelola label, dan mengirim dengan autentikasi lengkap. API ini juga mendukung OAuth 2.0, sehingga agen Anda tidak pernah menyimpan kata sandi — hanya token akses dengan cakupan terbatas.
Gmail API merupakan bagian dari Google Workspace APIs dan diakses melalui pustaka google-api-python-client.
# 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')Autentikasi: Akun Layanan vs Autentikasi Pengguna
Ada dua pendekatan autentikasi untuk Gmail API:
- Akun Layanan: paling sesuai untuk penggunaan di workspace atau organisasi dengan delegasi seluruh domain; tidak memerlukan interaksi pengguna
- OAuth Pengguna (OAuth2 dengan layar persetujuan): diperlukan untuk akun Gmail pribadi; pengguna memberikan akses sekali, lalu agen menggunakan token penyegaran
Untuk sebagian besar otomatisasi agen, akun layanan lebih disukai karena keandalannya.
# 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')Struktur JSON Kredensial OAuth2
Google menyediakan kredensial dalam file JSON yang dimuat oleh agen untuk melakukan autentikasi. Untuk OAuth Pengguna, file ini adalah credentials.json yang diunduh dari Google Cloud Console. File tersebut berisi ID klien, rahasia, dan URI pengalihan — jangan pernah memasukkannya ke sistem kontrol versi.
# 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')Cakupan Gmail API
Cakupan OAuth menentukan dengan tepat apa saja yang dapat diakses agen Anda. Minta hanya cakupan yang diperlukan — ini merupakan prinsip hak akses paling rendah. Cakupan Gmail berkisar dari akses hanya-baca hingga akses penuh.
gmail.readonly— membaca semua emailgmail.send— hanya mengirim, tanpa membacagmail.modify— membaca, mengirim, dan mengubah labelgmail.compose— hanya membuat draf
# 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')OAuth Pengguna: Alur Autentikasi Pertama Kali
Saat pengguna menjalankan agen untuk pertama kalinya, agen membuka peramban agar pengguna dapat memberikan izin. Agen menyimpan token yang dihasilkan dalam token.json. Pada proses berikutnya, agen memuat token yang tersimpan dan menyegarkannya secara otomatis — tidak diperlukan interaksi dengan peramban.
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 credsAutentikasi Akun Layanan
Untuk agen otomatis yang berjalan tanpa interaksi pengguna, akun layanan merupakan pilihan ideal. Agen melakukan autentikasi dengan kunci pribadi, lalu menyamar sebagai pengguna Google Workspace melalui delegasi seluruh domain. Tidak ada layar persetujuan atau peramban — hanya file kunci JSON.
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')Membangun Objek Layanan Gmail
Setelah memiliki kredensial, gunakan googleapiclient.discovery.build() untuk membuat objek layanan Gmail. Objek ini merupakan antarmuka utama untuk semua panggilan Gmail API. Teruskan nama layanan 'gmail' dan versi 'v1'.
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'])Membangun Objek Layanan Kalender
Penyiapan kredensial yang sama juga dapat digunakan untuk Google Calendar. Cukup bangun dengan 'calendar' dan 'v3'. Jika memerlukan Gmail dan Calendar dalam satu agen, bangun kedua layanan dari objek kredensial yang sama.
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"]}')Menangani Error Google API
Error Google API muncul sebagai googleapiclient.errors.HttpError. Error tersebut berisi kode status HTTP dan isi JSON yang memuat detail error. Selalu tangkap error ini dan catat status serta pesannya untuk keperluan penelusuran kesalahan.
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 NoneKuota dan Batas Laju Google API
Gmail API memiliki kuota penggunaan: secara bawaan, 1 miliar unit kuota per hari, dengan setiap panggilan menghabiskan 1–100 unit bergantung pada operasinya. Membaca pesan membutuhkan biaya lebih besar daripada membuat daftar pesan. Gunakan permintaan batch dan penundaan eksponensial pada error 429/503 agar tetap berada dalam batas.
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')Menyimpan Kredensial dengan Aman
Jangan pernah memasukkan token.json, credentials.json, atau service-account.json ke sistem kontrol versi. Tambahkan semuanya ke .gitignore. Dalam produksi, simpan JSON akun layanan dalam variabel lingkungan atau pengelola rahasia, lalu muat saat runtime.
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')Pemeriksaan Singkat: Akun Layanan vs OAuth Pengguna
Uji pemahaman Anda tentang metode autentikasi Gmail API.
Ringkasan Koneksi Gmail API
Sekarang Anda dapat menghubungkan agen ke Gmail:
- OAuth Pengguna: gunakan
InstalledAppFlow+ simpantoken.json; lakukan penyegaran otomatis pada proses berikutnya - Akun Layanan: muat kunci JSON, panggil
.with_subject(user_email)untuk delegasi - Cakupan: minta cakupan minimum yang diperlukan (
gmail.readonly,gmail.send,calendar.events) - Bangun layanan dengan
build('gmail', 'v1', credentials=creds) - Tangkap
HttpErroruntuk error API; coba lagi pada 429/503 - Jangan pernah memasukkan file kredensial ke sistem kontrol versi — gunakan variabel lingkungan dalam produksi
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menghubungkan ke Gmail melalui API” gratis?
Ya — teks lengkap “Menghubungkan ke Gmail melalui API” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menghubungkan ke Gmail melalui API”?
Pustaka klien Google API, persetujuan OAuth2, dan pemilihan scope Gmail. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Menghubungkan ke Gmail melalui API” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menghubungkan ke Gmail melalui API
- Membaca dan Mengirim Email Secara Terprogram
- Membuat dan Menanyakan Acara Kalender
- Membangun Agen Asisten Email Sederhana