Custom email attachment file is not working in magento 2.3. its working in Magento 2.2.X

Fatal error: Uncaught Error: Call to undefined method Magento\Framework\Mail\Message\Interceptor::createAttachment() in Mail/TransportBuilder.php

In magento 2.2.6 there is createAttachment method inside following path as same as magento 2.3


but its giving method not defined

Please give any suggestion regarding issue

  • How did you used code can you please show? – Zaheerabbas Dec 6 '18 at 7:23
  • /*see extend template and all */ class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder { /*This file used for add method to attach file in email and also used preference in di.xml*/ public function addAttachment($path,$name) { $this->message->createAttachment( $path, 'application/image', \Zend_Mime::DISPOSITION_ATTACHMENT, \Zend_Mime::ENCODING_BASE64, $name ); return $this; } } – Manish Maheshwari Dec 6 '18 at 11:50
  • Hello @ManishMaheshwari Have you got solution? I stuck in same issue – Sameer Bhayani Jan 8 at 6:08
  • @SameerBhayani I haven't tried yet but you can try last answer – Manish Maheshwari Jan 9 at 6:51
  • @ManishMaheshwari I tried but It didn't work :( – Sameer Bhayani Jan 9 at 7:05

1) in your custom transport builder add the below function for atatchment:

<?php namespace Magebees\Demo\Model\Mail;

class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder
     * @param Api\AttachmentInterface $attachment
    public function addAttachment($pdfString,$filename)
       $attachment = new \Zend\Mime\Part($pdfString);
            $attachment->type = \Zend_Mime::TYPE_OCTETSTREAM;
            $attachment->disposition = \Zend_Mime::DISPOSITION_ATTACHMENT;
            $attachment->encoding = \Zend_Mime::ENCODING_BASE64;
            $attachment->filename = $filename;
        return $attachment;

2) Then where you have used
$transport = $this->_transportBuilder->getTransport(); in that file add below code for send mail

$html='my testing html';            
            $bodyMessage = new \Zend\Mime\Part($html);
            $bodyMessage->type = 'text/html';
            $bodyPart = new \Zend\Mime\Message();
  • what we have to assign on that variables $pdfString,$pdf_name? – sumeet bajaj Jun 3 at 15:09
  • @sumeetbajaj ,here $pdfString will be $pdf->render() and $pdf_name will be name of pdf which you want. – Urvashi Prajapati Jun 4 at 8:52
  • ok but In ZF2 ,createAttachment() and addAttachment(), are not available anymore, so the correct way of dealing with multipart e-mails is using the Zend\Mime package.(according to above answer),i am using magento 2.3.1 verion but still unable to send email with attachment – sumeet bajaj Jun 4 at 9:48

Magento2.3 using ZendFramework2, Magento2.3 start deprecated us of ZendFramework1.

In ZF2 ,createAttachment() and addAttachment(), are not available anymore, so the correct way of dealing with multipart e-mails is using the Zend\Mime package.

See detail at https://zf2.readthedocs.io/en/release-2.2.3/modules/zend.mail.attachments.html

  • so how can we use Zend\Mime in Mail/TransportBuilder.php ? – Manish Maheshwari Dec 6 '18 at 8:50
  • /*i have tried in TransportBuilder class but attached not coming*/ public function addAttachment($path,$name) { $mail = new \Zend_Mail(); $fileContents = fopen($path, 'r'); $at = new \Zend_Mime_Part($fileContents); $at->type = 'image/jpg'; $at->disposition = \Zend_Mime::DISPOSITION_INLINE; $at->encoding = \Zend_Mime::ENCODING_BASE64; $at->filename = $name; $mail->addAttachment($at); return $this; } – Manish Maheshwari Dec 7 '18 at 4:37
  • @ManishMaheshwari add those code in your question – Murtuza Zabuawala Dec 17 '18 at 14:26

Yes, now it's needed to use ZF2 only. I'm no sure that the methods above will work smoothly. I found a better way to set this process.

I have managed to create a new class for Magento\Framework\Mail\Message default one by implementing of the Magento\Framework\Mail\MailMessageInterface interface. See the code that I've used https://github.com/extait-com/email-attachment/blob/master/Mail/Message.php

Also, this article will be helpful: https://extait.com/blog/how-to-send-email-with-attachment-in-magento-2-3/

Hope I help you.

  • Thank you @Jack Rush. While implementing above solution, I am getting error "main. ERROR: Unable to send mail: Unknown error". Emails are going to stop. – Sameer Bhayani Jan 7 at 8:18
  • @SameerBhayani I checked once again the stuff. All is working. Simply use this module github.com/extait-com/email-attachment – Jack Rush Jan 10 at 9:19
  • Then it could be problem in somewhere from my end. Ty – Sameer Bhayani Jan 10 at 10:36
  • i have used same module but i got this error PHP Fatal error: Uncaught Error: Call to undefined method Extait\Attachment\Mail\Message\Interceptor::setFromAddress() – Abdul Kadir Jun 13 at 8:33
  • @JackRush I have implement code as you said but i got this error: Uncaught Error: Call to undefined method Extait\Attachment\Mail\Message\Interceptor::setFromAddress() in / /public_html/vendor/magento/framework/Mail/Template/TransportBuilder.php:206 – Abdul Kadir Jun 13 at 8:49

This extension works fine on Magento ver. 2.3.1, https://github.com/extait-com/email-attachment

Just add a function in Extait/Attachment/Mail/Message.php,

public function setFromAddress($fromAddress, $fromName = null)
    $this->zendMessage->setFrom($fromAddress, $fromName);
    return $this;

and test it via command php bin/magento extait:test:attachment.


Fixed this issue by extending Magento\Framework\Mail\Message and adding new function createCustomAttachment in this, also edited the createHtmlMimeFromString function.

protected $attachment;

public function createCustomAttachment($body, $mimeType, $disposition, $encoding, $filename){
    $attachment = new Part($body);
    $this->attachment = $attachment;
    return $this;

Called the global variable $this->attachment in the function createHtmlMimeFromString. If the variable has value then we are adding the attachment data to the addPart function.

The code be like this

private function createHtmlMimeFromString($htmlBody)
    $htmlPart = new Part($htmlBody);
    $mimeMessage = new \Zend\Mime\Message();
    if ($this->attachment) {

    return $mimeMessage;

We need to copy the Magento\Framework\Mail\Message entire content in the extended file because the zendMessage is private and this is called in almost all functions.

We can call the createCustomAttachment function from the transport builder to pass the attachment details.

public function addAttachment($body,
                              $mimeType = Mime::TYPE_OCTETSTREAM,
                              $disposition = Mime::DISPOSITION_ATTACHMENT,
                              $encoding = Mime::ENCODING_BASE64,
                              $filename = null)
    //$this->message->createAttachment($body, $mimeType, $disposition, $encoding, $filename);
    $this->message->createCustomAttachment($body, $mimeType, $disposition, $encoding, $filename);
    return $this;

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.