Почему в Magento 1.9 электронные письма с заказами отправляются через очередь, а электронные письма с накладными отправляются напрямую?

8

Почему в Magento 1.9 электронные письма с заказами отправляются через очередь, а электронные письма с накладными отправляются напрямую? Я проверил код для заказа и счета-фактуры, и order-sendNewOrderEmailиспользует очередь, пока invoice->sendEmail()полностью пропускает. Это означает, что электронное письмо с заказом будет отправлено после электронного адреса счета-фактуры, а не до того, как заказ будет принят автоматически!

похлопывание
источник

Ответы:

11

Заказы по электронной почте отправляются с использованием очереди по разным причинам:

  • Избегайте замедления внешнего интерфейса при отправке электронной почты
  • Переслать при неудаче
  • Избегайте ошибок при оформлении заказа / после оформления заказа

Решение 1 (немедленно отправьте электронное письмо с заказом):

Если вы хотите немедленно отправить электронное письмо с заказом, вы можете переопределить Mage_Sales_Model_Order::queueNewOrderEmail()метод, используя следующие строки:

/** @var $emailQueue Mage_Core_Model_Email_Queue */
$emailQueue = Mage::getModel('core/email_queue');
$emailQueue->setEntityId($this->getId())
    ->setEntityType(self::ENTITY)
    ->setEventType(self::EMAIL_EVENT_NAME_NEW_ORDER)
    ->setIsForceCheck(!$forceMode);

$mailer->setQueue($emailQueue)->send();

чтобы:

    /** @var $emailQueue Mage_Core_Model_Email_Queue */
    $mailer->send();

Решение 2 (отправка счетов с использованием очереди):

Обратное решение - позволить счетам использовать очередь:

Вы должны отменить Mage_Sales_Model_Order_Invoice::sendEmailизменение:

// Set all required params and send emails
        $mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
        $mailer->setStoreId($storeId);
        $mailer->setTemplateId($templateId);
        $mailer->setTemplateParams(array(
                'order'        => $order,
                'invoice'      => $this,
                'comment'      => $comment,
                'billing'      => $order->getBillingAddress(),
                'payment_html' => $paymentBlockHtml
            )
        );
        $mailer->send();

Для того, чтобы:

// Set all required params and send emails
        $mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
        $mailer->setStoreId($storeId);
        $mailer->setTemplateId($templateId);
        $mailer->setTemplateParams(array(
                'order'        => $order,
                'invoice'      => $this,
                'comment'      => $comment,
                'billing'      => $order->getBillingAddress(),
                'payment_html' => $paymentBlockHtml
            )
        );

        $emailQueue = Mage::getModel('core/email_queue');
        $emailQueue->setEntityId($this->getId())
          ->setEntityType('order_invoice')
          ->setEventType('new_invoice');

        $mailer->setQueue($emailQueue)->send();
Phoenix128_RiccardoT
источник
Большое спасибо за предложение! Я фактически сделал то же самое, но наоборот. Вместо этого я добавил счет в очередь. Это сработало, но мне интересно, правильно ли это делать?
Пэт
1
Да, конечно. Я добавлю в свой пост для других пользователей.
Phoenix128_RiccardoT
1
Кажется, хорошее решение. Попробую
Jai
1
Я использовал решение 1, и оно работало от меня. Спасибо
Jai