Новый заказ отправляется дважды


25

Я использую Magento 1.9.1 и при создании нового заказа, будь то от внешнего интерфейса или от администратора, система отправляет 2 электронных письма - оба одинаковые!

Я посмотрел в сети и обнаружил ошибку, которая была старой, и я не смог найти код, упомянутый для комментирования; похоже, это было связано с заказами Paypal, а это не так.

Я отключил ВСЕ расширения и попробовал, но у меня все еще была та же проблема, поэтому я уверен, что это не проблема с расширениями.


1
Вы решили эту проблему? Время от времени я получал одно и то же странное подтверждение двойного заказа, а также использовал bcc для подтверждающих писем. Не знаю, получит ли клиент также две почты, но я не надеюсь на это.
Фокс

Кому адресовано электронное письмо? Вы проверяете с одним из ваших адресов электронной почты администратора?
SR_Magento

Я получаю ту же проблему (пользователь получает два электронных письма после размещения нового заказа). Я не уверен в приведенном ниже ответе, и обе мои таблицы «core_email_queue» и «core_email_queue_recipients» пусты, поэтому я думаю, что это не мой случай. Пожалуйста помоги мне с этим.
Аби Шарма

Аби Шарма, у меня та же проблема, но я получаю дубликаты писем ... ты решил проблему? пожалуйста, дайте мне знать
Лиор Лория

Ответы:


48

Эта проблема должна быть связана с новой системой Magento Email Queue, которая оставляет бесхозные записи в таблице получателей. Если это ваша проблема, я отправлю вам исправление.

Новая система Magento Email Queue управляет этими двумя таблицами: core_email_queue и core_email_queue_recipients . Первый обрабатывает сообщения электронной почты, а второй - Получатели этих сообщений.

Таблица core_email_queue очищается при отправке электронных писем в почтовой очереди Magento. Эта очистка выполняется заданием cron с именем core_email_queue_clean_up , которое определено в файле конфигурации app / code / core / Mage / Core / etc / config.xm l. Код , который выполняет очистку , определенные на removeSentMessages функционировать в Mage_Core_Model_Resource_Email_Queue класса:

/**
 * Remove already sent messages
 *
 * @return Mage_Core_Model_Resource_Email_Queue
 */
public function removeSentMessages()
{
    $this->_getWriteAdapter()->delete($this->getMainTable(), 'processed_at IS NOT NULL');
    return $this;
}

Приведенный выше код выполняется один раз в день задачей cron.

Но бывает так, что таблица core_email_queue_recipients (та, которая содержит получателей электронной почты и связана с таблицей core_email_queue полем message_id ), не очищается вместе с таблицей core_email_queue (которая содержит сообщения электронной почты), оставляя записи-сироты внутри эта таблица получателей, когда таблица сообщений очищается.

Описанная здесь проблема возникает, когда таблица core_email_queue (сообщения) сбрасывается, и поле message_id автоинкремента в этой таблице повторно устанавливается на 1.

Поскольку таблица core_email_queue_recipients (Recipients) не была соответственно очищена, при добавлении новых электронных писем в очередь электронной почты Magento новые записи создаются в таблице core_email_queuemessage_id, начинающимся снова с 1), и в то же время создаются новые записи в таблице core_email_queue_recipients с теми же идентификаторами (начиная с 1).

Проблема в том, что эти идентификаторы могут уже существовать в таблице получателей в виде записей сирот (из-за предыдущих сообщений электронной почты). Эти новые идентификаторы сообщений затем повторяются в таблице core_email_queue_recipients . В конце разные сообщения электронной почты связываются с соответствующими получателями с помощью message_id , но они также ошибочно связываются с предыдущими получателями, которым был присвоен тот же message_id из предыдущих писем.

Таким образом, при поиске получателей для отправки данного сообщения, помимо соответствующего получателя, могут возникнуть другие неправильные получатели.

