Beachtung!
Dieser Code bewirkt Folgendes: Jedes Mal, wenn der Magento-Cronjob alle gesendeten Nachrichten aus der Datenbanktabelle core_email_queue entfernt, werden auch alle Empfänger dieser Nachrichten entfernt. Im Grunde funktioniert es also nicht für Sie, bis diese Cronjob-Aufgabe mindestens einmal ausgeführt wurde.
Lösung
Ich fand die Antwort dank einer anderen Frage hier: Die Tabelle core_email_queue_recipients wurde vom Cronjob nicht geleert. Die Methode Mage_Core_Model_Email_Queue::cleanQueue()
ruft auf Mage_Core_Model_Resource_Email_Queue::removeSentMessages()
, was ziemlich einfach ist:
public function removeSentMessages() {
$this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL');
return $this;
}
Auf jeden Fall werden bei dieser Methode die alten Empfänger nicht entfernt. Sobald eine neue Nachricht mit message_id n in die Warteschlange gestellt wird, erhalten alle alten Empfänger mit message_id n auch die neue E-Mail. Was ich nicht verstehe ist: Warum hat das Kernteam das nicht gesehen und warum führt dies nicht zu weiteren Problemen?
Ich habe ein kleines Modul geschrieben, um dies zu beheben. Es wird eine Klassenüberschreibung verwendet. Mage_Core_Model_Resource_Email_Queue
Wenn also jemand eine bessere (ereignisbasierte?) Lösung vorschlagen kann, würde ich mich freuen.
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>