0Pricing
AI Agents · Aula

Conectando-se ao Gmail pela API

Biblioteca cliente da API do Google, consentimento OAuth2 e seleção do escopo do Gmail.

Conectando-se ao Gmail pela API é uma aula grátis de AI Agents no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Agents, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Agents inclui 4 aulas no total.

Por que usar a API do Gmail em vez de SMTP?

A automação tradicional de e-mails usa SMTP/IMAP, mas a API do Gmail oferece muito mais: ler conversas, pesquisar por consulta, gerenciar marcadores e enviar mensagens com autenticação completa. Ela também oferece suporte ao OAuth 2.0, portanto seu agente nunca armazena uma senha — apenas um token de acesso com escopo limitado.

A API do Gmail faz parte das APIs do Google Workspace e é acessada por meio da biblioteca 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')

Autenticação: conta de serviço versus autenticação do usuário

Há duas abordagens de autenticação para a API do Gmail:

  • Conta de serviço: ideal para uso em ambientes de trabalho ou organizacionais com delegação em todo o domínio; não exige interação do usuário
  • OAuth do usuário (OAuth2 com tela de consentimento): necessário para contas pessoais do Gmail; o usuário concede acesso uma vez, e o agente usa um token de atualização

Para a maioria das automações de agentes, as contas de serviço são preferíveis por sua confiabilidade.

# 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')

Estrutura do JSON das credenciais OAuth2

O Google fornece as credenciais em um arquivo JSON que seu agente carrega para se autenticar. Para o OAuth do usuário, esse é um arquivo credentials.json baixado do Google Cloud Console. O arquivo contém o ID do cliente, o segredo e o URI de redirecionamento — nunca o confirme no controle de versão.

# 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')

Escopos da API do Gmail

Os escopos do OAuth definem exatamente o que seu agente pode acessar. Solicite somente os escopos necessários — esse é o princípio do menor privilégio. Os escopos do Gmail variam de acesso somente leitura a acesso completo.

  • gmail.readonly — ler todos os e-mails
  • gmail.send — somente enviar, sem leitura
  • gmail.modify — ler, enviar e modificar marcadores
  • gmail.compose — criar somente rascunhos
# 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 do usuário: fluxo da primeira autenticação

Na primeira vez que um usuário executa o agente, ele abre um navegador para que o usuário conceda permissão. O agente armazena o token resultante em token.json. Nas execuções seguintes, ele carrega o token armazenado e o atualiza automaticamente — não é necessária nenhuma interação com o navegador.

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

Autenticação com conta de serviço

Para agentes automatizados executados sem interação do usuário, as contas de serviço são ideais. O agente se autentica com uma chave privada e então assume a identidade de um usuário do Google Workspace por meio da delegação em todo o domínio. Não há tela de consentimento nem navegador — apenas um arquivo de chave 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')

Criando o objeto de serviço do Gmail

Depois de obter as credenciais, use googleapiclient.discovery.build() para criar o objeto de serviço do Gmail. Essa é a principal interface para todas as chamadas à API do Gmail. Passe o nome do serviço 'gmail' e a versão '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'])

Criando o objeto de serviço do Calendar

A mesma configuração de credenciais funciona para o Google Calendar. Basta criar o serviço com 'calendar' e 'v3'. Se precisar do Gmail e do Calendar no mesmo agente, crie os dois serviços usando o mesmo objeto de credenciais.

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"]}')

Lidando com erros da API do Google

Os erros da API do Google são gerados como googleapiclient.errors.HttpError. O erro contém um código de status HTTP e um corpo JSON com os detalhes do erro. Sempre capture esse erro e registre o status e a mensagem para facilitar a depuração.

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

Cotas e limites de requisições da API do Google

A API do Gmail tem cotas de uso: 1 bilhão de unidades de cota por dia por padrão, e cada chamada custa de 1 a 100 unidades, dependendo da operação. Ler mensagens custa mais do que listá-las. Use requisições em lote e espera exponencial em erros 429/503 para permanecer dentro dos limites.

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')

Armazenando credenciais com segurança

Nunca confirme token.json, credentials.json ou service-account.json no controle de versão. Adicione-os ao .gitignore. Em produção, armazene o JSON da conta de serviço em uma variável de ambiente ou em um gerenciador de segredos e carregue-o durante a execução.

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')

Verificação rápida: conta de serviço versus OAuth do usuário

Verifique se você compreendeu os métodos de autenticação da API do Gmail.

Recapitulação da conexão com a API do Gmail

Agora você consegue conectar um agente ao Gmail:

  • OAuth do usuário: use InstalledAppFlow + armazene token.json; atualize automaticamente nas execuções seguintes
  • Conta de serviço: carregue a chave JSON e chame .with_subject(user_email) para delegação
  • Escopos: solicite o mínimo necessário (gmail.readonly, gmail.send, calendar.events)
  • Crie o serviço com build('gmail', 'v1', credentials=creds)
  • Capture HttpError para erros da API; tente novamente em 429/503
  • Nunca confirme arquivos de credenciais — use variáveis de ambiente em produção

Perguntas Frequentes

A aula “Conectando-se ao Gmail pela API” é grátis?

Sim — o texto completo de “Conectando-se ao Gmail pela API” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Agents, atualize para CoddyKit PRO. O curso de AI Agents inclui 4 aulas no total.

O que vou aprender em “Conectando-se ao Gmail pela API”?

Biblioteca cliente da API do Google, consentimento OAuth2 e seleção do escopo do Gmail. Você pratica AI Agents com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar AI Agents?

Nenhuma experiência prévia é necessária. AI Agents no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Conectando-se ao Gmail pela API”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de AI Agents?

Sim. Cada aula de AI Agents inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Conectando-se ao Gmail pela API
  2. Lendo e enviando e-mails programaticamente
  3. Criação e consulta de eventos da agenda
  4. Criando um agente simples de assistência por e-mail
← Voltar para AI Agents