El flujo de respuesta automática de Gmail envió 50 correos electrónicos a la misma persona

Describe el problema/error/pregunta

¡Hola a todos!

Tuve un problema con un flujo de trabajo de respuesta automática de Gmail, comenzó a enviar una respuesta a la misma dirección una y otra vez, incluso después de desactivar todos los nodos (lo cual es realmente extraño).

Cómo funciona:
Nuestro correo electrónico es copiado (cc) por nuestro socio en correos enviados a clientes potenciales. El primer nodo se activa una vez por hora para encontrar correos electrónicos de la dirección de correo de nuestro socio, con filtrado por la línea de asunto Y solo por correos electrónicos no leídos. Luego establece variables para la dirección de correo electrónico del destinatario y la id del mensaje. El siguiente nodo marca el mensaje como leído usando la id. Luego, el siguiente nodo responde en el hilo usando la id del hilo del disparador. Luego agrega el cliente potencial a una tabla y crea un cliente potencial en Zoho.

Comenzó hace una semana, lo notamos recientemente. La parte más extraña es que siguió enviando correos electrónicos incluso después de que desactivamos los nodos, así que anulamos la publicación del flujo de trabajo solo para estar seguro.

Vi algunos hilos similares aquí, pero esto parece ser un poco diferente, estamos filtrando correos electrónicos no leídos, pero sigue extrayendo el mismo correo electrónico una y otra vez.

Información sobre tu configuración de n8n

  • Versión de n8n: 2.20.7
  • Ejecutando n8n a través de n8n cloud

@Arsen la parte de „aún enviando después de la desactivación

¡Hola @achamm!

Gracias por tu respuesta. En realidad, el nodo mark-as-read se ejecutó exitosamente en todas las ejecuciones, según puedo ver.

¿Corrígeme si me equivoco, acaso el modo principal no es utilizado por la mayoría de los Planes Cloud Standard (Starter/Pro)?
Si es así, no habrá ningún trabajo en cola.

@Arsen, ¿estás en el Plan Enterprise?

Bienvenido a la comunidad n8n @Arsen
Por favor actualiza tu instancia a la v2.21.7 a través del panel de administración.
vuelve al flujo, desactiva los nodos y actívalos nuevamente. publica
pon a ejecutar, devuélvenos el resultado si es posible.

@kjooleng no, plan inicial

También una cosa rara: el correo electrónico se envió a la misma persona 50 veces, pero la dirección de esa persona se agregó a la hoja de cálculo solo una vez

hola @Arsen

Por favor, comparte el flujo de trabajo.

Puedes seleccionar todos los nodos con Ctrl+A y copiarlos con Ctrl+C. Luego, pega el contenido después de presionar el botón </> con Ctrl+V.

Veo que tu disparador de Gmail tiene más de 1 elemento, lo que podría causar algunos problemas si los siguientes nodos fueron configurados incorrectamente

Hola @Arsen,

¿Funcionaba bien hace una semana? ¿Qué cambió desde entonces?

El problema real es una condición de carrera entre el trigger y el nodo mark-as-read. Gmail devuelve correos sin leer basándose en el estado al momento de la solicitud de API. Si el trigger obtiene el correo y el nodo mark-as-read aún no se ha ejecutado, la siguiente ejecución puede obtener el mismo correo nuevamente, especialmente si las ejecuciones se solapan.

La mejor solución es que agregues un filtro de deduplicación basado en el Message-ID después del trigger. Almacena los Message-IDs procesados en un Static Data Store o en una Google Sheet. Antes de procesar, verifica si el ID ya existe.

¿Qué plan utilizas? ¿Cloud o self-hosted?

¡Hola @barn4k!

Puedo enviar capturas de pantalla si eso funciona

¡Hola @Kemal_Automation !

Estoy usando n8n en la nube.

Creo que tendría sentido que el correo electrónico se agregara a la hoja de cálculo una y otra vez también

Hola @Arsen
¿Puedes verificar la configuración de respuesta automática de Gmail?

Vas a Gmail > Configuración > General > Respuesta automática (Respuesta automática desactivada/activada).

Si la respuesta automática está desactivada. Entonces, asegúrate de seguir estos pasos.

