Magentoの注文確認がすべての顧客に送信されます


8

私たちのショップの1つで奇妙な動作が見られます。注文が行われると、「処理中」の状態にあるすべての登録済み顧客に確認メールがCCで送信されます。お支払い方法(銀行振込とクレジットカードがご利用いただけます)と配送方法(マジェントフラットスタンダードのみご利用いただけます)とは関係なく行われます。

shop-setupはかなり基本的なもので、1つのWebサイト/ストア/ストアビューがあります。インストールされている拡張機能には、クレジットカードの支払いプロバイダーの拡張機能を除いて、注文やチェックアウトに関連するものは含まれていません。


コードsimonthesorcererをありがとう。同じ問題が発生しています。Magento 1.9.1のすべてのメールは、未処理の注文(処理中または保留中)のすべての顧客に送信されています。イベントベースのソリューションまたはその問題の解決策が見つかりません。私はあなたの解決策を試しましたが、うまくいきませんでした。app / code / local /には、次のフォルダー/ファイルはありませんでした。あなたが書いたコードをコピーした。ただし、問題は解決しませんでした。上記のフォルダ/ファイルを作成しましたか、それともm
ですか

こんにちは、コードは拡張機能です。そのため、手動でフォルダーやファイルを作成する必要がありました。このコードの機能は、magento-cronjobがすべての送信メッセージをcore_email_queueデータベーステーブルから削除するたびに、これらのメッセージの受信者もすべて削除します。つまり、このcronjob-taskは、有効になる前に少なくとも1回実行する必要があるため、基本的には機能しませんでした。
simonthesorcerer 2015

回答:


7

注意!

このコードの機能は、magento-cronjobがすべての送信メッセージをcore_email_queueデータベーステーブルから削除するたびに、これらのメッセージの受信者もすべて削除します。したがって、基本的には、このcronjob-taskが少なくとも1回実行されるまで機能しません。

解決

私はここで別の質問のおかげで答えを見つけました:core_email_queue_recipientsテーブルはcronjobによって空にされませんでした。メソッドMage_Core_Model_Email_Queue::cleanQueue()はを呼び出しますMage_Core_Model_Resource_Email_Queue::removeSentMessages()。これは非常に簡単です。

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

とにかく、このメソッドは古い受信者を削除しません。したがって、message_id nの新しいメッセージがキューに入れられるとすぐに、message_id nのすべての古い受信者も新しい電子メールを受信します。私が理解していないのは、なぜコアチームがこれを見なかったのか、なぜこれがより多くの問題を引き起こさないのかです。

これを修正するために小さなモジュールを書きました。これはのクラスオーバーライドを使用するMage_Core_Model_Resource_Email_Queueため、誰かがより良い(イベントベースの?)ソリューションを提案できる場合は、私は喜んでいます。

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>

2

新しいモジュールをインストールする必要がない別の修正を投稿しました。おそらく少しクリーンです。

core_email_queue_recipientsテーブルの外部キー制約を使用して、カスケードで受信者レコードを削除します。

この新しい外部キーを使用すると、core_email_queueテーブルをクリーニングするときに、孤立したレコードがcore_email_queue_recipientsテーブルに残らないため、重複したメッセージが間違った受信者に送信されることはありません。

詳細な解決策はこの投稿にあります:https : //magento.stackexchange.com/a/87299/23057


IMOこれはよりクリーンなソリューションであり、外部キーはデフォルトで含まれるべきです。
micwallace

1

これはデータベースのインデックスの問題です。あなたはでそれを修復することができますMagentoのデータベースの修復ツール

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

問題は私に多くのフラストレーションを引き起こします。私の場合、それはバージョンのアップグレードから発生しました。バージョンアップグレードを行って別のディレクトリと新しい空の参照データベースにクリーンインストールを作成し、ツールを使用してデータベースの構造とインデックスが新しい空のように宣言されていることを比較することは、常に良い習慣です。参照データベース。この構造は、新しいバージョンに必要なものです。問題は悪いインデックスではなく、再インデックス付けで解決できないことに注意してください。もっと見ると、インデックスが見つからないという問題があります。ツールを実行する前に、常にデータベースのバックアップコピーを保管してください。Magentoを再インストールしても、データベースのインデックスと構造の検証はオプションとして提供されておらず、上記の手順に従う必要があるのは残念です。(私の場合、バージョン1.8から1.9へのアップグレードでした)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.