Vấn đề này phải liên quan đến hệ thống Hàng đợi Email Magento mới, để lại các bản ghi mồ côi trên bảng Người nhận. Nếu đây là vấn đề của bạn, tôi gửi cho bạn một sửa chữa.
Hệ thống hàng đợi email Magento mới quản lý hai bảng này: core_email_queue và core_email_queue_reciprons . Cái trước xử lý các Tin nhắn email, và cái sau, Người nhận các tin nhắn này.
Bảng core_email_queue được xóa sạch khi các email trên Hàng đợi email Magento được gửi. Việc dọn dẹp này được thực hiện bởi một công việc tab cron có tên core_email_queue_clean_up , được xác định bên trong tệp cấu hình app / code / core / Mage / Core / etc / config.xm l. Mã thực hiện việc dọn dẹp được xác định trên hàm removeSentMessages trong lớp Mage_Core_Model_Resource_Email_Queue :
/**
* Remove already sent messages
*
* @return Mage_Core_Model_Resource_Email_Queue
*/
public function removeSentMessages()
{
$this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL');
return $this;
}
Đoạn mã trên được thực thi mỗi ngày một lần bởi tác vụ cron.
Nhưng điều đó xảy ra là bảng core_email_queue_reciprons (bảng chứa người nhận email và được liên kết với bảng core_email_queue bởi trường message_id ), không được làm sạch cùng với bảng core_email_queue (bảng giữ các bản ghi email) Bảng người nhận khi bảng Tin nhắn được xóa sạch.
Vấn đề được mô tả ở đây phát sinh khi bảng core_email_queue (Tin nhắn) được đặt lại và trường message_id tự động trên bảng này được khởi tạo lại thành 1.
Vì bảng core_email_queue_reciprons (Người nhận) chưa được làm sạch tương ứng, khi các email mới được thêm vào Hàng đợi Email Magento, các bản ghi mới được tạo trên bảng core_email_queue (với message_id bắt đầu lại từ 1), đồng thời các bản ghi mới được tạo lại từ 1) trên bảng core_email_queue_reciprons có cùng các id này (bắt đầu lại từ 1).
Vấn đề là những id này có thể đã tồn tại trên bảng Người nhận dưới dạng bản ghi mồ côi (do các thông báo email trước đó). Các id mesage mới này sau đó được lặp lại bên trong bảng core_email_queue_reciprons . Cuối cùng, các Tin nhắn email khác nhau được liên kết với Người nhận tương ứng của họ bởi message_id , nhưng chúng cũng được liên kết sai với những người nhận trước đó được gán cùng một message_id từ các email trước đó.
Do đó, khi người nhận được tìm kiếm để gửi một tin nhắn nhất định, bên cạnh người nhận thích hợp, những người nhận sai khác có thể phát sinh.
May mắn là sửa chữa cho vấn đề này là dễ dàng để thực hiện.
Tất cả những gì cần thiết là làm sạch tất cả các id tin nhắn lặp lại trên bảng core_email_queue_reciprons và đảm bảo rằng khi một Tin nhắn bị xóa trên bảng core_email_queue , đồng thời, những Người nhận tương ứng của nó sẽ bị xóa trên bảng core_email_queue_reciprons .
Cách tốt nhất để đạt được điều này là tạo một khóa ngoại liên kết các bản ghi này và xóa chúng trên tầng (nhưng bạn cần thực hiện một số thao tác dọn dẹp trước khi bạn có thể làm điều đó).
Đây là thủ tục để khắc phục sự cố:
1) Thực hiện hai truy vấn SQL sau để xóa bảng core_email_queue_reciprons khỏi các bản ghi mồ côi và id tin nhắn lặp lại:
DELETE FROM core_email_queue_recipients WHERE message_id NOT IN (SELECT message_id FROM core_email_queue);
DELETE FROM core_email_queue_recipients WHERE recipient_id < (SELECT recipient_id FROM (SELECT recipient_id FROM core_email_queue_recipients ORDER BY message_id ASC, recipient_id DESC LIMIT 1) AS r);
Truy vấn đầu tiên xóa các bản ghi mồ côi và truy vấn thứ hai xóa các bản ghi cũ không còn hiệu lực.
2) Tạo khóa ngoại trên bảng core_email_queue_reciprons để xóa các bản ghi Người nhận trên tầng. Truy vấn SQL để tạo khóa ngoại này là:
ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;
Bằng cách sử dụng khóa ngoại mới này, sẽ không có bản ghi mồ côi nào trên bảng core_email_queue_reciprons khi làm sạch bảng core_email_queue và sẽ không gửi tin nhắn trùng lặp đến người nhận sai trong tương lai.