I managed to fixed this issue. Actually the creditmemo email was sending using this file Magento\Sales\Model\Order\Email\Sender\CreditmemoSender.php
not by
Magento\Sales\Model\Order\Creditmemo\Sender\EmailSender.php.
If i tried to set the template var using event observer, its not working fine. So i decided to override the Magento\Sales\Model\Order\Email\Sender\CreditmemoSender.php.
For this i use a custom module. Added the preference in di.xml file.
<?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\Sales\Model\Order\Email\Sender\CreditmemoSender" type="Vendor\Module\Model\Rewrite\Order\Email\Sender\CreditmemoSender" /> </config>
and create the CreditmemoSender.php file under Vendor\Module\Model\Rewrite\Order\Email\Sender\ path.
<?php namespace Vendor\Module\Model\Rewrite\Order\Email\Sender; use Magento\Payment\Helper\Data as PaymentHelper; use Magento\Sales\Model\Order; use Magento\Sales\Model\Order\Creditmemo; use Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity; use Magento\Sales\Model\Order\Email\Container\Template; use Magento\Sales\Model\Order\Email\Sender; use Magento\Sales\Model\ResourceModel\Order\Creditmemo as CreditmemoResource; use Magento\Sales\Model\Order\Address\Renderer; use Magento\Framework\Event\ManagerInterface; use Magento\Framework\DataObject; class CreditmemoSender extends \Magento\Sales\Model\Order\Email\Sender\CreditmemoSender{ public function send(Creditmemo $creditmemo, $forceSyncMode = false) { $creditmemo->setSendEmail($this->identityContainer->isEnabled()); if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) { $order = $creditmemo->getOrder(); $orderId = $order->getEntityId(); $orderStatus = $order->getState(); $payment = $order->getPayment(); if($payment->getMethod() == "cashondelivery" && !$order->hasShipments()){ $showRefundAmmount = ""; }elseif($payment->getMethod() != "cashondelivery"){ $showRefundAmmount = "1"; }elseif($payment->getMethod() == "cashondelivery" && $order->hasShipments()){ $showRefundAmmount = "1"; } $transport['showrefund'] = $showRefundAmmount; $this->identityContainer->setStore($order->getStore()); $transport = [ 'order' => $order, 'order_id' => $order->getId(), 'creditmemo' => $creditmemo, 'creditmemo_id' => $creditmemo->getId(), 'comment' => $creditmemo->getCustomerNoteNotify() ? $creditmemo->getCustomerNote() : '', 'billing' => $order->getBillingAddress(), 'payment_html' => $this->getPaymentHtml($order), 'store' => $order->getStore(), 'formattedShippingAddress' => $this->getFormattedShippingAddress($order), 'formattedBillingAddress' => $this->getFormattedBillingAddress($order), 'order_data' => [ 'customer_name' => $order->getCustomerName(), 'is_not_virtual' => $order->getIsNotVirtual(), 'email_customer_note' => $order->getEmailCustomerNote(), 'frontend_status_label' => $order->getFrontendStatusLabel() ], 'showrefund' => $showRefundAmmount ]; $transportObject = new DataObject($transport); /** * Event argument `transport` is @deprecated. Use `transportObject` instead. */ $this->eventManager->dispatch( 'email_creditmemo_set_template_vars_before', ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject] ); $this->templateContainer->setTemplateVars($transportObject->getData()); if ($this->checkAndSend($order)) { $creditmemo->setEmailSent(true); $this->creditmemoResource->saveAttribute($creditmemo, ['send_email', 'email_sent']); return true; } } else { $creditmemo->setEmailSent(null); $this->creditmemoResource->saveAttribute($creditmemo, 'email_sent'); } $this->creditmemoResource->saveAttribute($creditmemo, 'send_email'); return false; } }