К счастью, решение этой проблемы легко выполнить.

Все, что нужно, - это очистить все повторяющиеся идентификаторы сообщений в таблице core_email_queue_recipients и убедиться, что при удалении сообщения из таблицы core_email_queue одновременно соответствующие получатели удаляются в таблице core_email_queue_recipients .

Лучший способ добиться этого - создать внешний ключ, который связывает эти записи и удаляет их каскадно (но вам необходимо выполнить некоторую очистку, прежде чем вы сможете это сделать).

Это процедура для устранения проблемы:

1) Выполните следующие два запроса SQL, чтобы очистить таблицу core_email_queue_recipients от потерянных записей и идентификаторов повторяющихся сообщений:

DELETE FROM core_email_queue_recipients WHERE message_id NOT IN (SELECT message_id FROM core_email_queue);
DELETE FROM core_email_queue_recipients WHERE recipient_id < (SELECT recipient_id FROM (SELECT recipient_id FROM core_email_queue_recipients ORDER BY message_id ASC, recipient_id DESC LIMIT 1) AS r);

Первый запрос удаляет потерянные записи, а второй удаляет старые записи, которые больше не действительны.

2) Создайте внешний ключ в таблице core_email_queue_recipients, чтобы удалить записи получателей в каскаде. Запрос SQL для создания этого внешнего ключа:

ALTER TABLE core_email_queue_recipients ADD FOREIGN KEY(message_id) REFERENCES core_email_queue(message_id) ON DELETE CASCADE;

С помощью этого нового внешнего ключа, не бесхозных записи не будут оставлены на core_email_queue_recipients столе при чистке core_email_queue стола, и не дублированные сообщений в неправильные получатель будут отправлены в будущем.


2
Отличное исследование и предоставленное рабочее исправление Цезаря. Это серьезный контроль со стороны команды Magento, учитывая, что это потенциально отправит имя и адрес клиента другим клиентам. Кто-нибудь знает, рассматривался ли этот вопрос в (каком) патче / выпуске вообще с тех пор, как была обнаружена эта проблема?
zigojacko

По-прежнему сталкиваюсь с проблемой того, что одно и то же письмо электронной почты отправляется несколько раз на один и тот же адрес электронной почты после внедрения вышеуказанного решения.
aton1004

Я проверяю, что обе мои таблицы уже пусты, поэтому мне нужно выполнить эти два шага (запросы) ???
Аби Шарма

Любое , как я выполнил эти запросы , но никакой помощи .. по- прежнему получать электронную почту заказ дважды
Abi Sharma

5

У меня такая же проблема. Для каждого заказа я получал электронную почту клиентов и отдельную электронную почту на адрес моего магазина - оба в почтовый ящик моей учетной записи электронной почты магазина.

В Magento Admin: Система> Конфигурация> Электронная почта продаж> Заказ

Я установил адрес электронной почты «Метод копирования электронной почты для заказа» с «Отдельная электронная почта» на «Скрытая копия», и теперь он работает. Сейчас я получаю только одно электронное письмо за заказ.


3
Я уже использую метод Bcc, так что, к сожалению, для меня это не проблема :(
Кристофер Троуэр,

Я также уже использую этот параметр, но пользователь получает 2 электронных письма после размещения нового заказа.
Аби Шарма

1

У меня такая же проблема. В моем случае проблема была вызвана исходным кодом скрипта cron.sh.

Мой хостинг-провайдер использовал свои собственные версии скриптов cron.sh и cron.php для работы cron в Magento.

Когда я перешел от сценария cron.sh к сценарию cron.php для запуска задания Magento-Cron, электронное письмо с новым заказом было отправлено только один раз, моя проблема была решена.

Возможно, ваша проблема связана с кодом скрипта cron.sh или cron.php .


Привет, мы уже используем скрипт cron.php для работы cron в Magento, но я получаю письма дважды.
Аби Шарма
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.