Esse problema deve estar relacionado ao novo sistema Magento Email Queue, que deixa registros órfãos na tabela Destinatários. Se este for o seu problema, eu lhe envio uma correção.
O novo sistema Magento Email Queue gerencia essas duas tabelas: core_email_queue e core_email_queue_recipients . O primeiro lida com as Mensagens de e-mail e o último, os Destinatários dessas mensagens.
A tabela core_email_queue é limpa à medida que os emails na Fila de email do Magento são enviados. Essa limpeza é realizada por um trabalho da guia cron chamado core_email_queue_clean_up , definido dentro do arquivo de configuração app / code / core / Mage / Core / etc / config.xm l. O código que executa a limpeza é definido na função removeSentMessages na classe 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;
}
O código acima é executado uma vez por dia pela tarefa cron.
Mas acontece que a tabela core_email_queue_recipients (aquela que contém destinatários de email e que está vinculada à tabela core_email_queue pelo campo message_id ) não é limpa junto com a tabela core_email_queue (aquela que contém as mensagens de email), deixando registros órfãos dentro tabela Destinatários quando a tabela Mensagem for limpa.
O problema descrito aqui surge quando a tabela core_email_queue (Messages) é redefinida e o campo autoincrement message_id nesta tabela é reiniciado para 1.
Como a tabela core_email_queue_recipients (Destinatários) não foi limpa adequadamente, quando novos emails são adicionados à Fila de E-mail Magento, novos registros são criados na tabela core_email_queue (com message_id iniciando novamente em 1) e, ao mesmo tempo, novos registros são criados na tabela core_email_queue_recipients com esses mesmos IDs (começando novamente em 1).
O problema é que esses IDs podem já existir na tabela Destinatários como registros órfãos (devido a mensagens de email anteriores). Esses novos IDs de mensagens são repetidos dentro da tabela core_email_queue_recipients . No final, diferentes mensagens de email são vinculadas aos seus destinatários correspondentes pelo message_id , mas também são incorretamente vinculadas aos destinatários anteriores aos quais foi atribuído o mesmo message_id dos emails anteriores.
Assim, quando os destinatários são procurados para enviar uma determinada mensagem, além do destinatário apropriado, outros destinatários errados podem surgir.
Felizmente, a correção para esse problema é fácil de executar.
Tudo o que é necessário é limpar todos os IDs de mensagens repetidas na tabela core_email_queue_recipients e garantir que, quando uma mensagem for excluída na tabela core_email_queue , ao mesmo tempo, seus destinatários correspondentes sejam excluídos na tabela core_email_queue_recipients .
A melhor maneira de conseguir isso é criar uma chave estrangeira que vincule esses registros e os exclua em cascata (mas é necessário fazer uma limpeza antes de fazer isso).
Este é o procedimento para corrigir o problema:
1) Execute as duas consultas SQL a seguir para limpar a tabela core_email_queue_recipients dos registros órfãos e dos IDs de mensagens repetidas:
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);
A primeira consulta exclui registros órfãos e a segunda exclui registros antigos que não são mais válidos.
2) Crie uma chave estrangeira na tabela core_email_queue_recipients para excluir os registros de destinatários em cascata. A consulta SQL para criar essa chave estrangeira é:
ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;
Ao usar essa nova chave estrangeira, nenhum registro órfão será deixado na tabela core_email_queue_recipients ao limpar a tabela core_email_queue , e nenhuma mensagem duplicada para destinatários errados será enviada no futuro.