Die Magento-Auftragsbestätigung wird an alle Kunden gesendet

8

Ich sehe ein seltsames Verhalten in einem unserer Shops: Wenn eine Bestellung aufgegeben wird, wird die Bestätigungs-E-Mail in CC an alle registrierten Kunden gesendet, die eine Bestellung im Status "Bearbeitung" haben. Dies geschieht unabhängig von der Zahlungsmethode (Banküberweisung und Kreditkarte sind verfügbar) und der Versandmethode (nur Magento Flat Standard verfügbar).

Das Shop-Setup ist ziemlich einfach mit einer Website / Store / Store-Ansicht. Installierte Erweiterungen enthalten nichts Bestell- oder Checkout-bezogenes außer der Erweiterung des Zahlungsanbieters der Kreditkarte.

simonthesorcerer
quelle
Danke für den Code simonthesorcerer. Ich habe das gleiche Problem. Alle E-Mails in Magento 1.9.1 werden mit offenen Bestellungen (Bearbeitung oder ausstehend) an alle Kunden gesendet. Ich habe keine ereignisbasierte Lösung oder eine Lösung für diese Angelegenheit gefunden. Ich habe Ihre Lösung ausprobiert, aber sie hat nicht funktioniert. In app / code / local / hatte ich keinen der folgenden Ordner / Dateien: Namespace / EmailQueueFix / etc / config.xml Namespace / EmailQueueFix / Modell / Ressource / Email / Queue.php Also habe ich die Ordner und Dateien erstellt und hat den von Ihnen geschriebenen Code kopiert. Das Problem wurde jedoch nicht behoben. Haben Sie die oben genannten Ordner / Dateien erstellt oder sind m
JK9
HI, der Code ist eine Erweiterung, daher ist es richtig, dass Sie die Ordner / Dateien manuell erstellen mussten. Dieser Code bewirkt Folgendes: Jedes Mal, wenn der Magento-Cronjob alle gesendeten Nachrichten aus der Datenbanktabelle core_email_queue entfernt, werden auch alle Empfänger dieser Nachrichten entfernt. Im Grunde hat es bei Ihnen nicht funktioniert, da diese Cronjob-Aufgabe mindestens einmal ausgeführt werden muss, bevor sie wirksam wird.
Simonthesorcerer

Antworten:

7

Beachtung!

Dieser Code bewirkt Folgendes: Jedes Mal, wenn der Magento-Cronjob alle gesendeten Nachrichten aus der Datenbanktabelle core_email_queue entfernt, werden auch alle Empfänger dieser Nachrichten entfernt. Im Grunde funktioniert es also nicht für Sie, bis diese Cronjob-Aufgabe mindestens einmal ausgeführt wurde.

Lösung

Ich fand die Antwort dank einer anderen Frage hier: Die Tabelle core_email_queue_recipients wurde vom Cronjob nicht geleert. Die Methode Mage_Core_Model_Email_Queue::cleanQueue()ruft auf Mage_Core_Model_Resource_Email_Queue::removeSentMessages(), was ziemlich einfach ist:

public function removeSentMessages() {
    $this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL');
    return $this;
}

Auf jeden Fall werden bei dieser Methode die alten Empfänger nicht entfernt. Sobald eine neue Nachricht mit message_id n in die Warteschlange gestellt wird, erhalten alle alten Empfänger mit message_id n auch die neue E-Mail. Was ich nicht verstehe ist: Warum hat das Kernteam das nicht gesehen und warum führt dies nicht zu weiteren Problemen?

Ich habe ein kleines Modul geschrieben, um dies zu beheben. Es wird eine Klassenüberschreibung verwendet. Mage_Core_Model_Resource_Email_QueueWenn also jemand eine bessere (ereignisbasierte?) Lösung vorschlagen kann, würde ich mich freuen.

