¡Atención!
Lo que hace este código es: cada vez que magento-cronjob elimina todos los mensajes enviados de la tabla de base de datos core_email_queue, también elimina todos los destinatarios de estos mensajes. Entonces, básicamente, no funciona para usted hasta que esta tarea cronjob se haya ejecutado al menos una vez.
Solución
Encontré la respuesta gracias a otra pregunta aquí: la tabla core_email_queue_recipients no fue vaciada por el cronjob. El método Mage_Core_Model_Email_Queue::cleanQueue()
llama Mage_Core_Model_Resource_Email_Queue::removeSentMessages()
, que es bastante simple:
public function removeSentMessages() {
$this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL');
return $this;
}
De todos modos, este método no elimina los antiguos destinatarios. Por lo tanto, tan pronto como se ponga en cola un nuevo mensaje con message_id n, todos los destinatarios anteriores con message_id n también recibirán el nuevo correo electrónico. Lo que no entiendo es: ¿por qué el equipo central no ha visto esto y por qué esto no genera más problemas?
Escribí un pequeño módulo para arreglar esto. Utiliza una anulación de clase para Mage_Core_Model_Resource_Email_Queue
, por lo que si alguien puede sugerir una mejor solución (¿basada en eventos?), Me alegraría.
app / code / local / Namespace / EmailQueueFix / etc / config.xml
<?xml version="1.0"?>
<config>
<modules>
<Namespace_EmailQueueFix>
<version>1.0</version>
</Namespace_EmailQueueFix>
</modules>
<global>
<models>
<core_resource>
<rewrite>
<email_queue>Namespace_EmailQueueFix_Model_Resource_Email_Queue</email_queue>
</rewrite>
</core_resource>
</models>
</global>
</config>
app / code / local / Namespace / EmailQueueFix / Model / Resource / Email / Queue.php
<?php
class Namespace_EmailQueueFix_Model_Resource_Email_Queue extends Mage_Core_Model_Resource_Email_Queue {
/**
* Remove already sent messages
* ADDED: also remove all recipients of sent messages!
*
* @return Mage_Core_Model_Resource_Email_Queue
*/
public function removeSentMessages() {
$writeAdapter = $this->_getWriteAdapter();
$readAdapter = $this->_getReadAdapter();
$select = $readAdapter->select()->from(array("ceqr" => $this->getTable('core/email_recipients')), array('*'))->joinLeft(array('ceq' => $this->getMainTable()), 'ceqr.message_id = ceq.message_id', array('*'))->where('ceq.processed_at IS NOT NULL OR ceq.message_id IS NULL');
$recipients = $readAdapter->fetchAll($select);
if ( $recipients ) {
foreach ( $recipients as $recipient ) {
$writeAdapter->delete($this->getTable('core/email_recipients'), "recipient_id = " . $recipient['recipient_id']);
}
}
$writeAdapter->delete($this->getMainTable(), 'processed_at IS NOT NULL');
return $this;
}
}
app / etc / modules / Namespace_EmailQueueFix.xml
<?xml version="1.0"?>
<config>
<modules>
<Namespace_EmailQueueFix>
<codePool>local</codePool>
<active>true</active>
</Namespace_EmailQueueFix>
<depends>
<Mage_Core/>
</depends>
</modules>
</config>