Эта проблема должна быть связана с новой системой Magento Email Queue, которая оставляет бесхозные записи в таблице получателей. Если это ваша проблема, я отправлю вам исправление.
Новая система Magento Email Queue управляет этими двумя таблицами: core_email_queue и core_email_queue_recipients . Первый обрабатывает сообщения электронной почты, а второй - Получатели этих сообщений.
Таблица core_email_queue очищается при отправке электронных писем в почтовой очереди Magento. Эта очистка выполняется заданием 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 (сообщения) сбрасывается, и поле message_id автоинкремента в этой таблице повторно устанавливается на 1.
Поскольку таблица core_email_queue_recipients (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 стола, и не дублированные сообщений в неправильные получатель будут отправлены в будущем.