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' => 'myemail@example.com', 'name' => 'John Doe'])
->addTo('sender@example.com', 'Sender');
try {
$transport = $_transportBuilder->getTransport();
$transport->sendMessage();
$this->_inlineTranslation->resume();
} catch (\Exception $e) {
echo $e->getMessage();
}
}
}
}