Внимание!
Этот код выполняет следующее: каждый раз, когда magento-cronjob удаляет все отправленные сообщения из таблицы базы данных core_email_queue, он также удаляет всех получателей этих сообщений. Так что, в принципе, он не работает для вас, пока эта задача cronjob не будет запущена хотя бы один раз.
Решение
Я нашел ответ благодаря еще одному вопросу: таблица core_email_queue_recipients не была очищена cronjob. Метод Mage_Core_Model_Email_Queue::cleanQueue()
вызовы Mage_Core_Model_Resource_Email_Queue::removeSentMessages()
, которые довольно просты:
public function removeSentMessages() {
$this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL');
return $this;
}
В любом случае, этот метод не удаляет старых получателей. Таким образом, как только новое сообщение с message_id n ставится в очередь, все старые получатели с message_id n также получат новое письмо. Вещь, которую я не понимаю: почему основная команда не видела этого и почему это не приводит к большему количеству проблем?
Я написал небольшой модуль, чтобы исправить это. Он использует переопределение класса для Mage_Core_Model_Resource_Email_Queue
, так что если кто-нибудь может предложить лучшее (на основе событий?) Решение, я был бы рад.
Приложение / код / местные / пространство имен / EmailQueueFix / и т.д. / 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>
Приложение / код / местные / пространство имен / EmailQueueFix / Модель / 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;
}
}
приложение / и т.д. / модули / 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>