ปัญหานี้จะต้องเกี่ยวข้องกับระบบ Magento Email Queue ใหม่ซึ่งจะทิ้งเร็กคอร์ดเด็กกำพร้าไว้ในตารางผู้รับ หากนี่คือปัญหาของคุณฉันจะส่งการแก้ไขให้คุณ
ใหม่วีโอไอพีอีเมล์ระบบจัดการคิวทั้งสองตาราง: core_email_queueและcore_email_queue_recipients อดีตหนึ่งจัดการข้อความอีเมลและหนึ่งในภายหลังผู้รับของข้อความเหล่านี้
core_email_queueตารางทำความสะอาดออกเป็นอีเมลบนวีโอไอพีอีเมล์คิวจะถูกส่ง การทำความสะอาดนี้ดำเนินการโดยงานแท็บ cron ชื่อcore_email_queue_clean_upที่กำหนดไว้ในไฟล์/ app / code / core / Mage / Core / etc / config.xm l รหัสที่มีประสิทธิภาพการทำความสะอาดที่ถูกกำหนดใน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;
}
รหัสข้างต้นจะถูกดำเนินการวันละครั้งโดยงาน cron
แต่มันเกิดขึ้นที่ตาราง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) และในเวลาเดียวกัน บนตารางcore_email_queue_recipientsด้วยรหัสเดียวกันเหล่านี้ (เริ่มต้นอีกครั้งจาก 1)
ปัญหาคือรหัสเหล่านี้อาจมีอยู่แล้วในตารางผู้รับเป็นระเบียนเด็กกำพร้า (เนื่องจากข้อความอีเมลก่อนหน้า) รหัส mesages ใหม่เหล่านี้จะถูกทำซ้ำภายในตารางcore_email_queue_recipients ในท้ายที่สุดข้อความอีเมลที่แตกต่างกันมีการเชื่อมโยงไปยังผู้รับที่สอดคล้องกันของพวกเขาโดยMessage_idแต่พวกเขาได้รับการเชื่อมโยงอย่างผิดพลาดไปยังผู้รับก่อนหน้านี้ที่ได้รับมอบหมายเดียวกันMessage_idจากอีเมลก่อนหน้านี้
ดังนั้นเมื่อผู้รับถูกค้นหาเพื่อส่งข้อความที่กำหนดนอกเหนือจากผู้รับที่เหมาะสมอาจมีผู้รับที่ไม่ถูกต้องเกิดขึ้น
โชคดีที่การแก้ไขปัญหานี้ทำได้ง่าย
สิ่งที่จำเป็นทั้งหมดคือการล้างรหัสข้อความซ้ำ ๆ ทั้งหมดบนตารางcore_email_queue_recipientsและตรวจสอบให้แน่ใจว่าเมื่อข้อความถูกลบบนตารางcore_email_queueในเวลาเดียวกันผู้รับที่สอดคล้องกันจะถูกลบบนตารางcore_email_queue_recipients
วิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้คือการสร้างคีย์ต่างประเทศที่เชื่อมโยงบันทึกเหล่านี้และลบทิ้งในน้ำตก (แต่คุณจำเป็นต้องทำความสะอาดก่อนที่จะทำเช่นนั้น)
นี่เป็นขั้นตอนในการแก้ไขปัญหา:
1) เรียกใช้เคียวรี SQL สองรายการต่อไปนี้เพื่อล้างตารางcore_email_queue_recipientsจากเร็กคอร์ดเด็กกำพร้าและรหัสข้อความซ้ำ ๆ กัน:
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) สร้าง foreign key ในตาราง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และจะไม่มีการส่งข้อความซ้ำไปยังผู้รับที่ไม่ถูกต้องในอนาคต