Ця проблема повинна бути пов’язана з новою системою черги електронної пошти Magento, яка залишає сиротні записи в таблиці одержувачів. Якщо це ваша проблема, я надсилаю вам виправлення.
Нова система черги електронної пошти Magento управляє цими двома таблицями: core_email_queue та core_email_queue_recipients . Перша обробляє повідомлення електронної пошти, а пізніша - отримувачі цих повідомлень.
Таблиця core_email_queue видаляється , коли електронні листи в черзі електронної пошти Magento надсилаються. Це очищення виконується за допомогою вкладки cron, що називається core_email_queue_clean_up , яка визначена у файлі конфігурації програми / коду / ядра / Mage / Core / тощо / config.xm . Код , який виконує очистку , певні на 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 (Повідомлення) і поле автоінкрементування message_id у цій таблиці повторюється до 1.
Оскільки core_email_queue_recipients таблиця (Одержувачі) ні очищений відповідним чином , коли нові повідомлення електронної пошти будуть додані в Magento електронної пошти черзі, нові записи створюються на core_email_queue столі (з message_id знову , починаючи з 1), і в той же час створюються нові записи в таблиці core_email_queue_recipients з цими тими ж ідентифікаторами (починаючи знову з 1).
Проблема полягає в тому, що ці ідентифікатори вже можуть існувати в таблиці одержувачів як записи-сироти (через попередні повідомлення електронної пошти). Ці нові ідентифікатори ідентифікаторів повторюються в таблиці 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) Створіть зовнішній ключ у таблиці 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 столу, і не дубльовані повідомлень в неправильні одержувач будуть відправлені в майбутньому.