อีเมลคำสั่งซื้อใหม่จะถูกส่งสองครั้ง


25

ฉันใช้ Magento 1.9.1 และเมื่อสร้างคำสั่งซื้อใหม่ไม่ว่าจะเป็นจากส่วนหน้าหรือผู้ดูแลระบบจะส่งอีเมล 2 ฉบับ - ทั้งคู่เหมือนกัน!

ฉันดูในเน็ตและพบข้อผิดพลาดซึ่งเป็นรหัสเก่าและฉันไม่สามารถหารหัสที่กล่าวถึงความคิดเห็นมันก็ดูเหมือนว่าจะทำอย่างไรกับคำสั่งซื้อของ Paypal และนี่ไม่ใช่กรณี

ฉันได้ปิดการใช้งานส่วนขยายทั้งหมดแล้วลองและยังคงมีปัญหาเดียวกันดังนั้นฉันมั่นใจว่าไม่ใช่ปัญหาของส่วนขยาย


1
คุณแก้ปัญหานี้แล้วหรือยัง? ฉันได้รับการยืนยันคำสั่งซื้อแปลก ๆ ซ้ำ ๆ กันเป็นครั้งคราวและใช้ bcc สำหรับการยืนยันอีเมลด้วย ไม่ทราบว่าลูกค้าจะได้รับอีเมลสองฉบับหรือไม่ แต่ฉันไม่หวังเช่นนั้น
ฟ็อกซ์

อีเมลนี้ส่งถึงใคร คุณเช็คเอาท์ด้วยหนึ่งในอีเมลของผู้ดูแลระบบของคุณ?
SR_Magento

ฉันได้รับปัญหาเดียวกัน (ผู้ใช้ได้รับอีเมลสองฉบับหลังจากทำการสั่งซื้อใหม่) ฉันไม่แน่ใจด้านล่างคำตอบและตารางทั้งสองของฉัน "core_email_queue" และ "core_email_queue_recipients" ว่างเปล่าดังนั้นฉันคิดว่านี่ไม่ใช่กรณีของฉัน โปรดช่วยฉันในเรื่องนี้
Abi Sharma

Abi Sharma ฉันมีปัญหาเดียวกันยังฉันได้รับอีเมลที่ซ้ำกัน ... คุณแก้ปัญหาได้หรือไม่ โปรดแจ้งให้เราทราบ
Lior Loria

คำตอบ:


48

ปัญหานี้จะต้องเกี่ยวข้องกับระบบ 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และจะไม่มีการส่งข้อความซ้ำไปยังผู้รับที่ไม่ถูกต้องในอนาคต


2
การวิจัยที่ยอดเยี่ยมและให้Césarแก้ไขการทำงาน นี่คือการกำกับดูแลที่สำคัญโดยทีมงานวีโอไอพีเนื่องจากนี่อาจส่งชื่อและที่อยู่ของลูกค้าให้กับลูกค้ารายอื่น ใครรู้ว่าสิ่งนี้ได้รับการแก้ไขในแพทช์ (ซึ่ง) / ปล่อยเลยเพราะปัญหานี้ถูกค้นพบ?
zigojacko

ยังคงประสบปัญหาของอีเมลคำสั่งซื้อเดียวกันที่ถูกส่งไปหลายครั้งไปยังที่อยู่อีเมลเดียวกันหลังจากใช้วิธีการแก้ปัญหาข้างต้นคุณช่วยได้ไหม?
aton1004

ฉันกำลังตรวจสอบตารางทั้งสองของฉันว่างเปล่าอยู่แล้วดังนั้นฉันต้องเรียกใช้สองขั้นตอน (แบบสอบถาม) หรือไม่
Abi Sharma

ใด ๆ ที่ฉันได้ทำแบบสอบถามเหล่านี้ แต่ไม่มีความช่วยเหลือ .. ยังคงได้รับอีเมลสั่งสองครั้ง
Abi Sharma

5

ผมมีปัญหาเหมือนกัน. สำหรับทุกคำสั่งซื้อฉันจะได้รับอีเมลลูกค้าและอีเมลแยกต่างหากไปยังที่อยู่ร้านค้าของฉัน - ทั้งในกล่องจดหมายของบัญชีอีเมลร้านค้าของฉัน

ใน Magento Admin: ระบบ> การกำหนดค่า> อีเมลการขาย> คำสั่งซื้อ

ฉันได้ตั้งค่าอีเมล "ส่งวิธีคัดลอกอีเมลของคำสั่งซื้อ" จาก "แยกอีเมล" เป็น "Bcc" และใช้งานได้ทันที ฉันได้รับเพียงหนึ่งอีเมลต่อการสั่งซื้อในขณะนี้


3
ฉันใช้วิธี Bcc อยู่แล้วดังนั้นจึงไม่เป็นปัญหาสำหรับฉัน :(
Christopher Thrower

ฉันกำลังใช้การตั้งค่านี้อยู่แล้ว แต่ผู้ใช้ได้รับ 2 อีเมลหลังจากทำการสั่งซื้อใหม่
Abi Sharma

1

ผมมีปัญหาเหมือนกัน. ในกรณีของฉันปัญหาเกิดจากซอร์สโค้ดของสคริปต์cron.sh

ผู้ให้บริการโฮสติ้งของฉันใช้สคริปต์cron.shและcron.phpเวอร์ชันของตัวเองสำหรับ Magento cron-job

เมื่อฉันเปลี่ยนจากสคริปต์cron.sh เป็นสคริปต์cron.phpสำหรับการเริ่ม Magento-Cron-Job อีเมลใบสั่งใหม่ถูกส่งเพียงครั้งเดียวปัญหาของฉันก็ถูกแก้ไขแล้ว

บางทีปัญหาของคุณอาจเกี่ยวข้องกับรหัสของสคริปต์cron.shหรือcron.php


สวัสดีเราได้ใช้สคริปต์ cron.php สำหรับงาน Magento cron แล้ว แต่ฉันได้รับอีเมลสองครั้ง
Abi Sharma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.