Kopien von Verkaufs-E-Mails werden mehrmals gesendet

7

Ich benutze Magento 1.9.1.0.

Im Backend habe ich vier verschiedene Empfänger eingerichtet, die jedes Mal, wenn ein Kunde eine Bestellung aufgibt, eine E-Mail mit Verkaufskopien erhalten. Das Problem ist, dass jeder Empfänger, den ich in das Backend eingefügt habe, mehrmals dieselbe Kopien-E-Mail erhält.

Hat jemand dieses Problem schon einmal erlebt?

gianis6
quelle
Verwenden Sie den Standard-Mailer ( $mailer = new Zend_Mail('utf-8'); $mailer->send();) oder verwenden Sie SMTP oder ein Modul eines Drittanbieters?
Tecjam
Und wie ist Ihr Cron konfiguriert? Wenn es in einem zu kurzen Abstand ausgeführt wird, kann es sein, dass mehrere Instanzen gleichzeitig ausgeführt werden.
Tecjam
Ich verwende den Standard-Mailer, kein SMTP- oder Drittanbieter-Modul. Ich verwende "aeo scheduler" und es ist so konfiguriert, dass core_email_queue_send_all jede Minute ausgeführt wird.
Gianis6
Ich habe versucht, die Planungszeit von core_email_queue_send_all auf sechs Minuten zu ändern, aber das Ergebnis ist immer noch dasselbe.
Gianis6
1
Ich kann keine Antwort geben, wollte aber bestätigen, dass das Problem aufgetreten ist. Der Kunde hat 1 E-Mail erhalten, die erste E-Mail in der Konfiguration hat 2, die zweite 3 usw. Das Problem ist behoben, aber ich bin nicht sicher, was mein Kollege getan hat, um es zu beheben.
Peter O'Callaghan

Antworten:

4

TL; DR: Verwenden Sie die Option "Bcc" anstelle der Option "Separate E-Mail", um E-Mails zu bestellen, da letztere in Magento 1.9.1 ernsthaft beschädigt sind. Ihre Kopien-E-Mail-Adressen werden dem Kunden angezeigt.

Es ist etwas grundlegend gebrochen, wie Magento damit umgeht. Wenn Sie mehrere (durch Kommas getrennte) E-Mail-Adressen haben, die unter "E-Mail-Kopie der Bestellung senden an" angegeben sind und "E-Mail-Kopiermethode für Bestellung senden" auf "Separate E-Mail" eingestellt ist, erstellt Magento mehrere separate Nachrichten in der core_email_queueTabelle - eine für den Kunden und eine für den Kunden für jeden Kopierempfänger.

(Beispiel: Kopieren auf [email protected], [email protected])

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

Das ist in Ordnung - es wurden separate Nachrichten für jeden Empfänger erstellt.

Die tatsächlichen Empfänger werden jedoch in einer anderen Tabelle gespeichert core_email_queue_recipients. Hier liegt das Problem. Anstatt jeder Nachricht einen Empfänger zuzuweisen, geschieht Folgendes:

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

Es weist der ersten Nachricht 1 Empfänger zu, der zweiten 2, der dritten 3 Empfänger. Je mehr Empfänger Sie dem Feld Kopieren hinzugefügt haben, desto mehr E-Mails erhält die letzte E-Mail in dieser Liste.

Was hätte hinzugefügt werden sollen, core_email_queue_recipientsist Folgendes:

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

Schlimmer ist, dass die E-Mails nicht mehr "getrennt" sind, da die an den Kunden gesendete E-Mail im Feld "An" eine Liste aller anderen E-Mail-Adressen enthält (die separat und ohne Kenntnis des Kunden hätten gesendet werden müssen) ) - damit dem Kunden Ihre gesamte Kopierliste zur Verfügung stellen.

Um dieses Problem Fixierung erfordert zwingende und im wesentlichen die gebrochene Kopie Logik in Umschreiben Mage/Sales/Model/Order::queueNewOrderEmail()sowie Mage/Core/Model/Email/Queue, was zu tun ist nicht trivial.

Eine kurzfristige Lösung besteht einfach darin, die Kopiermethode von "Separate E-Mail" in "Bcc" zu ändern. Diese Option funktioniert wie erwartet und generiert nur eine E-Mail.

