Ten problem musi być związany z nowym systemem kolejki e-mail Magento, który pozostawia osierocone rekordy w tabeli adresatów. Jeśli to jest twój problem, przesyłam Ci poprawkę.
Nowy system kolejki e-mail Magento zarządza tymi dwiema tabelami: core_email_queue i core_email_queue_recipients . Pierwszy obsługuje wiadomości e-mail, a drugi adresaci tych wiadomości.
Core_email_queue tabeli oczyszczony jak e-maile na Magento Email kolejki są wysyłane. To czyszczenie jest wykonywane przez zadanie karty cron o nazwie core_email_queue_clean_up , które jest zdefiniowane w pliku konfiguracyjnym app / code / core / Mage / Core / etc / config.xm l. Kod, który wykonuje czyszczenie jest określona na removeSentMessages funkcjonowania w Mage_Core_Model_Resource_Email_Queue klasy:
/**
* 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;
}
Powyższy kod jest wykonywany raz dziennie przez zadanie cron.
Ale zdarza się, że tabela core_email_queue_recipients (ta, która przechowuje adresatów e-mail, i która jest połączona z tabelą core_email_queue przez pole message_id ), nie jest czyszczona razem z tabelą core_email_queue (ta, która przechowuje wiadomości e-mail), pozostawiając w sobie sieroce rekordy do tej tabeli odbiorców, kiedy tablica wiadomości zostanie wyczyszczona.
Opisany tutaj problem powstaje, gdy tabela core_email_queue (Wiadomości) zostanie zresetowana, a pole auto - przyrostu message_id w tej tabeli zostanie ponownie uruchomione na 1.
Ponieważ tabela core_email_queue_recipients (Odbiorcy) nie została odpowiednio wyczyszczona, po dodaniu nowych wiadomości e-mail do kolejki e-mail Magento, nowe rekordy są tworzone w tabeli core_email_queue (z identyfikatorem wiadomości zaczynającym się od 1), a jednocześnie tworzone są nowe rekordy w tabeli core_email_queue_recipients z tymi samymi identyfikatorami (zaczynając od 1).
Problem polega na tym, że te identyfikatory mogą już istnieć w tabeli Odbiorcy jako rekordy osierocone (z powodu poprzednich wiadomości e-mail). Te nowe identyfikatory wiadomości są następnie powtarzane w tabeli core_email_queue_recipients . W końcu różne wiadomości e-mail są połączone z odpowiadającymi im adresatami przez id_wiadomości , ale są również błędnie powiązane z poprzednimi odbiorcami, którym przypisano ten sam id_danych z poprzednich wiadomości e-mail.
Tak więc, gdy odbiorcy są przeszukiwani, aby wysłać daną wiadomość, oprócz odpowiedniego odbiorcy, mogą pojawić się inni niewłaściwi odbiorcy.
Na szczęście naprawa tego problemu jest łatwa do wykonania.
Wystarczy wyczyścić wszystkie powtarzające się identyfikatory wiadomości w tabeli core_email_queue_recipients i upewnić się, że po usunięciu wiadomości w tabeli core_email_queue , jednocześnie odpowiadający jej odbiorcy zostaną usunięci w tabeli core_email_queue_recipients .
Najlepszym sposobem na osiągnięcie tego jest utworzenie klucza obcego, który łączy te rekordy i usuwa je kaskadowo (ale musisz to zrobić, zanim to zrobisz).
Oto procedura rozwiązania problemu:
1) Wykonaj następujące dwa zapytania SQL, aby wyczyścić tabelę core_email_queue_recipients z rekordów osieroconych i identyfikatorów powtórzonych wiadomości:
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);
Pierwsze zapytanie usuwa osierocone rekordy, a drugie usuwa stare rekordy, które nie są już ważne.
2) Utwórz klucz obcy w tabeli core_email_queue_recipients, aby usunąć rekordy odbiorców w kaskadzie. Zapytanie SQL służące do utworzenia tego klucza obcego to:
ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;
Dzięki zastosowaniu tego nowego klucza obcego nie zostaną pozostawione żadne osierocone rekordy w tabeli core_email_queue_recipients podczas czyszczenia tabeli core_email_queue_reue , aw przyszłości nie będą wysyłane zduplikowane wiadomości do niewłaściwych odbiorców.