A confirmação do pedido Magento é enviada a todos os clientes

8

Vejo um comportamento estranho em uma de nossas lojas: quando um pedido é feito, o email de confirmação é enviado em CC a todos os clientes registrados que têm um pedido no estado "processando". Isso acontece independentemente do método de pagamento (transferência bancária e cartão de crédito estão disponíveis) e do método de envio (apenas o Magento Flat Standard disponível).

A configuração da loja é bastante básica com uma visualização de site / loja / loja. As extensões instaladas não incluem nada relacionado a pedidos ou compras, exceto a extensão do provedor de pagamento do cartão de crédito.

simonthesorcerer
fonte
Obrigado pelo código simonthesorcerer. Estou tendo o mesmo problema. Todos os emails no Magento 1.9.1 estão sendo enviados a todos os clientes com pedidos abertos (em processamento ou pendentes). Não encontrei uma solução baseada em eventos ou qualquer solução para esse assunto. Eu tentei sua solução, mas não funcionou. Em app / code / local /, eu não tinha nenhuma das seguintes pastas / arquivos: Namespace / EmailQueueFix / etc / config.xml Namespace / EmailQueueFix / Model / Resource / Email / Queue.php Então criei as pastas e os arquivos e copiou o código que você escreveu. Ele não resolveu o problema. Você criou as pastas / arquivos acima ou é m
JK9:
Olá, o código é uma extensão, por isso é correto que você tenha que criar as pastas / arquivos manualmente. O que esse código faz é: toda vez que o magento-cronjob remove todas as mensagens enviadas da tabela do banco de dados core_email_queue, ele também remove todos os destinatários dessas mensagens. Portanto, basicamente, não funcionou para você porque essa tarefa do cronjob precisa ser executada pelo menos uma vez antes de entrar em vigor.
simonthesorcerer

Respostas:

7

Atenção!

O que esse código faz é: toda vez que o magento-cronjob remove todas as mensagens enviadas da tabela do banco de dados core_email_queue, ele também remove todos os destinatários dessas mensagens. Portanto, basicamente, ele não funciona para você até que esta tarefa do cronjob seja executada pelo menos uma vez.

Solução

Encontrei a resposta graças a outra pergunta aqui: a tabela core_email_queue_recipients não foi esvaziada pelo cronjob. O método Mage_Core_Model_Email_Queue::cleanQueue()chama Mage_Core_Model_Resource_Email_Queue::removeSentMessages(), o que é bastante simples:

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

De qualquer forma, esse método não remove os destinatários antigos. Assim, assim que uma nova mensagem com message_id n for enfileirada, todos os destinatários antigos com message_id n também receberão o novo email. O que não entendo é: por que a equipe principal não viu isso e por que isso não leva a mais problemas?

Eu escrevi um pequeno módulo para corrigir isso. Ele usa uma substituição de classe para Mage_Core_Model_Resource_Email_Queue, portanto, se alguém puder sugerir uma solução melhor (baseada em eventos?), Eu ficaria feliz.

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
fonte
2

Postei uma correção diferente que não requer a instalação de um novo módulo e provavelmente é um pouco mais limpa.

Ele apenas usa uma restrição de chave estrangeira na tabela core_email_queue_recipients para excluir os registros de Destinatários em cascata.

Ao usar essa nova chave estrangeira, nenhum registro órfão será deixado na tabela core_email_queue_recipients ao limpar a tabela core_email_queue , portanto, nenhuma mensagem duplicada será enviada para destinatários errados.

Você pode encontrar a solução detalhada neste post: https://magento.stackexchange.com/a/87299/23057

César Revert-Gomar
fonte
Na IMO, essa é uma solução mais limpa e a chave estrangeira deve ser incluída por padrão.
micwallace
1

Este é um problema de índices no banco de dados. Você pode repará-lo com a ferramenta de reparo de banco de dados Magento .

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

O problema me causa muita frustração. No meu caso, ele foi originado da atualização de versão. É uma boa prática cada vez que você faz um upgrade de versão para fazer uma instalação limpa em outro diretório e em um novo banco de dados de referência vazio e, em seguida, use a ferramenta para comparar se a estrutura e os índices do banco de dados são declarados como no novo vazio. banco de dados de referência. Essa estrutura é o que a nova versão precisa! Esteja ciente de que o problema não é de índices ruins e não pode ser resolvido com a re-indexação. Mais é um problema de falta de índices como eu o vejo. Sempre mantenha cópias de backup do banco de dados antes de executar a ferramenta!É uma pena que, mesmo se você reinstalar o Magento, a verificação de índice e estrutura do banco de dados não seja fornecida como uma opção e você tenha que seguir o procedimento acima. (no meu caso, estava atualizando da versão 1.8 para 1.9).

Vasilis.S.
fonte