I have disabled Order Confirmation Email from backend because I want to send Order Email when User redirect to Success.phtml after order successfully placed.
I have created Plugins for it
di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Checkout\Block\Onepage\Success" type="<vendor_name>\Checkout\Block\Onepage\Success"/>
<type name="Magento\Sales\Model\Order\Email\Sender">
<plugin name="sale_order_custom_email_send" type="<vendor_name>\Checkout\Model\Plugin\Sender" sortOrder="1" />
</type>
<type name="Magento\Sales\Model\Order\Email\Sender\OrderSender">
<plugin name="sale_order_sender_custom_email" type="<vendor_name>\Checkout\Model\Plugin\OrderSender" sortOrder="1" />
</type>
</config>
Created Around Plugin: OrderSender.php
<?php
namespace <vendor_name>\Checkout\Model\Plugin;
use Magento\Sales\Model\Order;
class OrderSender
{
/**
* Order success action.
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function aroundSend(\Magento\Sales\Model\Order\Email\Sender\OrderSender $subject, \Closure $proceed, Order $order, $forceSyncMode = false, $isCustom = false)
{
$order->setSendEmail(true);
if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
if ($this->checkAndSend($order, $isCustom)) {
$order->setEmailSent(true);
$this->orderResource->saveAttribute($order, ['send_email', 'email_sent']);
return true;
}
}
$this->orderResource->saveAttribute($order, 'send_email');
return false;
}
}
I have passed $isCustom
parameter in checkAndSend()
method so It can check my custom condition.
Second Plugin : Sender.php
<?php
namespace <vendor_name>\Checkout\Model\Plugin;
class Sender
{
/**
* Order success action.
*
* @return \Magento\Framework\Controller\ResultInterface
*/
protected function aroundCheckAndSend(\Magento\Sales\Model\Order\Email\Sender $subject, \Closure $proceed, Order $order, $isCustom = false)
{
$this->identityContainer->setStore($order->getStore());
if (!$this->identityContainer->isEnabled() && $isCustom = false) {
return false;
}
$this->prepareTemplate($order);
/** @var SenderBuilder $sender */
$sender = $this->getSender();
try {
$sender->send();
$sender->sendCopyTo();
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
return true;
}
}
If $isCustom
is true
then even if Order Confirmation is Disabled from backend It should send Order Confirmation Email to customer.
Don't Know where am I wrong but not getting any email. May be We can not create a plugin for Absract class's Protected method but any other solution to change condition in checkAndSend()
.
Any help would be appreciated.