Questo problema deve essere correlato al nuovo sistema di coda e-mail Magento, che lascia i record orfani nella tabella Destinatari. Se questo è il tuo problema, ti invio una correzione.
Il nuovo sistema Magento Email Queue gestisce queste due tabelle: core_email_queue e core_email_queue_recipients . Il primo gestisce i messaggi e-mail e, successivamente, i destinatari di questi messaggi.
La tabella core_email_queue viene ripulita quando vengono inviate e-mail nella coda e-mail Magento. Questa pulizia viene eseguita da un processo di cron tab chiamato core_email_queue_clean_up , definito all'interno del file di configurazione app / code / core / Mage / Core / etc / config.xm l. Il codice che esegue la pulizia è definito nella funzione removeSentMessages nella 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;
}
Il codice sopra è eseguito una volta al giorno dall'attività cron.
Ma succede che la tabella core_email_queue_recipients (quella che contiene i destinatari e-mail e che è collegata alla tabella core_email_queue dal campo message_id ), non viene ripulita insieme alla tabella core_email_queue (quella che contiene i messaggi e-mail), lasciando all'interno dei record orfani tabella dei destinatari quando viene eliminata la tabella dei messaggi.
Il problema qui descritto sorge quando la tabella core_email_queue (Messaggi) viene ripristinata e il campo message_id autoincrement su questa tabella viene reinizializzato su 1.
Poiché la tabella core_email_queue_recipients (Destinatari) non è stata pulita di conseguenza, quando vengono aggiunte nuove e-mail alla coda e-mail di Magento, i nuovi record vengono creati nella tabella core_email_queue (con message_id a partire da 1) e allo stesso tempo vengono creati nuovi record nella tabella core_email_queue_recipients con gli stessi ID (a partire da 1).
Il problema è che questi ID potrebbero già esistere nella tabella Destinatari come record orfani (a causa di precedenti messaggi di posta elettronica). Questi nuovi ID messaggi vengono quindi ripetuti nella tabella core_email_queue_recipients . Alla fine, diversi messaggi e-mail sono collegati ai rispettivi destinatari dal message_id , ma vengono anche erroneamente collegati ai destinatari precedenti a cui era stato assegnato lo stesso message_id dalle precedenti e-mail.
Pertanto, quando i destinatari vengono cercati per inviare un determinato messaggio, oltre al destinatario appropriato, possono sorgere altri destinatari errati.
Fortunatamente la correzione di questo problema è facile da eseguire.
Tutto ciò che serve è ripulire tutti gli ID dei messaggi ripetuti nella tabella core_email_queue_recipients e assicurarsi che quando un messaggio viene eliminato nella tabella core_email_queue , allo stesso tempo i destinatari corrispondenti vengano eliminati nella tabella core_email_queue_recipients .
Il modo migliore per raggiungere questo obiettivo è quello di creare una chiave esterna che colleghi questi record e li elimini in cascata (ma è necessario effettuare un po 'di pulizia prima di poterlo fare).
Questa è la procedura per risolvere il problema:
1) Eseguire le seguenti due query SQL per pulire la tabella core_email_queue_recipients da record orfani e ID messaggi ripetuti:
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 prima query elimina i record orfani e la seconda elimina i vecchi record che non sono più validi.
2) Creare una chiave esterna nella tabella core_email_queue_recipients per eliminare i record dei destinatari in cascata. La query SQL per creare questa chiave esterna è:
ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;
Utilizzando questa nuova chiave esterna, nessun record orfano verrà lasciato sulla tabella core_email_queue_recipients durante la pulizia della tabella core_email_queue e in futuro non verranno inviati messaggi duplicati a destinatari errati.