Dieses Problem muss mit dem neuen Magento Email Queue-System zusammenhängen, das verwaiste Datensätze in der Empfänger-Tabelle hinterlässt. Wenn dies Ihr Problem ist, sende ich Ihnen eine Lösung.
Das neue Magento Email Queue-System verwaltet diese beiden Tabellen: core_email_queue und core_email_queue_recipients . Die erste verarbeitet die E-Mail-Nachrichten und die zweite die Empfänger dieser Nachrichten.
Die Tabelle core_email_queue wird gelöscht , wenn E-Mails in der Magento-E-Mail-Warteschlange gesendet werden. Diese Bereinigung wird von einem Cron-Tab-Job namens core_email_queue_clean_up ausgeführt , der in der Konfigurationsdatei app / code / core / Mage / Core / etc / config.xml definiert ist . Der Code, der die Bereinigung ausführt, wird in der Funktion removeSentMessages in der Klasse Mage_Core_Model_Resource_Email_Queue definiert :
/**
* 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;
}
Der obige Code wird einmal täglich von der Cron-Task ausgeführt.
Aber es kommt vor, dass die core_email_queue_recipients Tabelle (die, die E - Mail - Empfänger hält, und die mit der verbunden ist core_email_queue durch die Tabelle message_id Feld), nicht zusammen mit der gereinigt core_email_queue Tabelle (die, die E - Mail - Nachrichten hält), so dass verwaiste Aufzeichnungen innen diese Empfängertabelle, wenn dann Nachrichtentabelle bereinigt wird.
Das hier beschriebene Problem tritt auf, wenn die Tabelle core_email_queue (Messages) zurückgesetzt und das Feld message_id für die automatische Inkrementierung in dieser Tabelle auf 1 zurückgesetzt wird.
Da die Tabelle core_email_queue_recipients (Recipients) nicht entsprechend bereinigt wurde, werden beim Hinzufügen neuer E-Mails zur Magento-E-Mail-Warteschlange neue Datensätze in der Tabelle core_email_queue erstellt (wobei message_id wieder bei 1 beginnt) und gleichzeitig neue Datensätze erstellt in der Tabelle core_email_queue_recipients mit denselben IDs (erneut beginnend mit 1).
Das Problem ist, dass diese IDs möglicherweise bereits in der Empfängertabelle als verwaiste Datensätze vorhanden sind (aufgrund früherer E-Mail-Nachrichten). Diese neuen Nachrichten-IDs werden dann in der Tabelle core_email_queue_recipients wiederholt . Am Ende werden verschiedene E-Mail-Nachrichten durch die message_id mit den entsprechenden Empfängern verknüpft , sie werden jedoch auch fälschlicherweise mit früheren Empfängern verknüpft, denen dieselbe message_id aus früheren E-Mails zugewiesen wurde .
Wenn also nach Empfängern gesucht wird, um eine bestimmte Nachricht zu senden, können neben dem geeigneten Empfänger auch andere falsche Empfänger auftreten.
Glücklicherweise ist die Behebung dieses Problems einfach durchzuführen.
Sie müssen lediglich alle wiederholten Nachrichten-IDs in der Tabelle core_email_queue_recipients bereinigen und sicherstellen, dass beim Löschen einer Nachricht in der Tabelle core_email_queue gleichzeitig die entsprechenden Empfänger in der Tabelle core_email_queue_recipients gelöscht werden.
Der beste Weg, dies zu erreichen, besteht darin, einen Fremdschlüssel zu erstellen, der diese Datensätze verknüpft und sie in einer Kaskade löscht (Sie müssen jedoch eine Bereinigung vornehmen, bevor Sie dies tun können).
So beheben Sie das Problem:
1) Führen Sie die folgenden zwei SQL-Abfragen aus, um die Tabelle core_email_queue_recipients von verwaisten Datensätzen und IDs wiederholter Nachrichten zu bereinigen :
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);
Die erste Abfrage löscht verwaiste Datensätze, und die zweite Abfrage löscht alte Datensätze, die nicht mehr gültig sind.
2) Erstellen Sie einen Fremdschlüssel in der Tabelle core_email_queue_recipients , um Empfängerdatensätze in der Kaskade zu löschen. Die SQL-Abfrage zum Erstellen dieses Fremdschlüssels lautet:
ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;
Bei Verwendung dieses neuen Fremdschlüssels verbleiben beim Bereinigen der Tabelle core_email_queue_recipients keine verwaisten Datensätze in der Tabelle core_email_queue , und es werden in Zukunft keine doppelten Nachrichten an falsche Empfänger gesendet.