Chú ý!
Mã này làm gì: mỗi khi magento-cronjob xóa tất cả các tin nhắn đã gửi khỏi bảng cơ sở dữ liệu core_email_queue, nó cũng xóa tất cả người nhận các tin nhắn này. Vì vậy, về cơ bản, nó không hoạt động cho bạn cho đến khi tác vụ cronjob này chạy ít nhất một lần.
Giải pháp
Tôi đã tìm thấy câu trả lời nhờ một câu hỏi khác ở đây: bảng core_email_queue_reciprons không được làm trống bởi cronjob. Phương thức Mage_Core_Model_Email_Queue::cleanQueue()
gọi Mage_Core_Model_Resource_Email_Queue::removeSentMessages()
, khá đơn giản:
public function removeSentMessages() {
$this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL');
return $this;
}
Dù sao, phương pháp này không loại bỏ người nhận cũ. Do đó, ngay khi một tin nhắn mới có message_id n được xếp hàng, tất cả những người nhận cũ có message_id n cũng sẽ nhận được email mới. Điều tôi không hiểu là: tại sao nhóm nòng cốt không nhìn thấy điều này và tại sao điều này không dẫn đến nhiều vấn đề hơn?
Tôi đã viết một mô-đun nhỏ để sửa lỗi này. Nó sử dụng một ghi đè lớp cho Mage_Core_Model_Resource_Email_Queue
, vì vậy nếu bất cứ ai có thể đề xuất một giải pháp tốt hơn (dựa trên sự kiện?), Tôi sẽ rất vui.
ứng dụng / mã / cục bộ / 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>
ứng dụng / mã / cục bộ / Không gian tên / 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;
}
}
ứng dụng / etc / mô-đun / 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>