REPLY_TO_EMAIL - Responder Email no Gmail
O que é este Node?
O REPLY_TO_EMAIL é o node responsável por responder emails mantendo a conversa (thread) no Gmail, permitindo respostas automáticas contextualizadas dentro do histórico da conversação.
Por que este Node existe?
Manter contexto em conversas por email é fundamental para comunicação profissional eficaz. O REPLY_TO_EMAIL existe para:
- Manter thread: Respostas aparecem agrupadas na mesma conversa
- Contexto preservado: Histórico visível para ambas as partes
- Organização: Gmail agrupa mensagens relacionadas automaticamente
- Automação de respostas: Responder automaticamente mantendo contexto
Como funciona internamente?
Quando o REPLY_TO_EMAIL é executado, o sistema:
- Valida messageId: Confirma que email original existe
- Busca threadId: Recupera ID da thread do email original
- Prepara resposta: Monta email com "Re:" no subject
- Vincula thread: Associa resposta ao threadId original
- Envia via API: Usa gmail.users.messages.send() com threadId
- Se sucesso: Retorna messageId da resposta e threadId compartilhado
Código interno (gmail-executor.service.ts:402-434):
private async replyToMessage(gmail: any, data: GmailNodeData): Promise<any> {
// Get original message for thread ID
const originalMessage = await gmail.users.messages.get({
userId: 'me',
id: data.messageId,
format: 'minimal'
});
const emailLines = [
`To: ${data.to}`,
`Subject: Re: ${data.subject}`,
'Content-Type: text/html; charset=utf-8',
'',
data.replyMessage
];
const email = emailLines.join('\n');
const encodedEmail = Buffer.from(email).toString('base64url');
const response = await gmail.users.messages.send({
userId: 'me',
requestBody: {
raw: encodedEmail,
threadId: originalMessage.data.threadId
}
});
return {
messageId: response.data.id,
threadId: response.data.threadId,
originalMessageId: data.messageId
};
}
Quando você DEVE usar este Node?
Use REPLY_TO_EMAIL sempre que precisar de respostas dentro de threads existentes:
Casos de uso
- Atendimento automatizado: "Responder tickets mantendo histórico"
- Confirmações: "Responder solicitações confirmando recebimento"
- Follow-up: "Responder após processamento de pedido"
- Respostas automáticas: "Responder emails específicos automaticamente"
Quando NÃO usar REPLY_TO_EMAIL
- Novo assunto: Use SEND_EMAIL para nova conversação
- Encaminhar: Use FORWARD_EMAIL para repassar a terceiros
- Sem contexto: Use SEND_EMAIL se não precisa manter thread
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| oauth2 | object | Sim | Credenciais OAuth2 |
| operation | string | Sim | Deve ser "reply" |
| messageId | string | Sim | ID do email a responder |
| replyMessage | string | Sim | Conteúdo da resposta |
| to | string | Não | Destinatário (padrão: remetente original) |
Exemplo 1: Resposta Automática de Suporte
Objetivo: Responder automaticamente tickets de suporte
JSON para Importar
{
"name": "Resposta Automática Suporte",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Novo Ticket" }
},
{
"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": "variable_1",
"type": "variable",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Número Ticket",
"parameters": {
"variable": "numeroTicket",
"value": "{{$random(10000,99999)}}"
}
}
},
{
"id": "gmail_reply_1",
"type": "gmail",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Enviar Resposta",
"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": "Olá,\n\nRecebemos sua solicitação e criamos o ticket #{{numeroTicket}}.\n\nNossa equipe irá analisar e responder em até 24 horas.\n\nAtenciosamente,\nEquipe de Suporte Lumina"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Resposta automática enviada - Ticket #{{numeroTicket}}"
}
}
},
{
"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": "variable_1" },
{ "source": "variable_1", "target": "gmail_reply_1" },
{ "source": "gmail_reply_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: Resposta automática enviada - Ticket #84729
Boas Práticas
✅ SIM: - Sempre referencie o email original via messageId - Mantenha subject consistente com "Re:" prefix - Inclua contexto na resposta
❌ NÃO: - Não crie nova thread se quer responder - Não altere subject drasticamente
Dicas
💡 Dica 1: Use GET_EMAIL_BY_ID antes para obter detalhes do original 💡 Dica 2: threadId mantém toda conversa agrupada no Gmail 💡 Dica 3: Combine com SEARCH_EMAILS para responder emails específicos
Próximo Node
→ FORWARD_EMAIL - Encaminhar email → GET_EMAIL_BY_ID - Buscar email original → SEND_EMAIL - Enviar novo email