bản sao email bán hàng được gửi nhiều lần


7

Tôi đang sử dụng Magento 1.9.1.0.

Trong phần phụ trợ, tôi thiết lập bốn người nhận khác nhau để nhận email bản sao bán hàng mỗi khi khách hàng đặt hàng. Vấn đề là mọi người nhận tôi chèn vào phụ trợ đều nhận được cùng một email sao chép nhiều lần.

Bất cứ ai đã trải qua vấn đề này trước đây?


Bạn có sử dụng trình gửi thư tiêu chuẩn ( $mailer = new Zend_Mail('utf-8'); $mailer->send();) hoặc bạn đang sử dụng SMTP hoặc qua mô-đun của bên thứ 3?
tecjam

Và cron của bạn được cấu hình như thế nào? Nếu nó chạy trong khoảng thời gian quá ngắn, có thể bạn có nhiều phiên bản chạy cùng một lúc.
tecjam

Tôi đang sử dụng trình gửi thư tiêu chuẩn, không có mô-đun SMTP hoặc bên thứ ba. Tôi đang sử dụng "lập lịch aeo" và nó được cấu hình để chạy core_email_queue_send_all mỗi phút.
gianis6

Tôi đã cố gắng thay đổi thời gian lập lịch của core_email_queue_send_all, đặt nó thành sáu phút nhưng kết quả vẫn như vậy.
gianis6

1
Tôi không thể cung cấp câu trả lời, nhưng muốn xác nhận gặp sự cố. Khách hàng nhận được 1 e-mail, e-mail đầu tiên trong cấu hình có 2, thứ hai có 3, v.v ... Vấn đề được giải quyết, nhưng tôi không chắc nếu đồng nghiệp của tôi làm gì để khắc phục.
Peter O'Callaghan

Câu trả lời:


4

TL; DR: sử dụng tùy chọn "Bcc" thay vì tùy chọn "Email riêng biệt" để sao chép email, vì cái sau bị hỏng nghiêm trọng trong Magento 1.9.1. Nó sẽ tiết lộ địa chỉ email sao chép của bạn cho khách hàng.

Có một cái gì đó bị phá vỡ cơ bản với cách Magento xử lý việc này. Khi bạn có nhiều địa chỉ email (được phân tách bằng dấu phẩy) được chỉ định trong "Gửi phương thức sao chép email đặt hàng đến" với "Phương thức sao chép email gửi đơn đặt hàng" được đặt thành "Email riêng biệt", Magento tạo nhiều thư riêng biệt trong core_email_queuebảng - một cho khách hàng và một cho khách hàng và một cho mỗi người nhận Sao chép.

(ví dụ: được đặt để sao chép vào 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

Điều đó là tốt - nó đã tạo ra các thông điệp riêng biệt cho mỗi người nhận.

Tuy nhiên, người nhận thực tế được lưu trữ trong một bảng khác - core_email_queue_recipients. Đây là vấn đề. Thay vì chỉ định một người nhận cho mỗi tin nhắn, đây là điều xảy ra:

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

nó chỉ định 1 người nhận cho tin nhắn đầu tiên, 2 đến thứ hai, 3 đến thứ ba, v.v. Càng nhiều người nhận bạn đã thêm vào trường Sao chép, càng nhiều email thì email cuối cùng trong danh sách đó sẽ nhận được.

Những gì nên được thêm vào core_email_queue_recipientslà:

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

Điều tồi tệ hơn là các email không còn "riêng biệt" vì email được gửi cho khách hàng sẽ được đưa vào trường "Tới" một danh sách tất cả các địa chỉ email khác (cần được gửi riêng và không có kiến ​​thức về khách hàng ) - do đó hiển thị cho khách hàng toàn bộ danh sách bản sao của bạn.

Khắc phục sự cố này đòi hỏi phải ghi đè và viết lại đáng kể logic sao chép bị hỏng Mage/Sales/Model/Order::queueNewOrderEmail()cũng như Mage/Core/Model/Email/Queue, điều này không tầm thường để làm.

Một sửa chữa ngắn hạn chỉ đơn giản là thay đổi phương thức sao chép từ "Email riêng biệt" thành "Bcc" - tùy chọn này hoạt động như mong đợi và sẽ chỉ tạo một email.


Sử dụng cùng một gợi ý cho Magento 2 quá.
Dmitry Dubovitsky

1

Magento so sánh các mục hàng đợi từ cơ sở dữ liệu và chỉ xóa người nhận nếu tìm thấy kết quả.

Trong trường hợp của tôi, message_body_hash khác nhau vì Magento sử dụng biến toàn cục ($ taxIter) trong tax / order / tax.phtml , tăng lên mỗi khi mẫu này được gọi.

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

Chỉ cần cố gắng thêm dòng này vào tệp localDB của bạn

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

Và sao chép mẫu "tax / order / tax.phtml" sang "tax / order / tax-email.phtml" và thay đổi:

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

đến:

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

Nếu không, hãy cố gắng hiểu quá trình tôi đã cố gắng giải thích và hy vọng tìm thấy sự khác biệt.

Magento đang xếp hàng hai tin nhắn trong "core_email_queue" nếu cấu hình của bạn cho "Phương thức sao chép email gửi đơn đặt hàng" được đặt thành "Email riêng biệt". Thư đầu tiên dành cho người nhận được chỉ định trong phụ trợ. Thư thứ hai sẽ nhận được khách hàng của bạn.

Các tin nhắn sẽ được lưu trong 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;
    }

    ...
}

