販売用メールのコピーが複数回送信される


7

Magento 1.9.1.0を使用しています。

バックエンドでは、顧客が注文するたびにセールスコピーメールを受信するように4つの異なる受信者を設定しました。問題は、バックエンドに挿入したすべての受信者が同じコピーメールを複数回受信することです。

誰かがこの問題を以前に経験したことがありますか?


標準のメーラー($mailer = new Zend_Mail('utf-8'); $mailer->send();)を使用していますか、それともSMTPを使用していますか、それともサードパーティモジュールを使用していますか
tecjam 2015年

そして、あなたのcronはどのように設定されていますか?実行間隔が短すぎる場合は、同時に複数のインスタンスを実行している可能性があります。
tecjam 2015年

私は標準のメーラーを使用していますが、SMTPやサードパーティのモジュールは使用していません。私は「aeoスケジューラー」を使用しており、core_email_queue_send_allを毎分実行するように構成されています。
gianis6

core_email_queue_send_allのスケジュール時間を6分に変更してみましたが、結果は同じです。
gianis6

1
回答はできませんが、問題が発生していることを確認したいと思います。お客様は1通のメールを受け取り、構成内の最初のメールは2通、2通目は3通、というようになりました。問題は解決しましたが、同僚がそれを修正するために何をしたかわかりません。
Peter O'Callaghan

回答:


4

TL; DR:Magento 1.9.1では注文コピーメールが深刻に壊れているため、注文コピーメールには「個別のメール」オプションの代わりに「Bcc」オプションを使用します。それはあなたのコピーのメールアドレスを顧客に公開します。

Magentoがこれを処理する方法には、根本的に何か問題があります。「Send Order Email Copy To」で「Send Order Email Copy Method」を「Separate Email」に設定して複数の(カンマ区切り)メールアドレスを指定すると、Magentoはcore_email_queueテーブルに複数の個別のメッセージを作成しますコピーの受信者ごとに。

(例:test @ example.com、foobar @ example.comにコピーするように設定)

message_id    entity_id    entity_type    event_type    message_body_hash
4             19           order          new_order     b0faf3b948557fc38cf1ef564d0db16e
5             19           order          new_order     b0faf3b948557fc38cf1ef564d0db16e
6             19           order          new_order     b0faf3b948557fc38cf1ef564d0db16e

これで問題ありません。受信者ごとに個別のメッセージが作成されます。

ただし、実際の受信者は別のテーブルに保存されます- core_email_queue_recipients。ここが問題です。各メッセージに1人の受信者を割り当てる代わりに、次のことが起こります。

recipient_id    message_id    recipient_email
13              4             foobar@example.com
14              5             foobar@example.com
15              5             test@example.com
16              6             foobar@example.com
17              6             test@example.com
18              6             customer@example.com

最初のメッセージに1人の受信者、2番目に2番目、3番目に3番目などを割り当てます。[コピー]フィールドに追加する受信者が多いほど、リストの最後のメールを受信するメールが多くなります。

何をすべきに追加されたことはcore_email_queue_recipientsこれです:

recipient_id    message_id    recipient_email
13              4             foobar@example.com
14              5             test@example.com
15              6             customer@example.com

さらに悪いのは、顧客に送信された電子メールの[宛先]フィールドに他のすべての電子メールアドレスのリストが含まれているため、電子メールが「分離」していないことです(顧客の知識なしに個別に送信する必要があります) )-したがって、お客様にコピーリスト全体を公開します。

この問題を修正するには、Mage/Sales/Model/Order::queueNewOrderEmail()と同様にで壊れたコピーロジックをオーバーライドして大幅に書き換える必要がありますがMage/Core/Model/Email/Queue、これは簡単なことではありません。

短期的な修正は、コピー方法を「個別の電子メール」から「Bcc」に変更することです。このオプションは期待どおりに機能し、1つの電子メールのみを生成します。


Magento 2にも同じ提案を使用します。
Dmitry Dubovitsky 2018

1

Magentoはデータベースのキューエントリを比較し、結果が見つかった場合にのみ受信者をクリアします。

私の場合、Magentoがこのテンプレートが呼び出されるたびにインクリメントするtax / order / tax.phtmlでグローバル変数($ taxIter)を使用しているため、message_body_hashは異なりました。

<tr class="summary-details-1 summary-details summary-details-first">

この行をlocal.xmlに追加してみてください

    <sales_email_order_items>
    <reference name="order_totals">
        <reference name="tax">
            <action method="setTemplate"><template>tax/order/tax-email.phtml</template></action>
        </reference>
    </reference>
</sales_email_order_items>

そして、テンプレート "tax / order / tax.phtml"を "tax / order / tax-email.phtml"にコピーして変更します:

...
global $taxIter; $taxIter++;
...

に:

...
$taxIter=0; $taxIter++;
...

それ以外の場合は、私が説明しようとしたプロセスを理解して、うまくいけばその違いを見つけてください。

「Send Order Email Copy Method」の設定が「Separate Email」に設定されている場合、Magentoは「core_email_queue」に2つのメッセージをキューイングします。最初のメールは、バックエンドの指定された受信者宛です。2通目のメールでお客様をお迎えします。

メッセージはMage_Core_Model_Email_Template#send()に保存されます。

