Masalah ini harus terkait dengan sistem Antrian Email Magento baru, yang meninggalkan catatan anak yatim di tabel Penerima. Jika ini adalah masalah Anda, saya mengirimi Anda perbaikan.
Sistem Antrian Email Magento baru mengelola dua tabel ini: core_email_queue dan core_email_queue_recipients . Yang pertama menangani Pesan email, dan yang berikutnya, Penerima pesan-pesan ini.
The core_email_queue meja dibersihkan sebagai email di Magento Email Queue dikirim. Pembersihan ini dilakukan oleh pekerjaan tab cron yang disebut core_email_queue_clean_up , yang didefinisikan di dalam aplikasi / kode / core / Mage / Core / etc / config.xm l file config. Kode yang melakukan pembersihan didefinisikan pada fungsi removeSentMessages di kelas 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;
}
Kode di atas dijalankan sekali sehari oleh tugas cron.
Tapi kebetulan bahwa tabel core_email_queue_recipients (yang memegang Penerima email, dan yang ditautkan ke tabel core_email_queue oleh bidang message_id ), tidak dibersihkan bersama-sama dengan tabel core_email_queue (yang memegang pesan email), meninggalkan catatan yatim piatu di dalam, bahwa tabel Penerima ketika kemudian tabel Pesan dibersihkan.
Masalah yang dijelaskan di sini muncul ketika tabel core_email_queue (Pesan) di-reset dan bidang message_id autoincrement pada tabel ini diinisiasi ulang ke 1.
Karena tabel core_email_queue_recipients (Penerima) belum dibersihkan, ketika email baru ditambahkan ke Antrian Email Magento, catatan baru dibuat pada tabel core_email_queue (dengan message_id mulai lagi dari 1), dan pada saat yang sama catatan baru dibuat pada tabel core_email_queue_recipients dengan id yang sama (mulai dari 1).
Masalahnya adalah id ini mungkin sudah ada di tabel Penerima sebagai catatan anak yatim (karena pesan email sebelumnya). Id mesages baru ini kemudian diulang di dalam tabel core_email_queue_recipients . Pada akhirnya, berbagai pesan email ditautkan ke Penerima mereka yang sesuai oleh message_id , tetapi mereka juga secara keliru tertaut ke penerima sebelumnya yang diberi message_id yang sama dari email sebelumnya.
Dengan demikian, ketika penerima dicari untuk mengirim pesan yang diberikan, selain penerima yang sesuai, penerima yang salah lainnya dapat muncul.
Untungnya perbaikan untuk masalah ini mudah dilakukan.
Yang diperlukan hanyalah membersihkan semua id pesan yang diulang pada tabel core_email_queue_recipients , dan memastikan bahwa ketika sebuah Pesan dihapus pada tabel core_email_queue , pada saat yang sama Penerima terkaitnya akan dihapus pada tabel core_email_queue_recipients .
Cara terbaik untuk mencapai ini adalah dengan membuat kunci asing yang menautkan catatan ini dan menghapusnya pada kaskade (tetapi Anda perlu melakukan pembersihan sebelum Anda bisa melakukannya).
Ini adalah prosedur untuk memperbaiki masalah:
1) Jalankan dua query SQL berikut untuk membersihkan tabel core_email_queue_recipients dari catatan yatim dan id pesan berulang:
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);
Kueri pertama menghapus catatan yatim, dan yang kedua menghapus catatan lama yang tidak lagi valid.
2) Buat kunci asing pada tabel core_email_queue_recipients untuk menghapus catatan Penerima pada kaskade. Permintaan SQL untuk membuat kunci asing ini adalah:
ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;
Dengan menggunakan kunci asing baru ini, tidak ada catatan yatim piatu yang akan ditinggalkan di tabel core_email_queue_recipients saat membersihkan tabel core_email_queue , dan tidak ada pesan yang digandakan ke penerima yang salah yang akan dikirim di masa mendatang.