Bu sorun, Alıcılar masasında artık kayıt bırakan yeni Magento E-posta Kuyruğu sistemi ile ilgili olmalıdır. Bu senin sorununsa, sana bir düzeltme gönderirim.
Yeni Magento Email Queue sistemi bu iki tabloyu yönetmektedir: core_email_queue ve core_email_queue_recipients . İlki e-posta Mesajlarını ve daha sonra da bu mesajların Alıcılarını işler.
Core_email_queue Magento Email Kuyruk üzerinde e-postalar gönderilir olarak tablo dışarı temizlenir. Bu temizlik, app / code / core / Mage / Core / etc / config.xm l config dosyasında tanımlanmış olan core_email_queue_clean_up adlı bir cron sekmesi işi tarafından gerçekleştirilir . Temizlemeyi yapan kod , Mage_Core_Model_Resource_Email_Queue sınıfındaki removeSentMessages işlevinde tanımlanmıştır :
/**
* 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;
}
Yukarıdaki kod cron görevi tarafından günde bir kez çalıştırılır.
Ama bu gerçekleşirse core_email_queue_recipients tablo (bağlı olduğu e-posta Alıcıları tutan biri ve core_email_queue tarafından masaya message_id alanda), ile birlikte temizlenmezse core_email_queue içeride yetim kayıtlarını bırakarak masanın (e-posta iletileri tutan bir) Alıcı tablosu ne zaman sonra Mesaj tablosu temizlenir.
Burada açıklanan sorun core_email_queue tablosu (Mesajlar) sıfırlandığında ve bu tablodaki autoincrement message_id alanı 1 olarak ayarlandığında ortaya çıkar .
Çünkü core_email_queue_recipients tablo (Alıcılar) buna göre temizlenmelidir henüz yeni e-postaları Magento E-posta Kuyruğa eklendiğinde, yeni kayıtlar oluşturulur core_email_queue (masanın message_id 1'den tekrar başlayarak) ve aynı zamanda yeni kayıtlar oluşturulur ilgili core_email_queue_recipients bu aynı kimlikleri masanın (1 ile yeniden).
Sorun, bu kimliklerin Alıcı tablosunda yetimlerin kayıtları olarak (önceki e-posta iletilerinden dolayı) bulunabilmesidir. Bu yeni mesajlaşma kimlikleri daha sonra core_email_queue_recipients tablosunun içinde tekrarlanır . Sonunda, farklı e-posta Mesajları, kendi alıcılarına message_id ile bağlanır , ancak aynı zamanda önceki e-postalardan aynı mesaj_id atanan önceki alıcılara da yanlış bağlanırlar .
Bu nedenle, alıcılar verilen bir mesajı göndermek için arandığında, uygun alıcının yanı sıra, başka yanlış alıcılar da ortaya çıkabilir.
Neyse ki bu sorunun düzeltilmesi oldukça kolay.
İhtiyaç duyulan tek şey tüm tekrarlanan mesajlar kimlikleri temizlik olduğunu core_email_queue_recipients masa ve emin Mesaj üzerine silindiğinde o core_email_queue karşılık gelen Alıcıları üzerine silinir aynı zamanda, masanın core_email_queue_recipients masaya.
Bunu başarmanın en iyi yolu, bu kayıtları birbirine bağlayan ve bunları kaskadda silen yabancı bir anahtar oluşturmaktır (ancak bunu yapmadan önce biraz temizlik yapmanız gerekir).
Sorunu çözmek için prosedür budur:
1) core_email_queue_recipients tablosunu artık kayıtlardan ve tekrarlanan mesaj numaralarından temizlemek için aşağıdaki iki SQL sorgusunu yürütün :
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);
İlk sorgu yetim kayıtları siler, ikincisi ise artık geçerli olmayan eski kayıtları siler.
2) Basamaktaki Alıcı kayıtları silmek için core_email_queue_recipients tablosunda bir yabancı anahtar oluşturun . Bu yabancı anahtarı oluşturmak için SQL sorgusu:
ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;
Bu yeni dış anahtarı kullanarak, hiçbir yetim kayıtları bırakılacaktır core_email_queue_recipients temizlerken masanın core_email_queue masa ve yanlış alıcılara hiçbir çoğaltılamaz mesajlar gelecekte gönderilecek.