public function send($email, $name = null, array $variables = array())
{
    if (!$this->isValidForSend()) {
        Mage::logException(new Exception('This letter cannot be sent.')); // translation is intentionally omitted
        return false;
    }

    $emails = array_values((array)$email);
    $names = is_array($name) ? $name : (array)$name;
    $names = array_values($names);
    foreach ($emails as $key => $email) {
        if (!isset($names[$key])) {
            $names[$key] = substr($email, 0, strpos($email, '@'));
        }
    }

    $variables['email'] = reset($emails);
    $variables['name'] = reset($names);

    $this->setUseAbsoluteLinks(true);
    $text = $this->getProcessedTemplate($variables, true);
    $subject = $this->getProcessedTemplateSubject($variables);

    $setReturnPath = Mage::getStoreConfig(self::XML_PATH_SENDING_SET_RETURN_PATH);
    switch ($setReturnPath) {
        case 1:
            $returnPathEmail = $this->getSenderEmail();
            break;
        case 2:
            $returnPathEmail = Mage::getStoreConfig(self::XML_PATH_SENDING_RETURN_PATH_EMAIL);
            break;
        default:
            $returnPathEmail = null;
            break;
    }

    if ($this->hasQueue() && $this->getQueue() instanceof Mage_Core_Model_Email_Queue) {
        /** @var $emailQueue Mage_Core_Model_Email_Queue */
        $emailQueue = $this->getQueue();
        $emailQueue->setMessageBody($text);
        $emailQueue->setMessageParameters(array(
                'subject'           => $subject,
                'return_path_email' => $returnPathEmail,
                'is_plain'          => $this->isPlain(),
                'from_email'        => $this->getSenderEmail(),
                'from_name'         => $this->getSenderName(),
                'reply_to'          => $this->getMail()->getReplyTo(),
                'return_to'         => $this->getMail()->getReturnPath(),
            ))
            ->addRecipients($emails, $names, Mage_Core_Model_Email_Queue::EMAIL_TYPE_TO)
            ->addRecipients($this->_bccEmails, array(), Mage_Core_Model_Email_Queue::EMAIL_TYPE_BCC);
        $emailQueue->addMessageToQueue();

        return true;
    }

    ...
}

このメソッドは2回トリガーされ、最初の実行の変数($ _recipients)を含む同じキューモデル(Mage_Core_Model_Email_Queue $ emailQueue)を続行します。

->addRecipients($emails, $names, Mage_Core_Model_Email_Queue::EMAIL_TYPE_TO)

この行は、顧客のメールアドレスを既存の_recipients配列に追加します。

 $emailQueue->addMessageToQueue();

Magentoはキューモデルをデータベースに保存しようとし、要求された受信者のキューに電子メールがすでに追加されているかどうかを確認します。

Mage_Core_Model_Resource_Email_Queue#wasEmailQueued

 public function wasEmailQueued(Mage_Core_Model_Email_Queue $queue)
{
    $readAdapter = $this->_getReadAdapter();
    $select = $readAdapter->select()
        ->from(
            array('recips' => $this->getTable('core/email_recipients')),
            array('recipient_email', 'recipient_name', 'email_type')
        )
        ->join(array('queue' => $this->getMainTable()), 'queue.message_id = recips.message_id', array())
        ->where('queue.entity_id =? ', $queue->getEntityId())
        ->where('queue.entity_type =? ', $queue->getEntityType())
        ->where('queue.event_type =? ', $queue->getEventType())
        ->where('queue.message_body_hash =? ', md5($queue->getMessageBody()));

    $existingRecipients = $readAdapter->fetchAll($select);
    if ($existingRecipients) {
        ...
           $queue->clearRecipients();
            foreach ($diff as $recipient) {
                list($email, $name, $type) = $recipient;
                $queue->addRecipients($email, $name, $type);
            }
        ...
    }

    return false;
}

同じデータ(entity_id、entity_type、event_type、およびmessage_body_hash)を持つcore_email_queueのキューエントリが見つかった場合、受信者をクリアするメソッドが呼び出されます。それを理解するのに少し時間がかかりました。


1

まだこの問題に苦しんでいるすべての人のために、私は@solarissmokeが公開したのと同じ問題を経験しています。

これを修正するための非常に単純なカスタムモジュールを作成しました。これは、「個別の電子メール」のコピー方法でも期待どおりに機能します。あなたはそれをチェックしてここで複製することができます:https//github.com/UQPPA/FixSeparateCopyMethod

問題は、保存されているMage_Core_Model_Email_Queueにあります(受信者データを保存するときがあります。@ Mage_Core_Model_Email_Queue :: _ afterSaveメソッドを参照してください)。異なる保存を介して受信者をクリアせずに、新しい受信者を追加すると、現在の受信者だけでなく、古いものも。



0

私たちのケースでは、cronから注文を作成しています。これは、すでにapiを使用して作成された引用符があり、cronを実行してそれらの引用符を順序に変換することを意味します。ただし、4/10メールは重複しています。理由は何ですか?すべての設定を確認しました。ao_schedulerも使用しており、電子メールを送信します。毎分実行されるcronが実行されているのはこれが原因ですか?つまり、同時に複数のプロセスが実行されている可能性がありますか?

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