Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Incidencia - Campañas - Posible enviar 2 veces el mismo email de campaña #438

Open
enricsinergia opened this issue Oct 14, 2024 · 0 comments
Assignees
Labels
bug Something isn't working Campañas not urgent

Comments

@enricsinergia
Copy link
Collaborator

enricsinergia commented Oct 14, 2024

Descripción del problema
Se ha comprobado que es posible provocar que se envíe 2 veces el mismo email al mismo destinatario en un único envío de email marketing (cosa que no debería suceder).
En un envío relativamente grande y con un SMTP relativamente lento, se puede producir la siguiente secuencia:
1.- El usuario accede a la cola de emails y fuerza el envío
2.- La pantalla queda "pensando" mientras se van enviando los e-mails
3.- La pantalla da error (superado el tiempo de espera de respuesta), pero el envío sigue su proceso en background
4.- El usuario ve la pantalla en blanco, vuelve a ir a la cola y al ver que todavía hay e-mails, vuelve a forzar el envío
5.- Ahora tenemos 2 procesos enviando e-mails
6.- Al no marcarse el e-mail como enviado hasta recibir la respuesta del SMTP, los 2 procesos no siempre (de hecho la mayoría de veces) detectan que ese mail ya ha sido envíado (está en el SMTP pero no está todavía marcado en BBDD), con lo que senvía 2 veces el mismo mail

Alternativamente (y lo que parece haber sucedido viendo las horas de ejecución):

  1. El usuario accede a la cola de emails y fuerza el envío
  2. Mientras se está ejecutando el proceso, llega la hora del cron que ejecuta el runMassEmailCampaign
  3. Tenemos 2 procesos concurrentes enviando e-mails

Cómo reproducir el problema
El problema del timeout dependerá d ela configuración, pero sí se puede reproducir fácilmente que se duplican envíos:
0.- Configurar un SMTP falso para evitar enviar los e-mails de verdad (por ejemplo mailpit)
1.-. Preparar una lista lo suficientemente larga de direcciones a las que enviar en una campaña (en las pruebas 900 mails)
4.- Crear la campaña y el envío
5.- Realizar el envío de e-mails, comprobar que se quedan en la cola de mensajes
6.- Preparar 2 pantallas (chrome y firefox por ejemplo) en la cola de mensajes
7.- Forzar el envío desde una pantalla
8.- Pasados unos segundos, forzar el envío desde la segunda pantalla
9.- Una vez esté limpia la cola, comprobar en campaingn_log que hay envíos duplicados.

Comportamiento esperado
No deberían duplicarse mails.

Solución propuesta
Opciones a valorar:
a) Modificar EmailManDelivery.php para que "bloquee" los registros con los que trabaja: Actualmente hace un select y luego va marcando los emails individualmente a medida que los envía. La soluciónpasaría por marcarlos utilizando el campo in_queue (por ejemplo) con un UPDATE inicial y luego trabajar con los e-mails marcados.
b) Modificar el tratamiento individual de cada e-mail: Ahora mismo por cada e-mail que se recoge de la tabla Emailman, se realizan todas las validaciones posibles, se envía por SMTP y posteriormente se marca como "targeted". Se trataría de crear el registro "targeted" antes de nada y posteriormente cambiar el estado si alguna validación o el propio envío fallan.
c) Comprobar que no hay otro proceso en danza. Para ello se podría contar el número de registros de la tabla emailman, hacer un sleep de unos segundos y volver a repetir el conteo. Si coinciden, se puede seguir adelante, si ha disminuído es que hay un proceso en marcha.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working Campañas not urgent
Projects
None yet
Development

No branches or pull requests

2 participants