📧 Configuração Gmail API com OAuth 2.0¶
📋 Visão Geral¶
Este guia explica como configurar o envio de emails usando Gmail API com OAuth 2.0, que é a solução recomendada para produção por ser mais robusta e segura que SMTP com senha de app.
✅ Vantagens do OAuth 2.0¶
- ✅ Mais seguro (tokens revogáveis)
- ✅ Sem limite rígido de 500 emails/dia
- ✅ Melhor rastreabilidade e logs
- ✅ Funciona melhor em ambientes de produção
- ✅ Suporte a delegação de acesso
🚀 Passo 1: Criar Projeto no Google Cloud Console¶
1.1 Acessar Google Cloud Console¶
- Acesse: https://console.cloud.google.com/
- Faça login com sua conta Google
- Selecione ou crie um projeto
- Clique no seletor de projeto no topo
- Clique em "NOVO PROJETO"
- Nome:
ifriend-gmail-api(ou similar) - Clique em "CRIAR"
📬 Passo 2: Ativar Gmail API¶
2.1 Habilitar a API¶
- No console, vá para APIs & Services > Library
- Busque por "Gmail API"
- Clique em "Gmail API"
- Clique em ENABLE (ATIVAR)
🔐 Passo 3: Criar Credenciais OAuth 2.0¶
3.1 Configurar Tela de Consentimento¶
- Vá para APIs & Services > OAuth consent screen
- Escolha Externo (External) se não tiver Google Workspace
- Preencha as informações obrigatórias:
- App name: iFriend Agent
- User support email: seu-email@theifriend.com
- Developer contact: seu-email@theifriend.com
- Clique em SAVE AND CONTINUE
- Em "Scopes", clique em ADD OR REMOVE SCOPES
- Adicione o escopo:
https://www.googleapis.com/auth/gmail.send - Clique em UPDATE e depois SAVE AND CONTINUE
- Em "Test users", adicione o email que enviará os emails (ex: no-reply@theifriend.com)
- Clique em SAVE AND CONTINUE
3.2 Criar Credenciais¶
- Vá para APIs & Services > Credentials
- Clique em + CREATE CREDENTIALS > OAuth client ID
- Application type: Desktop app (mais fácil para obter refresh token)
- Name:
iFriend Gmail OAuth - Clique em CREATE
- IMPORTANTE: Copie e salve:
Client ID(algo como:123456-abc.apps.googleusercontent.com)Client Secret(algo como:GOCSPX-abc123...)
🎫 Passo 4: Obter Refresh Token¶
4.1 Instalar Google OAuth CLI (local)¶
pip install --upgrade google-auth-oauthlib google-auth-httplib2 google-api-python-client
4.2 Script para Gerar Refresh Token¶
Crie um arquivo get_gmail_refresh_token.py:
#!/usr/bin/env python3
"""
Script para obter refresh token do Gmail API.
"""
from google_auth_oauthlib.flow import InstalledAppFlow
import json
# Escopos necessários
SCOPES = ['https://www.googleapis.com/auth/gmail.send']
def main():
"""Executa fluxo OAuth para obter refresh token."""
# Solicitar credenciais
print("=" * 60)
print("OBTER REFRESH TOKEN - GMAIL API")
print("=" * 60)
client_id = input("\nInforme o Client ID: ").strip()
client_secret = input("Informe o Client Secret: ").strip()
# Criar configuração do cliente
client_config = {
"installed": {
"client_id": client_id,
"client_secret": client_secret,
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"redirect_uris": ["http://localhost"],
}
}
# Executar fluxo OAuth
flow = InstalledAppFlow.from_client_config(
client_config,
scopes=SCOPES
)
print("\n🔓 Abrindo navegador para autorização...")
print(" Faça login com a conta que enviará os emails")
print(" (ex: no-reply@theifriend.com)\n")
creds = flow.run_local_server(port=0)
# Exibir tokens
print("\n" + "=" * 60)
print("✅ AUTORIZAÇÃO CONCLUÍDA!")
print("=" * 60)
print("\n📋 COPIE ESTAS INFORMAÇÕES:\n")
print(f"GMAIL_USER={input('Digite o email usado na autorização: ')}")
print(f"GOOGLE_CLIENT_ID={client_id}")
print(f"GOOGLE_CLIENT_SECRET={client_secret}")
print(f"GOOGLE_REFRESH_TOKEN={creds.refresh_token}")
print("\n💡 Adicione estas variáveis ao .env ou Cloud Run")
print("=" * 60)
if __name__ == "__main__":
main()
4.3 Executar o Script¶
python get_gmail_refresh_token.py
O que acontecerá: 1. Você informará Client ID e Client Secret 2. Um navegador abrirá para você autorizar o app 3. Faça login com o email que enviará mensagens 4. Autorize o acesso ao Gmail 5. O script exibirá o REFRESH_TOKEN - COPIE E GUARDE COM SEGURANÇA!
⚙️ Passo 5: Configurar Variáveis de Ambiente¶
5.1 Desenvolvimento Local (.env)¶
Adicione ao arquivo .env:
# Gmail API OAuth 2.0
GMAIL_USER=no-reply@theifriend.com
GMAIL_FROM_NAME=Agente de IA iFriend
GOOGLE_CLIENT_ID=123456-abc.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-abc123def456
GOOGLE_REFRESH_TOKEN=1//0abc123def456ghi789jkl
5.2 Google Cloud (Cloud Build / Cloud Run)¶
Opção A: Via Console Web¶
- Acesse: https://console.cloud.google.com/cloud-build/triggers
- Edite seu trigger (ex:
slack-bot-deploy) - Em Variáveis de substituição, adicione:
_GMAIL_USER = no-reply@theifriend.com
_GMAIL_FROM_NAME = Agente de IA iFriend
_GOOGLE_CLIENT_ID = 123456-abc.apps.googleusercontent.com
_GOOGLE_CLIENT_SECRET = GOCSPX-abc123def456
_GOOGLE_REFRESH_TOKEN = 1//0abc123def456ghi789jkl
Opção B: Via cloudbuild.yaml¶
Já está configurado! Apenas substitua os placeholders:
substitutions:
_GMAIL_USER: 'no-reply@theifriend.com'
_GMAIL_FROM_NAME: 'Agente de IA iFriend'
_GOOGLE_CLIENT_ID: 'SEU_CLIENT_ID_AQUI'
_GOOGLE_CLIENT_SECRET: 'SEU_CLIENT_SECRET_AQUI'
_GOOGLE_REFRESH_TOKEN: 'SEU_REFRESH_TOKEN_AQUI'
Opção C: Google Secret Manager (Recomendado para Produção)¶
# 1. Criar secrets
echo -n "SEU_CLIENT_SECRET" | gcloud secrets create gmail-client-secret --data-file=-
echo -n "SEU_REFRESH_TOKEN" | gcloud secrets create gmail-refresh-token --data-file=-
# 2. Dar permissão ao Cloud Run
PROJECT_NUMBER=$(gcloud projects describe ifriend-platform --format="value(projectNumber)")
gcloud secrets add-iam-policy-binding gmail-client-secret \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
gcloud secrets add-iam-policy-binding gmail-refresh-token \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
# 3. No Cloud Run deployment, usar:
--set-secrets=GOOGLE_CLIENT_SECRET=gmail-client-secret:latest,GOOGLE_REFRESH_TOKEN=gmail-refresh-token:latest
🧪 Passo 6: Testar a Configuração¶
6.1 Teste Local¶
python test_gmail_smtp.py
O script testará a conexão e enviará um email de teste.
6.2 Teste Manual¶
import asyncio
from ifriend_agent.tools.enviar_email_tool import enviar_email_tool
async def test():
result = await enviar_email_tool(
destinatario_email="seu-email@gmail.com",
assunto="Teste Gmail OAuth 2.0",
corpo_mensagem="<h1>Funcionou! 🎉</h1><p>OAuth configurado corretamente.</p>"
)
print(result)
asyncio.run(test())
🔒 Segurança¶
✅ Boas Práticas¶
- NUNCA comite tokens no Git
- Use Google Secret Manager em produção
- Rotacione tokens periodicamente
- Use contas de serviço dedicadas
- Monitore uso da API no Google Cloud Console
- Configure alertas de quota
🔄 Revogar Acesso¶
Se precisar revogar tokens:
- Acesse: https://myaccount.google.com/permissions
- Encontre "iFriend Agent"
- Clique em "Remover acesso"
- Gere novos tokens
📊 Limites e Quotas¶
| Recurso | Limite |
|---|---|
| Emails por dia (usuário Gmail gratuito) | ~500* |
| Emails por dia (Google Workspace) | 2.000-10.000* |
| Tamanho máximo do email | 35 MB |
| Destinatários por email | 100 |
| Taxa de envio | ~100/segundo |
* Limites podem variar. Verifique: https://support.google.com/a/answer/166852
🐛 Troubleshooting¶
Erro: "invalid_grant"¶
Causa: Refresh token expirado ou inválido
Solução:
1. Gere um novo refresh token (Passo 4)
2. Atualize a variável GOOGLE_REFRESH_TOKEN
Erro: "insufficient authentication scopes"¶
Causa: Escopo gmail.send não autorizado
Solução:
1. Revogue acesso (ver seção Segurança)
2. Execute novamente o script do Passo 4
3. Autorize o escopo gmail.send
Erro: "Gmail API has not been used"¶
Causa: Gmail API não está ativada no projeto
Solução: 1. Vá para Google Cloud Console 2. APIs & Services > Library 3. Ative "Gmail API"
Emails vão para spam¶
Solução: 1. Configure SPF, DKIM e DMARC no domínio 2. Use um domínio verificado no Google Workspace 3. Evite palavras spam no assunto/corpo
📚 Recursos Adicionais¶
🎯 Checklist de Configuração¶
- [ ] Projeto criado no Google Cloud Console
- [ ] Gmail API ativada
- [ ] Tela de consentimento OAuth configurada
- [ ] Credenciais OAuth 2.0 criadas (Client ID + Secret)
- [ ] Refresh token obtido via script
- [ ] Variáveis de ambiente configuradas (local)
- [ ] Variáveis configuradas no Google Cloud (se produção)
- [ ] Teste executado com sucesso
- [ ] Email de teste recebido
- [ ] Tokens armazenados com segurança (Secret Manager)
Status: ✅ Pronto para uso em produção
Última atualização: 3 de janeiro de 2026