Los emails de confirmación de pedido se envían al cliente equivocado

En uno de nuestros últimos proyectos, hemos tenido un problema muy grave. Cuando entraba un nuevo pedido, el email de confirmación se enviaba al cliente equivocado.

Este error está relacionado con el nuevo Sistema Magento Email Queue, que deja registros huérfanos en la tabla de Destinatarios.

La tabla core_email_queue se borra a medida que se envían correos electrónicos en la cola Magento Email Queue. Esta limpieza se realiza mediante un cron llamado core_email_queue_clean_up, que está definido en el archivo de configuración app/code/core/Mage/Core/etc/config.xml. La función que realiza la limpieza se llama removeSentMessages y está en la clase Mage_Core_Model_Resource_Email_Queue:

/** 
 * Remove already sent messages 
 * 
 * @return Mage_Core_Model_Resource_Email_Queue 
 */
public function removeSentMessages() 
{ 
    $this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL'); 
    return $this; 
}

Esta función se ejecuta una vez al día.

Pero sucede que la tabla core_email_queue_recipients (la que contiene los destinatarios de los correo electrónico y que está enlazada a la tabla core_email_queue por el campo message_id) no se limpia junto con la tabla core_email_queue (la que contiene los mensajes de correo electrónico), dejando registros huérfanos cuando se borra la tabla de mensajes.

El problema surge cuando se restablece la tabla core_email_queue (mensajes) y se reinicia el campo autoincrement message_id de esta tabla en 1.

Debido a que la tabla core_email_queue_recipients (destinatarios) no se ha limpiado, cuando se agregan nuevos correos a la cola, se crean nuevos registros en la tabla core_email_queue (con message_id comenzando de nuevo desde 1) y al mismo tiempo se crean nuevos registros En la tabla core_email_queue_recipients con estos mismos ids (comenzando de nuevo desde 1).

El problema es que estos identificadores ya existen en la tabla de destinatarios como registros huérfanos (debido a emails anteriores). Estos nuevos identificadores de mensaje se repiten dentro de la tabla core_email_queue_recipients. Al final, los mensajes de correo electrónico diferentes están vinculados a sus destinatarios correspondientes por el mensaje_id, pero también se vinculan incorrectamente a los destinatarios anteriores a los que se les asignó el mismo mensaje_id de emails anteriores.

Por lo tanto, cuando se busca a los destinatarios para enviar un mensaje, además del destinatario apropiado, pueden aparecer otros destinatarios equivocados.

¿Cómo podemos solucionar este problema?

Afortunadamente existe una solución para este problema.

Todo lo que se necesita es limpiar los ids de mensajes repetidos en la tabla core_email_queue_recipients y asegurarse de que cuando se borra un mensaje en la tabla core_email_queue, al mismo tiempo, sus destinatarios correspondientes se eliminan en la tabla core_email_queue_recipients.

La mejor manera de lograr esto es crear una clave foránea que conecte estos registros y los elimine en cascada (pero es necesario hacer una limpieza antes de que pueda hacerlo).

Para solucionar el problema hemos seguido los siguientes pasos:

1) Ejecute las siguientes dos consultas SQL para limpiar la tabla core_email_queue_recipients de los registros huérfanos y los ids de mensajes repetidos:

DELETE FROM core_email_queue_recipients WHERE message_id NOT IN (SELECT message_id FROM core_email_queue);

DELETE FROM core_email_queue_recipients WHERE recipient_id < (SELECT recipient_id FROM (SELECT recipient_id FROM core_email_queue_recipients ORDER BY message_id ASC, recipient_id DESC LIMIT 1) AS r);

La primera consulta elimina registros huérfanos y la segunda elimina registros antiguos que ya no son válidos.

2) Cree una clave externa en la tabla core_email_queue_recipients para eliminar registros de destinatarios en cascada. La consulta SQL para crear esta clave externa es:

ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;

Al usar esta nueva clave externa, no se dejarán los registros en la tabla core_email_queue_recipients al limpiar la tabla core_email_queue y no se enviarán mensajes duplicados a destinatarios incorrectos en el futuro.

Opt In Image
Suscríbete al boletín
Convierte tu tienda online en un negocio rentable.

Si te ha gustado lo que has leído suscríbete y recibirás en tu correo más trucos e ideas para sacarle el máximo provecho a tu tienda online.

Author:

CTO de Magestio Ecommerce