Sometimes, we need to attach a file with the order invoice email, so here are the steps to achieve the same.
first of all create TransportBuilder class in app/code/Vendor/Module /Mail/Template/ TransportBuilder.php
<?php
namespace Vendor\Module\Mail\Template;
class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder
{
/**
* addAttachment
*
* @param mixed $body
* @param string $filename
* @param mixed $mimeType
* @param mixed $disposition
* @param mixed $encoding
* @return object
*/
public function addAttachment(
$body,
$filename = null,
$mimeType = \Zend_Mime::TYPE_OCTETSTREAM,
$disposition = \Zend_Mime::DISPOSITION_ATTACHMENT,
$encoding = \Zend_Mime::ENCODING_BASE64
) {
$attachmentPart = new \Zend\Mime\Part();
$attachmentPart->setContent($body)
->setType($mimeType)
->setFileName($filename)
->setEncoding($encoding)
->setDisposition($disposition);
return $attachmentPart;
}
}
Now, create the SenderBuilder class to add attachment files which is extend to core class \Magento\Sales\Model \Order\Email\ SenderBuilder. You can add image/pdf/docx/calender etc. files with email.
Add the SenderBuilder file in app/code/Vendor/Module/Model/Sales/Order/Email/SenderBuilder.php.
<?php
namespace Vendor\Module\Model\Sales\Order\Email;
use Magento\Framework\Mail\Template\TransportBuilder;
use Magento\Framework\Mail\Template\TransportBuilderByStore;
use Magento\Sales\Model\Order\Email\Container\IdentityInterface;
use Magento\Sales\Model\Order\Email\Container\Template;
/**
* Email sender builder for attachments
*/
class SenderBuilder extends \Magento\Sales\Model\Order\Email\SenderBuilder
{
/**
* @param Template $templateContainer
* @param IdentityInterface $identityContainer
* @param TransportBuilder $transportBuilder
* @param TransportBuilderByStore $transportBuilderByStore
* @param \Magento\Framework\Filesystem\Driver\File $reader
*/
public function __construct(
Template $templateContainer,
IdentityInterface $identityContainer,
TransportBuilder $transportBuilder,
TransportBuilderByStore $transportBuilderByStore = null,
\Vendor\Module\Helper\Data $helper,
\Magento\Framework\Filesystem\Driver\File $reader
) {
parent::__construct(
$templateContainer,
$identityContainer,
$transportBuilder
);
$this->helper = $helper;
$this->reader = $reader;
}
/**
* Prepare and send email message
*
* @return void
*/
public function send()
{
$this->configureEmailTemplate();
$this->transportBuilder->addTo(
$this->identityContainer->getCustomerEmail(),
$this->identityContainer->getCustomerName()
);
$copyTo = $this->identityContainer->getEmailCopyTo();
if (!empty($copyTo) && $this->identityContainer->getCopyMethod() == 'bcc') {
foreach ($copyTo as $email) {
$this->transportBuilder->addBcc($email);
}
}
/* to attach events in invoice email */
$templateVars = $this->templateContainer->getTemplateVars();
$transport = $this->transportBuilder->getTransport();
if (!empty($templateVars['order'])) {
$order = $templateVars['order'];
foreach ($order->getAllItems() as $item) {
$data = $this->helper->createPdfFile($item, $order->getId());
if (!empty($data) && !empty($data['filename']) && !empty($data['pdfFile'])) {
// adds attachment in mail
$attachmentPart = $this->transportBuilder->addAttachment(
$this->reader->fileGetContents($data['pdfFile']),
$data['filename'],
'application/pdf'
);
$message = $transport->getMessage();
$body = \Zend\Mail\Message::fromString($message->getRawMessage())->getBody();
$body = \Zend_Mime_Decode::decodeQuotedPrintable($body);
$html = '';
if ($body instanceof \Zend\Mime\Message) {
$html = $body->generateMessage(\Zend\Mail\Headers::EOL);
} elseif ($body instanceof \Magento\Framework\Mail\MimeMessage) {
$html = (string) $body->getMessage();
} elseif ($body instanceof \Magento\Framework\Mail\EmailMessage) {
$html = (string) $body->getBodyText();
} else {
$html = (string) $body;
}
$htmlPart = new \Zend\Mime\Part($html);
$htmlPart->setCharset('utf-8');
$htmlPart->setEncoding(\Zend_Mime::ENCODING_QUOTEDPRINTABLE);
$htmlPart->setDisposition(\Zend_Mime::DISPOSITION_INLINE);
$htmlPart->setType(\Zend_Mime::TYPE_HTML);
$parts = [$htmlPart, $attachmentPart];
$bodyPart = new \Zend\Mime\Message();
$bodyPart->setParts($parts);
$message->setBody($bodyPart);
}
}
}
$transport->sendMessage();
}
}
Finally, add the following code in app/code/Vendor/Module/etc/di.xml to use TransportBuilder class of your module and you are good to go.
<?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\Framework\Mail\Template\TransportBuilder" type="Vendor\Module\Model\Mail\TransportBuilder" /> </config> Moreover, you can also view our module <a href="https://store.webkul.com/magento2-order-attachment.html">Magento 2 Order attachment</a>.
4 comments
Greetings of the day!
We have created a ticket related to your query 445442. Our support team will contact you soon to assist you with this query.
Thanks & Regards
Team Webkul
The helper file here is used for creating pdf file.
So, you can use https://webkul.com/blog/generate-pdf-programmatically-magento2/ blog for the same.