app / code / local / Namespace / EmailQueueFix / etc / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Namespace_EmailQueueFix>
            <version>1.0</version>
        </Namespace_EmailQueueFix>
    </modules>
    <global>
        <models>
            <core_resource>
                <rewrite>
                    <email_queue>Namespace_EmailQueueFix_Model_Resource_Email_Queue</email_queue>
                </rewrite>
            </core_resource>
        </models>
    </global>
</config>

app / code / local / Namespace / EmailQueueFix / Model / Resource / Email / Queue.php

<?php

class Namespace_EmailQueueFix_Model_Resource_Email_Queue extends Mage_Core_Model_Resource_Email_Queue {
    /**
     * Remove already sent messages
     * ADDED: also remove all recipients of sent messages!
     *
     * @return Mage_Core_Model_Resource_Email_Queue
     */
    public function removeSentMessages() {
        $writeAdapter = $this->_getWriteAdapter();
        $readAdapter = $this->_getReadAdapter();
        $select = $readAdapter->select()->from(array("ceqr" => $this->getTable('core/email_recipients')), array('*'))->joinLeft(array('ceq' => $this->getMainTable()), 'ceqr.message_id = ceq.message_id', array('*'))->where('ceq.processed_at IS NOT NULL OR ceq.message_id IS NULL');
        $recipients = $readAdapter->fetchAll($select);
        if ( $recipients ) {
            foreach ( $recipients as $recipient ) {
                $writeAdapter->delete($this->getTable('core/email_recipients'), "recipient_id = " . $recipient['recipient_id']);
            }
        }
        $writeAdapter->delete($this->getMainTable(), 'processed_at IS NOT NULL');
        return $this;
    }

}

app / etc / modules / Namespace_EmailQueueFix.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Namespace_EmailQueueFix>
            <codePool>local</codePool>
            <active>true</active>
        </Namespace_EmailQueueFix>
        <depends>
            <Mage_Core/>
        </depends>
    </modules>
</config>
simonthesorcerer
quelle
2

Ich habe ein anderes Update veröffentlicht, für das kein neues Modul installiert werden muss und das wahrscheinlich etwas sauberer ist.

Es wird lediglich eine Fremdschlüsseleinschränkung für die Tabelle core_email_queue_recipients verwendet , um Empfängerdatensätze in der Kaskade zu löschen.

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_recipients , sodass keine doppelten Nachrichten an falsche Empfänger gesendet werden.

Die detaillierte Lösung finden Sie in diesem Beitrag: https://magento.stackexchange.com/a/87299/23057

César Revert-Gomar
quelle
IMO ist dies eine sauberere Lösung und der Fremdschlüssel sollte standardmäßig enthalten sein.
Micwallace
1

Dies ist ein Problem der Indizes in der Datenbank. Sie können es mit dem Magento-Datenbankreparatur-Tool reparieren .

http://merch.docs.magento.com/ce/user_guide/magento/database-repair-tool.html

Das Problem macht mich sehr frustriert. In meinem Fall stammt es aus dem Versions-Upgrade. Es wird empfohlen, jedes Mal, wenn Sie ein Versions-Upgrade durchführen, eine Neuinstallation in einem anderen Verzeichnis und in einer neuen leeren Referenzdatenbank durchzuführen und dann mit dem Tool zu vergleichen, dass die Struktur und die Indizes in Ihrer Datenbank als in der neuen leeren deklariert sind Referenzdatenbank. Diese Struktur braucht die neue Version! Beachten Sie, dass das Problem nicht aus schlechten Indizes besteht und nicht durch eine erneute Indizierung gelöst werden kann. Mehr ist ein Problem der fehlenden Indizes, wie ich es sehe. Bewahren Sie immer Sicherungskopien der Datenbank auf, bevor Sie das Tool ausführen!Es ist schade, dass selbst wenn Sie Magento neu installieren, die Index- und Strukturüberprüfung der Datenbank nicht als Option angeboten wird und Sie das oben beschriebene Verfahren befolgen müssen. (In meinem Fall wurde ein Upgrade von Version 1.8 auf 1.9 durchgeführt).

Vasilis.S.
quelle