Xác nhận đơn hàng Magento được gửi đến tất cả khách hàng


8

Tôi thấy một hành vi kỳ lạ ở một trong các cửa hàng của chúng tôi: khi đơn hàng được đặt, email xác nhận được gửi trong CC tới tất cả các khách hàng đã đăng ký có đơn đặt hàng ở trạng thái "xử lý". Nó xảy ra độc lập với phương thức thanh toán (chuyển khoản ngân hàng và thẻ tín dụng) và phương thức vận chuyển (chỉ có tiêu chuẩn phẳng magento có sẵn).

Thiết lập cửa hàng khá cơ bản với một lần xem trang web / cửa hàng / cửa hàng. Tiện ích mở rộng đã cài đặt bao gồm không có gì liên quan đến đơn hàng hoặc thanh toán ngoại trừ tiện ích mở rộng của nhà cung cấp dịch vụ thanh toán của thẻ tín dụng.


Cảm ơn mã simonthesorcerer. Tôi có cùng một vấn đề. Tất cả các email trong Magento 1.9.1 đang được gửi cho tất cả khách hàng với các đơn đặt hàng mở (đang xử lý hoặc đang chờ xử lý). Tôi chưa tìm thấy giải pháp dựa trên sự kiện hoặc bất kỳ giải pháp nào cho vấn đề đó. Tôi đã thử giải pháp của bạn nhưng nó không hoạt động. Trong app / code / local /, tôi không có bất kỳ thư mục / tệp nào sau đây: Namespace / EmailQueueFix / etc / config.xml Namespace / EmailQueueFix / Model / Resource / Email / Queue.php Vì vậy, tôi đã tạo các thư mục và tệp và sao chép mã bạn đã viết. Nó đã không giải quyết vấn đề mặc dù. Bạn đã tạo các thư mục / tệp trên hay là m
JK9

HI, mã là một phần mở rộng, do đó, chính xác là bạn phải tạo các thư mục / tệp theo cách thủ công. Mã này làm gì: mỗi khi magento-cronjob xóa tất cả các tin nhắn đã gửi khỏi bảng cơ sở dữ liệu core_email_queue, nó cũng xóa tất cả người nhận các tin nhắn này. Vì vậy, về cơ bản, nó không hoạt động với bạn vì tác vụ cronjob này phải chạy ít nhất một lần trước khi nó có hiệu lực.
simonthesorcerer

Câu trả lời:


7

Chú ý!

Mã này làm gì: mỗi khi magento-cronjob xóa tất cả các tin nhắn đã gửi khỏi bảng cơ sở dữ liệu core_email_queue, nó cũng xóa tất cả người nhận các tin nhắn này. Vì vậy, về cơ bản, nó không hoạt động cho bạn cho đến khi tác vụ cronjob này chạy ít nhất một lần.

Giải pháp

Tôi đã tìm thấy câu trả lời nhờ một câu hỏi khác ở đây: bảng core_email_queue_reciprons không được làm trống bởi cronjob. Phương thức Mage_Core_Model_Email_Queue::cleanQueue()gọi Mage_Core_Model_Resource_Email_Queue::removeSentMessages(), khá đơn giản:

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

Dù sao, phương pháp này không loại bỏ người nhận cũ. Do đó, ngay khi một tin nhắn mới có message_id n được xếp hàng, tất cả những người nhận cũ có message_id n cũng sẽ nhận được email mới. Điều tôi không hiểu là: tại sao nhóm nòng cốt không nhìn thấy điều này và tại sao điều này không dẫn đến nhiều vấn đề hơn?

Tôi đã viết một mô-đun nhỏ để sửa lỗi này. Nó sử dụng một ghi đè lớp cho Mage_Core_Model_Resource_Email_Queue, vì vậy nếu bất cứ ai có thể đề xuất một giải pháp tốt hơn (dựa trên sự kiện?), Tôi sẽ rất vui.

ứng dụng / mã / cục bộ / 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>

ứng dụng / mã / cục bộ / Không gian tên / 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;
    }

}

ứng dụng / etc / mô-đun / 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

Tôi đã đăng một bản sửa lỗi khác không yêu cầu cài đặt một mô-đun mới và có lẽ sẽ sạch hơn một chút.

Nó chỉ sử dụng một ràng buộc khóa ngoại trên bảng core_email_queue_reciprons để xóa các bản ghi Người nhận trên tầng.

Bằng cách sử dụng khóa ngoại mới này, sẽ không còn bản ghi mồ côi nào trên bảng core_email_queue_reciprons khi làm sạch bảng core_email_queue , do đó, không có tin nhắn trùng lặp nào sẽ được gửi đến người nhận sai.

Bạn có thể tìm thấy giải pháp chi tiết trên bài đăng này: https://magento.stackexchange.com/a/87299/23057


IMO đây là một giải pháp sạch hơn và mặc định phải có khóa ngoại.
micwallace

1

Đây là một vấn đề của các chỉ mục trong cơ sở dữ liệu. Bạn có thể sửa chữa nó với công cụ sửa chữa cơ sở dữ liệu Magento .

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

Vấn đề gây cho tôi rất nhiều thất vọng. Trong trường hợp của tôi, nó được bắt nguồn từ phiên bản nâng cấp. Đó là một thực hành tốt mỗi khi bạn thực hiện nâng cấp phiên bản để cài đặt sạch trong thư mục khác và trong cơ sở dữ liệu tham chiếu trống mới, sau đó sử dụng công cụ để so sánh rằng cấu trúc và chỉ mục trong cơ sở dữ liệu của bạn được khai báo như trong phần trống mới cơ sở dữ liệu tham khảo. Cấu trúc này là những gì phiên bản mới cần! Xin lưu ý rằng vấn đề không phải là chỉ mục xấu và không thể giải quyết bằng cách lập chỉ mục lại. Nhiều hơn là một vấn đề thiếu chỉ số như tôi thấy nó. Luôn luôn sao lưu cơ sở dữ liệu trước khi chạy công cụ!Thật đáng tiếc rằng ngay cả khi bạn cài đặt lại Magento, xác minh chỉ mục và cấu trúc cơ sở dữ liệu không được cung cấp dưới dạng tùy chọn và bạn phải tuân theo quy trình trên. (trong trường hợp của tôi là nâng cấp từ phiên bản 1.8 lên 1.9).

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.