Attaching PDF file to email on Magento 2


In Magento 2, The lib/internal/Magento/Framework/Mail/Template/TransportBuilder Class takes responsibility for preparing and sending email, but it’s still lacking a method for attaching PDF files.

However, since the TransportBuilder Class uses Message class, which inherits from \Zend_Mail, we are now able to add attachments programmatically.

Here is how we do it.

Step 1: Create TransportBuilder Class

Step 2: Create sample Email Sending on Controller


namespace Vendor_Name\Module_Name\Controller\Adminhtml\Ticket;

use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\Translate\Inline\StateInterface;
use Vendor_Name\Module_Name\Model\Mail\Template\TransportBuilder;
use Magento\Framework\App\Area;
use Magento\Store\Model\StoreManagerInterface;

* Class SendMail
* @package Magenest\Ticket\Controller\Adminhtml\Ticket   ,
class SendMail extends Action
    * @var StateInterface
   protected $inlineTranslation;

    * @var TransportBuilder
   protected $_transportBuilder;

    * @var StoreManagerInterface
   protected $_storeManager;

    * SendMail constructor.
    * @param Context $context
   public function __construct(
       Context $context,
       StateInterface $inlineTranslation,
       TransportBuilder $transportBuilder,
       StoreManagerInterface $storeManager
   ) {
       $this->inlineTranslation = $inlineTranslation;
       $this->_transportBuilder = $transportBuilder;
       $this->_storeManager = $storeManager;

    * @return $this
   public function execute()
       $resultPage = $this->resultRedirectFactory->create();
       return $resultPage->setPath('*/*/index');
    * Send Mail to customer
    * @param $eventName
   public function sendMail()
       $pdfFile = '.../email.pdf';
       $transport = $this->_transportBuilder->setTemplateIdentifier('name_email_use')->setTemplateOptions(
               'area' => Area::AREA_FRONTEND,
               'store' => $this->_storeManager->getStore()->getId(),
               'message' => 'this is test with send mail',
               'email' => '',
               'name' => 'Test'
          '', 'Receiver'

That’s all for the coding part.

Try to run the controller and check the result on the receiver’s email.

You will see a PDF file in the sent email like in the image below.

Hope this topic is helpful for you. Don’t mind leaving your questions here if you have any problems.



Don't want to miss out on our latest insights?
Subscribe to our newsletter.

Disclaimer: By clicking submit, you agree to share your information with us to receive news, announcements, and resources when they are available.