Domanda

Vedo uno strano comportamento in uno dei nostri negozi: quando viene effettuato un ordine, l'e-mail di conferma viene inviata in CC a tutti i clienti registrati che hanno un ordine in stato "elaborazione".Succede indipendentemente dal metodo di pagamento (è disponibile il bonifico bancario e la carta di credito) e il metodo di spedizione (solo Magento Flat Standard disponibile).

La configurazione del negozio è piuttosto semplice con un sito Web / archivio / archivio.Le estensioni installate non includono nulla dell'ordine o del checkout, ad eccezione dell'estensione del provider di pagamento della carta di credito.

È stato utile?

Soluzione

Attenzione!

Cosa fa questo codice: Ogni volta che il Magento-Cronjob rimuove tutti i messaggi inviati dalla tabella del database Core_email_queue, rimuove anche tutti i destinatari di questi messaggi. Quindi, in pratica, non funziona per te fino a quando questo cronob-compito è stato eseguito almeno una volta.

Soluzione

Ho trovato la risposta grazie a un'altra domanda qui: la tabella Core_email_queue_recipients non è stata svuotata dal cronjob. Il metodo Mage_Core_Model_Email_Queue::cleanQueue() chiama Mage_Core_Model_Resource_Email_Queue::removeSentMessages(), che è piuttosto semplice:

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

Comunque, questo metodo non rimuove i vecchi destinatari. Pertanto, non appena un nuovo messaggio con Message_ID N è in coda, tutti i vecchi destinatari con Message_ID N riceveranno anche la nuova email. La cosa che non capisco è: perché il team principale non ha visto questo, e perché non porta a più problemi?

Ho scritto un piccolo modulo per risolvere questo problema. Utilizza un override di classe per Mage_Core_Model_Resource_Email_Queue, quindi se qualcuno può suggerire una soluzione migliore (basata sull'evento?), Sarei felice.

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 / Codice / Locale / Namespace / EmailqueueFix / Modello / 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 / moduli / 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>
.

Altri suggerimenti

Ho pubblicato una correzione diversa che non richiede di installare un nuovo modulo e probabilmente è un po 'più pulito.

Utilizza solo un vincolo chiave estero sul Core_email_queue_recipients per eliminare i record dei destinatari su 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 , quindi non verranno ulteriormente inviati messaggi duplicatidestinatari.

Puoi trovare la soluzione dettagliata su questo post: https://magento.stackexchange.com/a/87299/23057

Questo è un problema degli indici nel database. Puoi ripararlo con uno strumento di riparazione del database Magento Magento .

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

Il problema mi causa molta frustrazione. Nel mio caso è stato originato dall'aggiornamento della versione. È una buona pratica ogni volta che si effettua un aggiornamento della versione per creare un'installazione pulita in un'altra directory e in un nuovo database di riferimento vuoto, utilizzare lo strumento per confrontare che la struttura e gli indici nel tuo database sono dichiarati come nel nuovo vuoto Database di riferimento. Questa struttura è ciò di cui è necessaria la nuova versione! Tieni presente che il problema non è di indici negativi e non può essere risolto con la riindicizzazione. Più è un problema di indici mancanti come lo vedo. Mantieni sempre le copie di backup del database prima di eseguire lo strumento! È un peccato che anche se si reinstalla magento, la verifica dell'indice e della struttura del database non viene fornita come opzione e devi seguire la procedura sopra. (Nel mio caso si stava aggiornando dalla versione da 1,8 a 1,9).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top