Ce problème doit être lié au nouveau système Magento Email Queue, qui laisse des enregistrements orphelins sur la table Destinataires. Si c'est votre problème, je vous envoie un correctif.
Le nouveau système Magento Email Queue gère ces deux tables: core_email_queue et core_email_queue_recipients . Le premier gère les messages électroniques et le dernier, les destinataires de ces messages.
La table core_email_queue est nettoyée lors de l'envoi d'e-mails sur la file d'attente d'e-mails de Magento. Ce nettoyage est effectué par un travail de l'onglet cron appelé core_email_queue_clean_up , qui est défini dans le fichier de configuration app / code / core / Mage / Core / etc / config.xm l. Le code qui effectue le nettoyage est défini sur la fonction removeSentMessages dans la 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;
}
Le code ci-dessus est exécuté une fois par jour par la tâche cron.
Mais il arrive que la table core_email_queue_recipients (celle qui contient les destinataires des e-mails, et qui est liée à la table core_email_queue par le champ message_id ), ne soit pas nettoyée avec la table core_email_queue (celle qui contient les messages électroniques), laissant des enregistrements orphelins à l'intérieur cette table des destinataires lorsque la table des messages est nettoyée.
Le problème décrit ici se pose lorsque la table core_email_queue (Messages) est réinitialisée et que le champ autoincrement message_id de cette table est réinitialisé à 1.
Étant donné que la table core_email_queue_recipients (Recipients) n'a pas été nettoyée en conséquence, lorsque de nouveaux e-mails sont ajoutés à la file d'attente de messagerie Magento, de nouveaux enregistrements sont créés sur la table core_email_queue (avec message_id recommençant à partir de 1), et en même temps de nouveaux enregistrements sont créés sur la table core_email_queue_recipients avec ces mêmes identifiants (en recommençant à partir de 1).
Le problème est que ces identifiants peuvent déjà exister sur la table Destinataires en tant qu'enregistrements orphelins (en raison des messages électroniques précédents). Ces nouveaux identifiants de messages sont ensuite répétés dans la table core_email_queue_recipients . En fin de compte, différents messages électroniques sont liés à leurs destinataires correspondants par le message_id , mais ils sont également liés à tort aux destinataires précédents auxquels le même message_id a été attribué à partir des courriers électroniques précédents.
Ainsi, lorsque des destinataires sont recherchés pour envoyer un message donné, outre le destinataire approprié, d'autres destinataires incorrects peuvent apparaître.
Heureusement, le correctif de ce problème est facile à effectuer.
Tout ce qui est nécessaire est de nettoyer tous les ID de messages répétés sur la table core_email_queue_recipients et de s'assurer que lorsqu'un message est supprimé sur la table core_email_queue , en même temps ses destinataires correspondants sont supprimés sur la table core_email_queue_recipients .
La meilleure façon d'y parvenir est de créer une clé étrangère qui relie ces enregistrements et les supprime en cascade (mais vous devez effectuer un nettoyage avant de pouvoir le faire).
Voici la procédure pour résoudre le problème:
1) Exécutez les deux requêtes SQL suivantes pour nettoyer la table core_email_queue_recipients des enregistrements orphelins et des ID de messages répétés:
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);
La première requête supprime les enregistrements orphelins et la seconde supprime les anciens enregistrements qui ne sont plus valides.
2) Créez une clé étrangère sur la table core_email_queue_recipients pour supprimer les enregistrements de destinataires en cascade. La requête SQL pour créer cette clé étrangère est:
ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;
En utilisant cette nouvelle clé étrangère, aucun enregistrement orphelin ne sera laissé sur la table core_email_queue_recipients lors du nettoyage de la table core_email_queue , et aucun message dupliqué à des destinataires incorrects ne sera envoyé à l'avenir.