Attention!
Ce que fait ce code est: chaque fois que magento-cronjob supprime tous les messages envoyés de la table de base de données core_email_queue, il supprime également tous les destinataires de ces messages. Donc, fondamentalement, cela ne fonctionne pas pour vous tant que cette tâche cronjob n'a pas été exécutée au moins une fois.
Solution
J'ai trouvé la réponse grâce à une autre question ici: la table core_email_queue_recipients n'a pas été vidée par le cronjob. La méthode Mage_Core_Model_Email_Queue::cleanQueue()
appelle Mage_Core_Model_Resource_Email_Queue::removeSentMessages()
, ce qui est assez simple:
public function removeSentMessages() {
$this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL');
return $this;
}
Quoi qu'il en soit, cette méthode ne supprime pas les anciens destinataires. Ainsi, dès qu'un nouveau message avec message_id n est mis en file d'attente, tous les anciens destinataires avec message_id n recevront également le nouvel e-mail. La chose que je ne comprends pas est: pourquoi l'équipe centrale n'a-t-elle pas vu cela, et pourquoi cela ne conduit-il pas à plus de problèmes?
J'ai écrit un petit module pour résoudre ce problème. Il utilise un remplacement de classe pour Mage_Core_Model_Resource_Email_Queue
, donc si quelqu'un peut suggérer une meilleure solution (basée sur les événements?), Je serais heureux.
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>