Phương thức này được kích hoạt hai lần và tiến hành cùng một mô hình hàng đợi (Mage_Core_Model_Email_Queue $ emailQueue) bao gồm các biến ($ _reciprons) của lần chạy đầu tiên.

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

Dòng này sẽ thêm địa chỉ email của khách hàng vào mảng _reciprons hiện có.

 $emailQueue->addMessageToQueue();

Magento đang cố lưu mô hình hàng đợi vào cơ sở dữ liệu và kiểm tra xem email đã được thêm vào hàng đợi cho người nhận được yêu cầu chưa.

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

Nếu mục nhập hàng đợi trong core_email_queue có cùng dữ liệu (entity_id, entity_type, event_type và message_body_hash) được tìm thấy, một phương thức để xóa người nhận sẽ được gọi. Tôi phải mất một thời gian để tìm ra nó.


1

Đối với tất cả mọi người vẫn còn gặp phải vấn đề này, tôi đã trải qua những vấn đề tương tự với vấn đề này như @solarissmoke đã phơi bày.

Tôi đã viết một mô-đun tùy chỉnh rất đơn giản để sửa lỗi này, nó hoạt động với tôi như mong đợi, ngay cả với phương pháp sao chép "Email riêng biệt". Bạn có thể kiểm tra và sao chép nó tại đây: https://github.com/UQPPA/FixSeparateCopyMethod

Sự cố nằm trong Mage_Core_Model_Email_Queue đang được lưu (có khi nó lưu dữ liệu người nhận, @see \ Mage_Core_Model_Email_Queue :: _ afterSave phương thức) nhiều lần mà không xóa người nhận thông qua các lần lưu khác nhau, vì vậy khi nó thêm người nhận mới, nó không chỉ xóa người nhận mới. cũng cũ.


0

Vấn đề này có thể liên quan đến hệ thống Hàng đợi Email Magento mới, để lại các bản ghi mồ côi trên bảng Người nhận.

Nếu đây là vấn đề của bạn, tôi đã gửi một bản sửa lỗi (bằng cách thêm khóa ngoại) vào bài đăng này: https://magento.stackexchange.com/a/87299/23057


0

Trong trường hợp của chúng tôi, chúng tôi đang tạo ra thứ tự từ cron. Điều đó có nghĩa là chúng tôi đã có các trích dẫn được tạo bằng api và chúng tôi đã chạy cron để chuyển đổi các trích dẫn đó theo thứ tự. Tuy nhiên 4/10 email bị trùng lặp. Nguyên nhân có thể là gì ? Tôi đã kiểm tra tất cả các cấu hình Chúng tôi cũng đang sử dụng ao_scheduler và gửi cron email đang chạy trên mỗi phút, đây có phải là thủ phạm? Tôi có nghĩa là nó có thể có thể nhiều quá trình chạy cùng một lúc?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.