Menu Close
    Searching for an experienced Magento 2 Development Company ?

    Magento2 Email From Header set twice Error in Custom Module Fixed

    In Magento2 Email process when you will try to send email in loop you will get this error From Header set twice in most of the cases.

    I have described here that how to solve this issue in our custom Magento2 Modules.

    1. Create a custom TransportBuilder Class used to send the email which extends the Default
    \Magento\Framework\Mail\Template\TransportBuilder Class.

    Ex: File: Webkul\CustomModule\Model\Mail\TransportBuilder.php

    <?php
    /**
     * Webkul Software.
     *
     * @category  Webkul
     * @package   Webkul_CustomModule
     * @author    Webkul
     * @copyright Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)
     * @license   https://store.webkul.com/license.html
     */
    
    namespace Webkul\CustomModule\Model\Mail;
    
    class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder
    {
         /**
         * Clears the sender from the mail
         *
         * @return Zend_Mail Provides fluent interface
         */
        public function clearFrom()
        {
            //$this->_from = null;
            $this->message->clearFrom('From');
            return $this;
        }
    
        public function clearSubject()
        {
            $this->message->clearSubject();
            return $this;
        }
    
        public function clearMessageId()
        {
            $this->message->clearMessageId();
            return $this;
        }
    
        public function clearBody()
        {
            $this->message->setParts([]);
            return $this;
        }
    
        public function clearRecipients()
        {
            $this->message->clearRecipients();
            return $this;
        }
    
        /**
         * Clear header from the message
         *
         * @param string $headerName
         * @return Zend_Mail Provides fluent inter
         */
        public function clearHeader($headerName)
        {
            if (isset($this->_headers[$headerName])){
                unset($this->_headers[$headerName]);
            }
            return $this;
        }
    }

    And now try to send Email. I have used the custom Helper Class you can paste this code wherever you need.

    <?php
    /**
     * Webkul Software.
     *
     * @category  Webkul
     * @package   Webkul_CustomModule
     * @author    Webkul
     * @copyright Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)
     * @license   https://store.webkul.com/license.html
     */
    
    namespace Webkul\CustomModule\Helper;
    
    use Magento\Customer\Model\Session;
    
    /**
     * Webkul Marketplace Helper Email.
     */
    class Data extends \Magento\Framework\App\Helper\AbstractHelper
    {
        const XML_PATH_EMAIL_CUSTOM_EMAIL = 'custom_config/email/custom_email_template';
    
        /**
         * @var \Magento\Framework\Translate\Inline\StateInterface
         */
        protected $_inlineTranslation;
    
        /**
         * @var \Magento\Framework\Mail\Template\TransportBuilder
         */
        protected $_transportBuilder;
    
        /**
         * @var \Magento\Store\Model\StoreManagerInterface
         */
        protected $_storeManager;
    
        /**
         * @param Magento\Framework\App\Helper\Context              $context
         * @param Magento\Framework\ObjectManagerInterface          $objectManager
         * @param Magento\Framework\Translate\Inline\StateInterface $inlineTranslation
         * @param Webkul\CustomModule\Model\Mail\TransportBuilder  $transportBuilder
         * @param Magento\Store\Model\StoreManagerInterface         $storeManager
         * @param Session                                           $customerSession
         */
        public function __construct(
            \Magento\Framework\App\Helper\Context $context,
            \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation,
            \Webkul\CustomModule\Model\Mail\TransportBuilder $transportBuilder,
            \Magento\Framework\ObjectManagerInterface $objectManager,
            \Magento\Store\Model\StoreManagerInterface $storeManager
        ) {
            parent::__construct($context);
            $this->_inlineTranslation = $inlineTranslation;
            $this->_transportBuilder = $transportBuilder;
            $this->_objectManager = $objectManager;
            $this->_storeManager = $storeManager;
        }
    
        /**
         * Return store configuration value.
         *
         * @param string $path
         * @param int    $storeId
         *
         * @return mixed
         */
        protected function getConfigValue($path, $storeId)
        {
            return $this->scopeConfig->getValue(
                $path,
                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
                $storeId
            );
        }
    
        /**
         * Return store.
         *
         * @return Store
         */
        public function getStore()
        {
            return $this->_storeManager->getStore();
        }
    
        /**
         * Return template id.
         *
         * @return mixed
         */
        public function getTemplateId($xmlPath)
        {
            return $this->getConfigValue($xmlPath, $this->getStore()->getStoreId());
        }
    
        public function sendEmail()
        {
            $template = $this->getTemplateId(self::XML_PATH_EMAIL_CUSTOM_EMAIL); //your email template Id
            //sending Email in Loop
            for ($i=0; $i < 5 ; $i++) { 
                $this->_inlineTranslation->suspend();
                $_transportBuilder = $this->_transportBuilder;
                // clear previous data first.
                $_transportBuilder->clearFrom();
                $_transportBuilder->clearSubject();
                $_transportBuilder->clearMessageId();
                $_transportBuilder->clearBody();
                $_transportBuilder->clearRecipients();
                $_transportBuilder->setTemplateIdentifier($template)
                    ->setTemplateOptions(
                        [
                            'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
                            'store' => $this->_storeManager->getStore()->getId(),
                        ]
                    )
                    ->setTemplateVars(['myname' => 'John Doe', 'country' => 'India'])
                    ->setFrom(['email' => '[email protected]', 'name' => 'John Doe'])
                    ->addTo('[email protected]', 'Sender');
                try {
                    $transport = $_transportBuilder->getTransport();
                    $transport->sendMessage();
                    
                    $this->_inlineTranslation->resume();
                } catch (\Exception $e) {
                   echo $e->getMessage();
                }
            }
        }
    }
    . . .
    Discuss on Helpdesk

    Leave a Comment

    Your email address will not be published. Required fields are marked*


    Be the first to comment.

    Back to Top