Pruébalo en un alcance pequeño duplicando el flujo de trabajo, solo cambia la configuración en lugar de leer desde el correo del socio a leer desde tu correo (que no sea el ccd)

  1. Mantén toda tu configuración y usa un correo (nuevo correo desde el que puedas enviar o recibir para probar)

  2. reduce el tiempo de activación a 1 minuto solo para pruebas,

  3. detente en responder el mensaje (ya que este es el bloqueador crítico)

    Asegúrate de hacer pruebas de flujo paso a paso (antes de publicar)
    Si funcionó bien, entonces publica el alcance pequeño
    pruébalo nuevamente en producción, ¡y debería funcionar!

Exacto, si el mismo correo electrónico aparece una y otra vez en la hoja de cálculo
confirma el problema.

La solución es un nodo de código directamente después del disparador, que verifica si
el ID del mensaje ya ha sido procesado. Si necesitas ayuda con la
configración exacta, ¡con gusto te ayudaré!

@Arsen en los registros de ejecución, ¿49 de esas ejecuciones muestran una falla/error en el nodo inmediatamente después del nodo de respuesta? Si es así, el flujo de trabajo estaba completando la respuesta exitosamente, luego golpeando un error aguas abajo, pero como n8n ya había enviado el correo electrónico, el daño estaba hecho.

¿qué devuelve el disparador de Gmail cuando sondea?

@sergeys @Kemal_Automation

¡Gracias chicos por sus respuestas!

Ese es exactamente el problema; NO hubo errores en las ejecuciones, y cada ejecución se completó exitosamente. El correo electrónico no se estaba agregando al spreadsheet una y otra vez. Se agregó una sola vez, y listo

Entonces, si no hay errores y la tabla solo tiene una entrada, es probable que el problema sea que la respuesta de tu socio marca el correo electrónico nuevamente como no leído en Gmail. Esto hace que el disparador lo vuelva a extraer cada hora. Como solución, añade un filtro directamente después del disparador que compruebe si el correo electrónico llegó en las últimas 2 horas. De esta manera, los correos electrónicos antiguos no podrán volver a entrar en el bucle.

@Kemal_Automation

¡Gracias!

En realidad, nuestro socio no responde, somos nosotros quienes estamos respondiendo los correos electrónicos. Estamos respondiendo solo al destinatario, y de todas formas dejamos fuera a nuestro socio. Por eso es realmente extraño

Ok, entonces la teoría del socio queda descartada. Mi siguiente sospecha es que Gmail marca internamente el correo como no leído después de tu respuesta, porque se actualiza el hilo.

Como prueba, añade después del nodo “Mark as Read” una pequeña pausa de 1-2 segundos, y luego vuelve a hacer “Mark as Read”. A veces Gmail necesita un momento para que el cambio surta efecto.

ok mirando los screenshots del workflow — Gmail Trigger con filtro (sin leer + remitente asociado + asunto), Marcar como leído usando $('Edit Fields').item.json.id, Responder usando $('Gmail Trigger').item.json.threadId. todo eso se ve bien.

si 50 ejecuciones por hora separadas siguen encontrando el MISMO mensaje sin leer Y marcar-como-leído sigue reportando éxito, algo está cambiando el email de vuelta a sin leer entre sondeos — podría ser una regla de filtro de Gmail, la app móvil, u otro cliente IMAP tocando la bandeja. no vas a arreglar esa causa raíz desde dentro de n8n. lo que SÍ puedes arreglar es hacer que el workflow rechace enviar la misma respuesta dos veces sin importar el estado de lectura.

cabeza este nodo Code entre el Gmail Trigger y Edit Fields. persiste IDs de mensajes procesados en los datos estáticos del workflow de n8n así que los duplicados se filtran entre ejecuciones:

{
  "nodes": [
    {
      "parameters": {
        "jsCode": "const staticData = $getWorkflowStaticData('global');\nstaticData.processedIds = staticData.processedIds || [];\n\nconst fresh = $input.all().filter(item =\ {
          const id = item.json.id;\n          if (staticData.processedIds.includes(id)) return false;\n          staticData.processedIds.push(id);\n          return true;\n        });\n\nif (staticData.processedIds.length \ 1000) {\n          staticData.processedIds = staticData.processedIds.slice(-1000);\n        }\n\nreturn fresh;"
      },
      "name": "Dedupe by Message ID",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [400, 300]
    }
  ],
  "connections": {}
}

$getWorkflowStaticData('global') sobrevive entre ejecuciones en n8n Cloud así que la lista de IDs persiste. la primera vez que un mensaje llega se registra + se pasa aguas abajo; la segunda vez el filtro lo descarta y el workflow se cortocircuita a cero items. ahora aunque Gmail siga marcando como sin leer, envías la respuesta exactamente una vez por ID de mensaje único.