Solarissmoke
quelle
Verwenden Sie den gleichen Vorschlag auch für Magento 2.
Dmitry Dubovitsky
1

Magento vergleicht Warteschlangeneinträge aus der Datenbank und löscht Empfänger nur, wenn Ergebnisse gefunden wurden.

In meinem Fall war message_body_hash anders, da Magento eine globale Variable ($ taxIter) in tax / order / tax.phtml verwendet , die bei jedem Aufruf dieser Vorlage erhöht wird.

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

Versuchen Sie einfach, diese Zeile zu Ihrer local.xml hinzuzufügen

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

Kopieren Sie die Vorlage "tax / order / tax.phtml" nach "tax / order / tax-email.phtml" und ändern Sie:

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

zu:

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

Versuchen Sie andernfalls, den Prozess zu verstehen, den ich zu erklären versucht habe, und finden Sie hoffentlich den Unterschied.

Magento stellt zwei Nachrichten in "core_email_queue" in die Warteschlange, wenn Ihre Konfiguration für "Send Order Email Copy Method" auf "Separate Email" eingestellt ist. Die erste Mail ist für bestimmte Empfänger im Backend. Die zweite Mail erhält Ihren Kunden.

Die Nachrichten werden in Mage_Core_Model_Email_Template # send () gespeichert .

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;
    }

    ...
}

Diese Methode wird zweimal ausgelöst und fährt mit demselben Warteschlangenmodell (Mage_Core_Model_Email_Queue $ emailQueue) fort, einschließlich der Variablen ($ _recipients) des ersten Laufs.

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

In dieser Zeile wird die E-Mail-Adresse des Kunden zum vorhandenen Array _recipients hinzugefügt.

 $emailQueue->addMessageToQueue();

Magento versucht, das Warteschlangenmodell in der Datenbank zu speichern und prüft, ob E-Mail bereits zur Warteschlange für angeforderte Empfänger hinzugefügt wurde.

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;
}

Wenn ein Warteschlangeneintrag in core_email_queue mit denselben Daten (entity_id, entity_type, event_type und message_body_hash) gefunden wird, wird eine Methode zum Löschen von Empfängern aufgerufen. Ich brauchte einige Zeit, um es herauszufinden.

DHebestreit
quelle
1

Für alle, die immer noch unter diesem Problem leiden, habe ich die gleichen Probleme damit gehabt, die @solarissmoke aufgedeckt hat.

Ich habe ein sehr einfaches benutzerdefiniertes Modul geschrieben, um dieses Problem zu beheben. Es funktioniert wie erwartet, auch mit der Kopiermethode "Separate E-Mail". Sie können es hier überprüfen und klonen: https://github.com/UQPPA/FixSeparateCopyMethod

Das Problem besteht darin, dass Mage_Core_Model_Email_Queue mehrmals gespeichert wird (wenn Empfängerdaten gespeichert werden, @see \ Mage_Core_Model_Email_Queue :: _ afterSave-Methode), ohne die Empfänger durch verschiedene Speicherungen zu löschen. Wenn also ein neuer Empfänger hinzugefügt wird, werden nicht nur aktuelle Empfänger gespeichert, sondern auch auch alte.

Adrián Martínez Guantes
quelle
0

Dieses Problem kann mit dem neuen Magento Email Queue-System zusammenhängen, das verwaiste Datensätze in der Empfängertabelle hinterlässt.

Wenn dies Ihr Problem ist, habe ich einen Fix (durch Hinzufügen eines Fremdschlüssels) für diesen Beitrag gesendet: https://magento.stackexchange.com/a/87299/23057

César Revert-Gomar
quelle
0

In unserem Fall erstellen wir Ordnung aus cron. Dies bedeutet, dass wir bereits Anführungszeichen mit API erstellt haben und cron ausgeführt haben, um diese Anführungszeichen in Reihenfolge umzuwandeln. 4/10 E-Mails sind jedoch doppelt vorhanden. Was kann der Grund sein? Ich habe die gesamte Konfiguration überprüft. Wir verwenden auch den ao_scheduler und senden eine E-Mail. Cron wird jede Minute ausgeführt. Ist dies der Schuldige? Ich meine, kann es möglich sein, dass mehrere Prozesse gleichzeitig ausgeführt werden?

Raviraj
quelle