Электронное письмо с новым заказом отправляется дважды


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

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

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

Author: 7ochem, 2015-01-30

3 answers

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

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

Таблица core_email_queue очищается как электронные письма в Magento Отправляются очереди электронной почты. Эта очистка выполняется заданием вкладки cron с именем core_email_queue_clean_up, которое определено в файле конфигурации app/code/core/Mage/Core/etc/config.xml. Код, который выполняет очистку, определен в функции 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 (Получатели) не была соответствующим образом очищена, при добавлении новых сообщений электронной почты в очередь электронной почты Magento в таблице core_email_queue создаются новые записи (с идентификатором сообщения, начинающимся с 1), и в то же время новые записи создаются в core_email_queue_recipients{[ 8]} таблица с теми же идентификаторами (начинается снова с 1).

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

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

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

Все, что нужно, это очистить все повторяющиеся идентификаторы сообщений в таблице 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, и в будущем не будут отправляться дублированные сообщения неправильным получателям.

 48
Author: César Revert-Gomar, 2015-11-16 09:29:19

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

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

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

 6
Author: rob, 2015-02-14 17:15:13

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

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

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

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

 1
Author: DoubleCheck, 2017-01-11 07:38:46