Hello,
I want to know how I can attach a custom file (PDF, JPG, PNG etc) in Invoice mail.
Which event, di or plugin to use?
P.S: I don't need an extension.
Hello Nixondsz879
After research, I have found the way we can attach a dynamic image and PDF to order email. Kindly follow below steps to attach images to order email.
Step 1:
<preference for="Magento\Framework\Mail\Template\TransportBuilder" type="vendor\moduleName\Model\Mail\MailTransportBuilder"></preference> <preference for="Magento\Sales\Model\Order\Email\SenderBuilder" type="vendor\moduleName\Model\Mail\SenderBuilder"/> <preference for="Magento\Sales\Model\Order\Email\Sender\OrderSender" type="vendor\moduleName\Model\Mail\Sender\OrderSender"/> <preference for="Magento\Sales\Model\Order\Email\Container\Template" type="vendor\moduleName\Model\Mail\Container\Template"/>
Step 2:
<?php namespace vendor\moduleName\Model\Mail; class MailTransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder { public function addPdfAttachment($fileContent, $filename) { if ($fileContent) { $this->message->createAttachment( $fileContent, 'application/pdf', \Zend_Mime::DISPOSITION_ATTACHMENT, \Zend_Mime::ENCODING_BASE64, $filename ); return $this; } } public function addImageAttachment($fileContent, $filename) { if ($fileContent) { $this->message->createAttachment( $fileContent, \Zend_Mime::TYPE_OCTETSTREAM, \Zend_Mime::DISPOSITION_ATTACHMENT, \Zend_Mime::ENCODING_BASE64, $filename ); return $this; } } }
Step 3:
<?php /** * @author Kristof Ringleff * @package Fooman_EmailAttachments * @copyright Copyright (c) 2015 Fooman Limited (http://www.fooman.co.nz) * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace vendor\moduleName\Model\Mail; use Magento\Framework\Mail\Template\TransportBuilder; use Magento\Sales\Model\Order\Email\Container\IdentityInterface; use Magento\Sales\Model\Order\Email\Container\Template; class SenderBuilder extends \Magento\Sales\Model\Order\Email\SenderBuilder { /** * @var Template */ protected $templateContainer; /** * @var IdentityInterface */ protected $identityContainer; /** * @var TransportBuilder */ protected $transportBuilder; /** * @param Template $templateContainer * @param IdentityInterface $identityContainer * @param TransportBuilder $transportBuilder */ public function __construct( Template $templateContainer, IdentityInterface $identityContainer, TransportBuilder $transportBuilder ) { $this->templateContainer = $templateContainer; $this->identityContainer = $identityContainer; $this->transportBuilder = $transportBuilder; } /** * Prepare and send email message * * @return void */ public function send() { $ImageList = $this->templateContainer->getImageList(); $PdfList = $this->templateContainer->getPdfList(); if(is_array($ImageList)){ foreach ($ImageList as $key => $data) { $this->transportBuilder->addImageAttachment(file_get_contents($data),$data); } } if(is_array($PdfList)){ foreach ($PdfList as $key => $data) { $this->transportBuilder->addPdfAttachment(file_get_contents($data),$data); } } parent::send(); } }
Step 4:
<?php /** * @author Kristof Ringleff * @package Fooman_EmailAttachments * @copyright Copyright (c) 2015 Fooman Limited (http://www.fooman.co.nz) * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace vendor\moduleName\Model\Mail\Sender; class OrderSender extends \Magento\Sales\Model\Order\Email\Sender\OrderSender { /** * @var \Fooman\EmailAttachments\Model\AttachmentContainerInterface */ protected $templateContainer; protected $_designerhelper; public function __construct( \Magento\Sales\Model\Order\Email\Container\Template $templateContainer, \Magento\Sales\Model\Order\Email\Container\OrderIdentity $identityContainer, \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory, \Psr\Log\LoggerInterface $logger, \Magento\Sales\Model\Order\Address\Renderer $addressRenderer, \Magento\Payment\Helper\Data $paymentHelper, \Magento\Sales\Model\ResourceModel\Order $orderResource, \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig, \Magento\Framework\Event\ManagerInterface $eventManager ) { $this->templateContainer = $templateContainer; parent::__construct( $this->templateContainer, $identityContainer, $senderBuilderFactory, $logger, $addressRenderer, $paymentHelper, $orderResource, $globalConfig, $eventManager ); /* $this->attachmentContainer = $attachmentContainer;*/ } public function send(\Magento\Sales\Model\Order $order, $forceSyncMode = false) { $items = $order->getAllVisibleItems(); $IncrementId = $order->getIncrementId(); $imageData = array(); $pdfData = array(); foreach ($items as $item) { if($item->getFilename() && $item->getDocumentId()) { $imageData[] = $item->getImagePath(); $pdfData[] = $item->getPdfPath(); } } if(count($pdfData) > 0){ $this->templateContainer->setPdfList($pdfData); } if(count($imageData) > 0){ $this->templateContainer->setImageList($imageData); } return parent::send($order, $forceSyncMode); } }
Step 5
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace vendor\moduleName\Model\Mail\Container; class Template extends \Magento\Sales\Model\Order\Email\Container\Template { /** * @var array */ protected $pdfAttach; /** * @var array */ protected $imageAttach; public function setPdfList(array $pdfList) { $this->pdfAttach = $pdfList; } public function getPdfList() { return $this->pdfAttach; } public function setImageList(array $imageList) { $this->imageAttach = $imageList; } public function getImageList() { return $this->imageAttach; } }
if work then marks as solution.