Pular para conteúdo

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:

  1. Manter thread: Respostas aparecem agrupadas na mesma conversa
  2. Contexto preservado: Histórico visível para ambas as partes
  3. Organização: Gmail agrupa mensagens relacionadas automaticamente
  4. Automação de respostas: Responder automaticamente mantendo contexto

Como funciona internamente?

Quando o REPLY_TO_EMAIL é executado, o sistema:

  1. Valida messageId: Confirma que email original existe
  2. Busca threadId: Recupera ID da thread do email original
  3. Prepara resposta: Monta email com "Re:" no subject
  4. Vincula thread: Associa resposta ao threadId original
  5. Envia via API: Usa gmail.users.messages.send() com threadId
  6. 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

  1. Atendimento automatizado: "Responder tickets mantendo histórico"
  2. Confirmações: "Responder solicitações confirmando recebimento"
  3. Follow-up: "Responder após processamento de pedido"
  4. 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