यह समस्या नए Magento ईमेल कतार प्रणाली से संबंधित होनी चाहिए, जो प्राप्तकर्ता तालिका पर अनाथ रिकॉर्ड छोड़ देती है। यदि यह आपका मुद्दा है, तो मैं आपको एक फिक्स भेजता हूं।
नई Magento ईमेल कतार प्रणाली इन दो तालिकाओं का प्रबंधन करती है: core_email_queue और core_email_queue_piplients । पहले वाला ईमेल संदेशों और बाद में एक, इन संदेशों के प्राप्तकर्ता को संभालता है।
Core_email_queue मेज साफ के रूप में Magento ईमेल कतार पर ईमेल भेजा जाता है। यह सफाई एक क्रॉन टैब जॉब द्वारा की जाती है जिसे core_email_queue_clean_up कहा जाता है , जिसे ऐप / कोड / कोर / Mage / Core / etc / config.xm l config फाइल के अंदर परिभाषित किया गया है । कोड है कि प्रदर्शन सफाई पर परिभाषित किया गया है removeSentMessages में कार्य 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;
}
उपरोक्त कोड को क्रोन कार्य द्वारा दिन में एक बार निष्पादित किया जाता है।
लेकिन यह होता है कि core_email_queue_recipients तालिका (एक है कि ईमेल प्राप्तकर्ता रखती है, और उस से जुड़ा हुआ है core_email_queue द्वारा तालिका message_id क्षेत्र), के साथ एक साथ साफ नहीं है core_email_queue तालिका (एक है कि ई-मेल संदेश रखती है), अनाथ रिकॉर्ड के अंदर छोड़ने उस प्राप्तकर्ता तालिका जब संदेश तालिका साफ हो जाती है।
यहां वर्णित समस्या तब उत्पन्न होती है जब core_email_queue तालिका (संदेश) रीसेट हो जाती है और इस तालिका पर autoincrement message_id फ़ील्ड को 1 पर पुन: स्थापित कर दिया जाता है।
क्योंकि core_email_queue_recipients तालिका (प्राप्तकर्ता) तदनुसार साफ नहीं किया गया है, जब नए ईमेल Magento ईमेल कतार में जुड़ जाते हैं, नए रिकॉर्ड पर बनाई गई हैं core_email_queue तालिका (साथ message_id 1 से फिर से शुरू करने), और एक ही समय में नए रिकॉर्ड बनाए जाते हैं इन समान आईडी (1 से फिर से शुरू) के साथ core_email_queue_recipients तालिका पर ।
समस्या यह है कि ये आईडी प्राप्तकर्ता रिकॉर्ड्स पर पहले से ही अनाथ रिकॉर्ड (पिछले ईमेल संदेशों के कारण) के रूप में मौजूद हो सकते हैं। ये नई मैसेज आईडी तब कोर_मैल_केय्यू_स्रीपिल्टर्स टेबल के अंदर दोहराई जाती हैं। अंत में, विभिन्न ईमेल संदेश Message_id द्वारा अपने संबंधित प्राप्तकर्ताओं से जुड़े होते हैं , लेकिन वे पिछले रसीदों से भी गलत तरीके से जुड़ जाते हैं जिन्हें पिछले ईमेल से एक ही message_id सौंपा गया था।
इस प्रकार, जब प्राप्तकर्ता को दिए गए संदेश को भेजने के लिए खोजा जाता है, तो उपयुक्त प्राप्तकर्ता के अलावा, अन्य गलत प्राप्तकर्ता उत्पन्न हो सकते हैं।
सौभाग्य से इस मुद्दे के लिए प्रदर्शन करना आसान है।
सभी की जरूरत है कि core_email_queue_recipients तालिका पर सभी दोहराया संदेश आईडी साफ कर रहा है, और सुनिश्चित करें कि जब एक संदेश core_email_queue तालिका पर हटा दिया जाता है , उसी समय इसके संबंधित प्राप्तकर्ता कोर_email_queue_recipients तालिका पर हटा दिए जाते हैं।
इसे प्राप्त करने का सबसे अच्छा तरीका एक विदेशी कुंजी बनाना है जो इन रिकॉर्डों को जोड़ता है और उन्हें कैस्केड पर हटा देता है (लेकिन आपको ऐसा करने से पहले कुछ सफाई करने की आवश्यकता है)।
यह समस्या को ठीक करने की प्रक्रिया है:
1) अनाथ रिकॉर्ड्स और बार-बार संदेश आईडी से core_email_queue_recipients तालिका साफ़ करने के लिए निम्नलिखित दो SQL प्रश्नों का निष्पादन करें :
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);
पहली क्वेरी अनाथ रिकॉर्ड को हटा देती है, और दूसरा पुराना रिकॉर्ड हटा देता है जो अब मान्य नहीं हैं।
2) कैस्केड पर प्राप्तकर्ता के रिकॉर्ड को हटाने के लिए core_email_queue_recipients तालिका पर एक विदेशी कुंजी बनाएं । इस विदेशी कुंजी को बनाने के लिए SQL क्वेरी है:
ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;
इस नई विदेशी कुंजी का उपयोग करके, core_email_queue_recipients तालिका में कोई भी अनाथ रिकॉर्ड नहीं छोड़ा जाएगा जब core_email_queue तालिका को साफ किया जाएगा , और भविष्य में गलत प्राप्तकर्ताओं को कोई डुप्लिकेट किए गए संदेश नहीं भेजे जाएंगे।