GET_EMAIL_BY_ID - Buscar Email Específico por ID
O que é este Node?
O GET_EMAIL_BY_ID é o node responsável por recuperar detalhes completos de um email específico usando seu messageId único no Gmail.
Por que este Node existe?
Acessar email específico é essencial para processar comunicações individuais com precisão. O GET_EMAIL_BY_ID existe para:
- Acesso direto: Recuperar email conhecido por ID
- Detalhes completos: Obter headers, corpo, anexos e metadata
- Processamento preciso: Trabalhar com email específico
- Validação: Confirmar existência e conteúdo de email
Como funciona internamente?
Quando o GET_EMAIL_BY_ID é executado, o sistema:
- Valida messageId: Confirma que ID foi fornecido
- Busca email: Chama gmail.users.messages.get() com format=full
- Extrai headers: Processa Subject, From, To, Date
- Decodifica corpo: Converte base64 para texto legível
- Processa partes: Extrai texto de partes multipart
- Se sucesso: Retorna objeto completo com todos dados
Código interno (gmail-executor.service.ts:329-368):
private async getMessage(gmail: any, data: GmailNodeData): Promise<any> {
const response = await gmail.users.messages.get({
userId: 'me',
id: data.messageId,
format: 'full'
});
const message = response.data;
const headers = message.payload.headers;
// Extract common headers
const subject = headers.find((h: any) => h.name === 'Subject')?.value;
const from = headers.find((h: any) => h.name === 'From')?.value;
const to = headers.find((h: any) => h.name === 'To')?.value;
const date = headers.find((h: any) => h.name === 'Date')?.value;
// Extract body
let body = '';
if (message.payload.body.data) {
body = Buffer.from(message.payload.body.data, 'base64').toString();
} else if (message.payload.parts) {
for (const part of message.payload.parts) {
if (part.mimeType === 'text/plain' && part.body.data) {
body += Buffer.from(part.body.data, 'base64').toString();
}
}
}
return {
id: message.id,
threadId: message.threadId,
subject,
from,
to,
date,
body,
snippet: message.snippet,
labelIds: message.labelIds
};
}
Quando você DEVE usar este Node?
Use GET_EMAIL_BY_ID sempre que precisar de detalhes de email específico:
Casos de uso
- Processar webhook: "Buscar email após notificação de chegada"
- Validar referência: "Confirmar conteúdo de email mencionado"
- Extrair dados: "Ler informações específicas de um email"
- Preparar resposta: "Buscar email antes de responder"
Quando NÃO usar GET_EMAIL_BY_ID
- Lista de emails: Use GET_EMAILS para múltiplos
- Buscar por conteúdo: Use SEARCH_EMAILS se não tem ID
- Processar inbox: Use GET_EMAILS para varredura
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| oauth2 | object | Sim | Credenciais OAuth2 |
| operation | string | Sim | Deve ser "get" |
| messageId | string | Sim | ID único do email no Gmail |
Exemplo 1: Buscar e Exibir Email
Objetivo: Recuperar email específico e mostrar detalhes
JSON para Importar
{
"name": "Buscar Email por ID",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "ID do Email",
"parameters": {
"message": "Digite o ID do email:",
"variable": "emailId"
}
}
},
{
"id": "gmail_1",
"type": "gmail",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar Email",
"operation": "get",
"oauth2": {
"clientId": "YOUR_CLIENT_ID",
"clientSecret": "YOUR_SECRET",
"refreshToken": "YOUR_TOKEN"
},
"messageId": "{{emailId}}"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar Detalhes",
"parameters": {
"message": "📧 Email encontrado!\n\nDe: {{gmail_1.from}}\nAssunto: {{gmail_1.subject}}\nData: {{gmail_1.date}}\n\nPrévia: {{gmail_1.snippet}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "gmail_1" },
{ "source": "gmail_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: Digite o ID do email:
Usuário: 18f2b9c4d5e6a7f8
Sistema: 📧 Email encontrado!
De: contato@example.com
Assunto: Proposta Comercial
Data: Mon, 12 Oct 2025 10:30:00 -0300
Prévia: Olá, segue nossa proposta comercial...
Exemplo 2: Validar Email Antes de Responder
Objetivo: Buscar email para validar conteúdo antes de responder
JSON para Importar
{
"name": "Validar e Responder Email",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Processar Email" }
},
{
"id": "gmail_get_1",
"type": "gmail",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Email",
"operation": "get",
"oauth2": {
"clientId": "YOUR_CLIENT_ID",
"clientSecret": "YOUR_SECRET",
"refreshToken": "YOUR_TOKEN"
},
"messageId": "{{triggerEmailId}}"
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 500, "y": 100 },
"data": {
"label": "É Urgente?",
"parameters": {
"condition": "{{gmail_get_1.subject}} contains 'URGENTE'"
}
}
},
{
"id": "gmail_reply_1",
"type": "gmail",
"position": { "x": 700, "y": 50 },
"data": {
"label": "Resposta Urgente",
"operation": "reply",
"oauth2": {
"clientId": "YOUR_CLIENT_ID",
"clientSecret": "YOUR_SECRET",
"refreshToken": "YOUR_TOKEN"
},
"messageId": "{{gmail_get_1.id}}",
"to": "{{gmail_get_1.from}}",
"subject": "{{gmail_get_1.subject}}",
"replyMessage": "Recebemos sua solicitação URGENTE e já estamos processando. Retornaremos em breve."
}
},
{
"id": "gmail_reply_2",
"type": "gmail",
"position": { "x": 700, "y": 150 },
"data": {
"label": "Resposta Normal",
"operation": "reply",
"oauth2": {
"clientId": "YOUR_CLIENT_ID",
"clientSecret": "YOUR_SECRET",
"refreshToken": "YOUR_TOKEN"
},
"messageId": "{{gmail_get_1.id}}",
"to": "{{gmail_get_1.from}}",
"subject": "{{gmail_get_1.subject}}",
"replyMessage": "Recebemos sua mensagem e responderemos em até 24 horas."
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Resposta automática enviada"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "gmail_get_1" },
{ "source": "gmail_get_1", "target": "condition_1" },
{ "source": "condition_1", "target": "gmail_reply_1", "label": "true" },
{ "source": "condition_1", "target": "gmail_reply_2", "label": "false" },
{ "source": "gmail_reply_1", "target": "message_1" },
{ "source": "gmail_reply_2", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: Resposta automática enviada
Resposta do Node
{
"success": true,
"action": "get_email",
"id": "18f2b9c4d5e6a7f8",
"threadId": "18f2b9c4d5e6a7f8",
"subject": "Proposta Comercial",
"from": "contato@example.com",
"to": "voce@example.com",
"date": "Mon, 12 Oct 2025 10:30:00 -0300",
"body": "Conteúdo completo do email...",
"snippet": "Prévia curta do email...",
"labelIds": ["INBOX", "UNREAD"],
"timestamp": "2025-10-12T21:30:00.000Z"
}
Boas Práticas
✅ SIM: - Valide se messageId existe antes de buscar - Use snippet para pré-visualizações rápidas - Processe body para extrair informações - Verifique labelIds para status do email
❌ NÃO: - Não assuma que ID sempre existe - Não ignore erros de email não encontrado - Não busque repetidamente o mesmo email
Dicas
💡 Dica 1: threadId permite encontrar emails relacionados 💡 Dica 2: snippet é útil para mostrar prévia sem processar body 💡 Dica 3: labelIds indica status (UNREAD, STARRED, etc) 💡 Dica 4: Combine com REPLY_TO_EMAIL para responder 💡 Dica 5: Use body para análise completa de conteúdo
Próximo Node
→ GET_EMAILS - Listar múltiplos emails → SEARCH_EMAILS - Buscar por critérios → REPLY_TO_EMAIL - Responder email