0

In Magento 2.4, how can we attach a file with email as zend/mime/part AND Laminas/mime/part not working? Please suggest me solution for this.

4 Answers 4

2

Try this way

Some of the functionalities in Magento 2.3.x is different from previous version.
The reason is that in most cases the 2.3.x framework uses Zend Framework 2 (ZF2) and almost totally refuses to applyZend Framework 1 (ZF1).

Magento\Framework\Mail\MailMessageInterface::createAttachment()


So, due to this, the previous method is deprecated and there is no direct method to do so.

As createAttachment() method is no more available, we will override Magento\Framework\Mail\Message and create a class which will implement Magento\Framework\Mail\MailMessageInterface.


[vendor_name] / [Module_name] /Mail

Message.php

<?php

namespace [vendor_name]\[Module_name]\Mail;

use Magento\Framework\Mail\MailMessageInterface;
use Zend\Mail\MessageFactory as MailMessageFactory;
use Zend\Mime\MessageFactory as MimeMessageFactory;
use Zend\Mime\Mime;
use Zend\Mime\Part;
use Zend\Mime\PartFactory;


class Message implements MailMessageInterface
{
    protected $partFactory;
    protected $mimeMessageFactory;
    private $zendMessage;
    private $messageType = self::TYPE_TEXT;
    protected $parts = [];

    public function __construct(PartFactory $partFactory, MimeMessageFactory $mimeMessageFactory, $charset = 'utf-8')
    {
        $this->partFactory = $partFactory;
        $this->mimeMessageFactory = $mimeMessageFactory;
        $this->zendMessage = MailMessageFactory::getInstance();
        $this->zendMessage->setEncoding($charset);
    }
    public function setBodyText($content)
    {
        $this->setMessageType(self::TYPE_TEXT);
        $textPart = $this->partFactory->create();

        $textPart->setContent($content)
            ->setType(Mime::TYPE_TEXT)
            ->setCharset($this->zendMessage->getEncoding());

        $this->parts[] = $textPart;

        return $this;
    }
    public function setBodyHtml($content)
    {
        $this->setMessageType(self::TYPE_HTML);
        $htmlPart = $this->partFactory->create();

        $htmlPart->setContent($content)
            ->setType(Mime::TYPE_HTML)
            ->setCharset($this->zendMessage->getEncoding());

        $this->parts[] = $htmlPart;

        $mimeMessage = new \Zend\Mime\Message();
        $mimeMessage->addPart($htmlPart);
        $this->zendMessage->setBody($mimeMessage);

        return $this;
    }
    public function setBodyAttachment($content, $fileName, $fileType, $encoding = '8bit')
    {
        $attachmentPart = $this->partFactory->create();

        $attachmentPart->setContent($content)
            ->setType($fileType)
            ->setFileName($fileName)
            ->setDisposition(Mime::DISPOSITION_ATTACHMENT)
            ->setEncoding($encoding);

        $this->parts[] = $attachmentPart;

        return $this;
    }
    public function setPartsToBody()
    {
        $mimeMessage = $this->mimeMessageFactory->create();
        $mimeMessage->setParts($this->parts);
        $this->zendMessage->setBody($mimeMessage);

        return $this;
    }
    public function setBody($body)
    {
        if (is_string($body) && $this->messageType === self::TYPE_HTML) {
            $body = self::createHtmlMimeFromString($body);
        }
        $this->zendMessage->setBody($body);

        return $this;
    }
    public function setSubject($subject)
    {
        $this->zendMessage->setSubject($subject);

        return $this;
    }
    public function getSubject()
    {
        return $this->zendMessage->getSubject();
    }
    public function getBody()
    {
        return $this->zendMessage->getBody();
    }
    public function setFrom($fromAddress)
    {
        $this->setFromAddress($fromAddress, null);

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

        return $this;
    }
    public function addTo($toAddress)
    {
        $this->zendMessage->addTo($toAddress);

        return $this;
    }
    public function addCc($ccAddress)
    {
        $this->zendMessage->addCc($ccAddress);

        return $this;
    }
    public function addBcc($bccAddress)
    {
        $this->zendMessage->addBcc($bccAddress);

        return $this;
    }
    public function setReplyTo($replyToAddress)
    {
        $this->zendMessage->setReplyTo($replyToAddress);

        return $this;
    }
    public function getRawMessage()
    {
        return $this->zendMessage->toString();
    }
    private function createHtmlMimeFromString($htmlBody)
    {
        $htmlPart = new Part($htmlBody);
        $htmlPart->setCharset($this->zendMessage->getEncoding());
        $htmlPart->setType(Mime::TYPE_HTML);
        $mimeMessage = new \Zend\Mime\Message();
        $mimeMessage->addPart($htmlPart);

        return $mimeMessage;
    }
    public function setMessageType($type)
    {
        $this->messageType = $type;

        return $this;
    }
}

After implementation of the Mail\Message class we need to extend the \Magento\Framework\Mail\Template\TransportBuilder class.
This class is used for building the \Magento\Framework\Mail\Transport class which is in turn used for email sending.

[Vendor_name] / [Module_name] /Model/Mail/Template

AddEmailAttachemnt.php

<?php
namespace [Vendor_name]\[module_name]\Model\Mail\Template;

class AddEmailAttachemnt extends \Magento\Framework\Mail\Template\TransportBuilder
{

    public function addAttachment($file_content,$file_name,$file_type) 
    {
        $encoding = \Zend_Mime::ENCODING_BASE64;
        $this->message->setBodyAttachment($file_content, $file_name, $file_type, $encoding);
        return $this;
    }
    protected function prepareMessage()
    {
        parent::prepareMessage();
        $this->message->setPartsToBody();
        return $this;
    }
}

*Here value of Function Parameter*

**$file_content**
$file_url = "Exiting File URL (WEB-URL)";
$file_content = file_get_contents($file_url);

**$file_name**
this is name of file with extension like we have PDF file so name is **FileName.pdf**

**$file_type**
There are many File type for Different Files here are some File type list
'txt'  => 'text/plain',
'pdf'  => 'application/pdf',
'png' => 'image/png'

Click Here to More File Type


**$encoding**
*here is Encoding type value of File on Internet if you are not pass this argument by default is 6-bit Encoding is apply. this value is depends on your file.*

Now you Have to add below Lines to your di.xml file which are call your Overwrite files.

[vendor_name] / [Module_name] / etc

di.xml

<?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_name]\[module_name]\Model\Mail\Template\AddEmailAttachemnt" />
   
   <preference for="Magento\Framework\Mail\Message" type="[Vendor_name]\[module_name]\Mail\Message"/>

</config>

so now all file are place properly so now we will use send Email Attechment

Add this Code to send Email With Attechment

protected $_transportBuilder;

 public function __construct(
        ...................................................................
        ...................................................................
        \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
        ....................................................................
        ....................................................................
   ) {
       .................................
       .................................
       $this->_transportBuilder = $transportBuilder;
      ..................................... 
      .....................................
   }
   public function execute() {
   
        ...........................
        ...........................
        ...........................

         $transport = $this->_transportBuilder->setTemplateIdentifier($Email_template_name) // put Email Template Name
              ->setTemplateOptions(['area' => 'frontend', 'store' => $store]) // $store is Current Store Name 
              ->setTemplateVars(
                    [
                       'var_1' => 'value_1',
                       'var_2' => 'value_2',
                       'var_3'    => 'value_3'
                    ]
                  )
              ->setFrom('[email protected]') // Sender Email address
              ->addTo('[email protected]') // Receiver Email Address
              ->addAttachment($file_content, $file_name, $extension) // here Addtement are add with Email
              ->getTransport();
          $transport->sendMessage();

        ............................
        ............................
        ............................
   }

Now All code are Place at the Right place now run This Command

php bin/magento s:up

php bin/magento s:s:d -f

php bin/magento c:c

php bin/magento c:f

Now check your Receiver Email address attachment

Update in Magento [2.3.3]

Mangento 2.3.3 release introduces a new, immutable **EmailMessageInterface** that supports the sending of multi-part MIME-type content in email.
The Magento\Framework\Mail\Template\TransportBuilder and Magento\Newsletter\Model\Queue\TransportBuilder structures were refactored to use this new EmailMessageInterface instead of MessageInterface, which was previously used.
If you are a Magento extension developer and rely on \Magento\Email\Model\Transport::getMessage() or \Magento\Framework\Mail\TransportInterface::getMessage(), those methods will now return the new EmailMessageInterface.

Here add below Lines to your di.xml file which are call your Overwrite files.

[vendor_name] / [Module_name] / etc

di.xml

<?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_name]\[module_name]\Model\Mail\Template\AddEmailAttachemnt" />


</config>

[Vendor_name] / [Module_name] /Model/Mail/Template

AddEmailAttachemnt.php

<?php
declare (strict_types = 1);

namespace [Vendor_name]\[module_name]\Model\Mail\Template;

use Magento\Framework\App\TemplateTypesInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Mail\AddressConverter;
use Magento\Framework\Mail\EmailMessageInterfaceFactory;
use Magento\Framework\Mail\MessageInterface;
use Magento\Framework\Mail\MessageInterfaceFactory;
use Magento\Framework\Mail\MimeInterface;
use Magento\Framework\Mail\MimeMessageInterfaceFactory;
use Magento\Framework\Mail\MimePartInterfaceFactory;
use Magento\Framework\Mail\Template\FactoryInterface;
use Magento\Framework\Mail\Template\SenderResolverInterface;
use Magento\Framework\Mail\TransportInterfaceFactory;
use Magento\Framework\ObjectManagerInterface;
use Magento\Framework\Phrase;
use Zend\Mime\Mime;
use Zend\Mime\PartFactory;

class AddEmailAttachemnt extends \Magento\Framework\Mail\Template\TransportBuilder
{

    protected $templateIdentifier;
    protected $templateModel;
    protected $templateVars;
    protected $templateOptions;
    protected $transport;
    protected $templateFactory;
    protected $objectManager;
    protected $message;
    protected $_senderResolver;
    protected $mailTransportFactory;
    private $messageData = [];
    private $emailMessageInterfaceFactory;
    private $mimeMessageInterfaceFactory;
    private $mimePartInterfaceFactory;
    private $addressConverter;
    protected $attachments = [];
    protected $partFactory;

    public function __construct(
        FactoryInterface $templateFactory,
        MessageInterface $message,
        SenderResolverInterface $senderResolver,
        ObjectManagerInterface $objectManager,
        TransportInterfaceFactory $mailTransportFactory,
        MessageInterfaceFactory $messageFactory = null,
        EmailMessageInterfaceFactory $emailMessageInterfaceFactory = null,
        MimeMessageInterfaceFactory $mimeMessageInterfaceFactory = null,
        MimePartInterfaceFactory $mimePartInterfaceFactory = null,
        AddressConverter $addressConverter = null
    ) {
        $this->templateFactory = $templateFactory;
        $this->objectManager = $objectManager;
        $this->_senderResolver = $senderResolver;
        $this->mailTransportFactory = $mailTransportFactory;
        $this->emailMessageInterfaceFactory = $emailMessageInterfaceFactory ?: $this->objectManager
            ->get(EmailMessageInterfaceFactory::class);
        $this->mimeMessageInterfaceFactory = $mimeMessageInterfaceFactory ?: $this->objectManager
            ->get(MimeMessageInterfaceFactory::class);
        $this->mimePartInterfaceFactory = $mimePartInterfaceFactory ?: $this->objectManager
            ->get(MimePartInterfaceFactory::class);
        $this->addressConverter = $addressConverter ?: $this->objectManager
            ->get(AddressConverter::class);
        $this->partFactory = $objectManager->get(PartFactory::class);
        parent::__construct(
            $templateFactory,
            $message,
            $senderResolver,
            $objectManager,
            $mailTransportFactory,
            $messageFactory,
            $emailMessageInterfaceFactory,
            $mimeMessageInterfaceFactory,
            $mimePartInterfaceFactory,
            $addressConverter
        );
    }
    public function addCc($address, $name = '')
    {
        $this->addAddressByType('cc', $address, $name);

        return $this;
    }
    public function addTo($address, $name = '')
    {
        $this->addAddressByType('to', $address, $name);

        return $this;
    }
    public function addBcc($address)
    {
        $this->addAddressByType('bcc', $address);

        return $this;
    }
    public function setReplyTo($email, $name = null)
    {
        $this->addAddressByType('replyTo', $email, $name);

        return $this;
    }
    public function setFrom($from)
    {
        return $this->setFromByScope($from);
    }
    public function setFromByScope($from, $scopeId = null)
    {
        $result = $this->_senderResolver->resolve($from, $scopeId);
        $this->addAddressByType('from', $result['email'], $result['name']);

        return $this;
    }
    public function setTemplateIdentifier($templateIdentifier)
    {
        $this->templateIdentifier = $templateIdentifier;

        return $this;
    }
    public function setTemplateModel($templateModel)
    {
        $this->templateModel = $templateModel;
        return $this;
    }
    public function setTemplateVars($templateVars)
    {
        $this->templateVars = $templateVars;

        return $this;
    }
    public function setTemplateOptions($templateOptions)
    {
        $this->templateOptions = $templateOptions;

        return $this;
    }
    public function getTransport()
    {
        try {
            $this->prepareMessage();
            $mailTransport = $this->mailTransportFactory->create(['message' => clone $this->message]);
        } finally {
            $this->reset();
        }

        return $mailTransport;
    }
    protected function reset()
    {
        $this->messageData = [];
        $this->templateIdentifier = null;
        $this->templateVars = null;
        $this->templateOptions = null;
        return $this;
    }
    protected function getTemplate()
    {
        return $this->templateFactory->get($this->templateIdentifier, $this->templateModel)
            ->setVars($this->templateVars)
            ->setOptions($this->templateOptions);
    }
    protected function prepareMessage()
    {
        $template = $this->getTemplate();
        $content = $template->processTemplate();
        switch ($template->getType()) {
            case TemplateTypesInterface::TYPE_TEXT:
                $part['type'] = MimeInterface::TYPE_TEXT;
                break;

            case TemplateTypesInterface::TYPE_HTML:
                $part['type'] = MimeInterface::TYPE_HTML;
                break;

            default:
                throw new LocalizedException(
                    new Phrase('Unknown template type')
                );
        }
        $mimePart = $this->mimePartInterfaceFactory->create(['content' => $content]);
        $parts = count($this->attachments) ? array_merge([$mimePart], $this->attachments) : [$mimePart];
        $this->messageData['body'] = $this->mimeMessageInterfaceFactory->create(
            ['parts' => $parts]
        );

        $this->messageData['subject'] = html_entity_decode(
            (string) $template->getSubject(),
            ENT_QUOTES
        );
        $this->message = $this->emailMessageInterfaceFactory->create($this->messageData);

        return $this;
    }
    private function addAddressByType($addressType, $email, $name = null): void
    {
        if (is_string($email)) {
            $this->messageData[$addressType][] = $this->addressConverter->convert($email, $name);
            return;
        }
        $convertedAddressArray = $this->addressConverter->convertMany($email);
        if (isset($this->messageData[$addressType])) {
            $this->messageData[$addressType] = array_merge(
                $this->messageData[$addressType],
                $convertedAddressArray
            );
        }
    }
    public function addAttachment($content, $fileName, $fileType)
    {
        $attachmentPart = $this->partFactory->create();
        $attachmentPart->setContent($content)
            ->setType($fileType)
            ->setFileName($fileName)
            ->setDisposition(Mime::DISPOSITION_ATTACHMENT)
            ->setEncoding(Mime::ENCODING_BASE64);
        $this->attachments[] = $attachmentPart;

        return $this;
    }
}

Add this Code to send Email With Attechment

protected $_transportBuilder;

 public function __construct(
        ...................................................................
        ...................................................................
        \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
        ....................................................................
        ....................................................................
   ) {
       .................................
       .................................
       $this->_transportBuilder = $transportBuilder;
      ..................................... 
      .....................................
   }
   public function execute() {
   
        ...........................
        ...........................
        ...........................

         $transport = $this->_transportBuilder->setTemplateIdentifier($Email_template_name) // put Email Template Name
              ->setTemplateOptions(['area' => 'frontend', 'store' => $store]) // $store is Current Store Name 
              ->setTemplateVars(
                    [
                       'var_1' => 'value_1',
                       'var_2' => 'value_2',
                       'var_3'    => 'value_3'
                    ]
                  )
              ->setFrom('[email protected]') // Sender Email address
              ->addTo('[email protected]') // Receiver Email Address
              ->addAttachment($file_content, $file_name, $extension) // here Addtement are add with Email
              ->getTransport();
          $transport->sendMessage();

        ............................
        ............................
        ............................
   }

Now All code are Place at the Right place now run This Command

php bin/magento s:up

php bin/magento s:s:d -f

php bin/magento c:c

php bin/magento c:f

Update in Magento [2.4]

Laminas is simply the next step in the evolution of the Zend Framework. Only the naming and governance of the framework has changed.

Anyone can still install all existing Zend Framework, Apigility, and Expressive packages. However, these versions will no longer be maintained by the community.Click here

Use code into Update in Magento [2.3.3]

Replace this Class

use Zend\Mime\Mime;
use Zend\Mime\PartFactory;

With this Class

use Laminas\Mime\Mime;
use Laminas\Mime\PartFactory;

Remaining code are same into Update in Magento [2.3.3]

Now check your Receiver Email address for attachment

I Hope This Helps You.

credit goes to @msquare

4
  • Hi Rajesh, thanks for the reply. But zend\mime\part not working on magneto 2.4 version. Commented Dec 13, 2021 at 12:41
  • I added my answer for 2.4 ....replace zend with laminas Commented Dec 14, 2021 at 1:44
  • use Laminas\Mime\Mime; use Laminas\Mime\PartFactory Commented Dec 14, 2021 at 1:44
  • Added another answer for make it easier to understand Commented Dec 14, 2021 at 1:51
1

Try this way

Laminas is simply the next step in the evolution of the Zend Framework. Only the naming and governance of the framework has changed.

Anyone can still install all existing Zend Framework, Apigility, and Expressive packages. However, these versions will no longer be maintained by the community.Click here

Here add below Lines to your di.xml file which are call your Overwrite files.

[vendor_name] / [Module_name] / etc

di.xml

<?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_name]\[module_name]\Model\Mail\Template\AddEmailAttachemnt" />


</config>

[Vendor_name] / [Module_name] /Model/Mail/Template

AddEmailAttachemnt.php

<?php
declare (strict_types = 1);

namespace [Vendor_name]\[module_name]\Model\Mail\Template;

use Magento\Framework\App\TemplateTypesInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Mail\AddressConverter;
use Magento\Framework\Mail\EmailMessageInterfaceFactory;
use Magento\Framework\Mail\MessageInterface;
use Magento\Framework\Mail\MessageInterfaceFactory;
use Magento\Framework\Mail\MimeInterface;
use Magento\Framework\Mail\MimeMessageInterfaceFactory;
use Magento\Framework\Mail\MimePartInterfaceFactory;
use Magento\Framework\Mail\Template\FactoryInterface;
use Magento\Framework\Mail\Template\SenderResolverInterface;
use Magento\Framework\Mail\TransportInterfaceFactory;
use Magento\Framework\ObjectManagerInterface;
use Magento\Framework\Phrase;
use Laminas\Mime\Mime;
use Laminas\Mime\PartFactory;

class AddEmailAttachemnt extends \Magento\Framework\Mail\Template\TransportBuilder
{

    protected $templateIdentifier;
    protected $templateModel;
    protected $templateVars;
    protected $templateOptions;
    protected $transport;
    protected $templateFactory;
    protected $objectManager;
    protected $message;
    protected $_senderResolver;
    protected $mailTransportFactory;
    private $messageData = [];
    private $emailMessageInterfaceFactory;
    private $mimeMessageInterfaceFactory;
    private $mimePartInterfaceFactory;
    private $addressConverter;
    protected $attachments = [];
    protected $partFactory;

    public function __construct(
        FactoryInterface $templateFactory,
        MessageInterface $message,
        SenderResolverInterface $senderResolver,
        ObjectManagerInterface $objectManager,
        TransportInterfaceFactory $mailTransportFactory,
        MessageInterfaceFactory $messageFactory = null,
        EmailMessageInterfaceFactory $emailMessageInterfaceFactory = null,
        MimeMessageInterfaceFactory $mimeMessageInterfaceFactory = null,
        MimePartInterfaceFactory $mimePartInterfaceFactory = null,
        AddressConverter $addressConverter = null
    ) {
        $this->templateFactory = $templateFactory;
        $this->objectManager = $objectManager;
        $this->_senderResolver = $senderResolver;
        $this->mailTransportFactory = $mailTransportFactory;
        $this->emailMessageInterfaceFactory = $emailMessageInterfaceFactory ?: $this->objectManager
            ->get(EmailMessageInterfaceFactory::class);
        $this->mimeMessageInterfaceFactory = $mimeMessageInterfaceFactory ?: $this->objectManager
            ->get(MimeMessageInterfaceFactory::class);
        $this->mimePartInterfaceFactory = $mimePartInterfaceFactory ?: $this->objectManager
            ->get(MimePartInterfaceFactory::class);
        $this->addressConverter = $addressConverter ?: $this->objectManager
            ->get(AddressConverter::class);
        $this->partFactory = $objectManager->get(PartFactory::class);
        parent::__construct(
            $templateFactory,
            $message,
            $senderResolver,
            $objectManager,
            $mailTransportFactory,
            $messageFactory,
            $emailMessageInterfaceFactory,
            $mimeMessageInterfaceFactory,
            $mimePartInterfaceFactory,
            $addressConverter
        );
    }
    public function addCc($address, $name = '')
    {
        $this->addAddressByType('cc', $address, $name);

        return $this;
    }
    public function addTo($address, $name = '')
    {
        $this->addAddressByType('to', $address, $name);

        return $this;
    }
    public function addBcc($address)
    {
        $this->addAddressByType('bcc', $address);

        return $this;
    }
    public function setReplyTo($email, $name = null)
    {
        $this->addAddressByType('replyTo', $email, $name);

        return $this;
    }
    public function setFrom($from)
    {
        return $this->setFromByScope($from);
    }
    public function setFromByScope($from, $scopeId = null)
    {
        $result = $this->_senderResolver->resolve($from, $scopeId);
        $this->addAddressByType('from', $result['email'], $result['name']);

        return $this;
    }
    public function setTemplateIdentifier($templateIdentifier)
    {
        $this->templateIdentifier = $templateIdentifier;

        return $this;
    }
    public function setTemplateModel($templateModel)
    {
        $this->templateModel = $templateModel;
        return $this;
    }
    public function setTemplateVars($templateVars)
    {
        $this->templateVars = $templateVars;

        return $this;
    }
    public function setTemplateOptions($templateOptions)
    {
        $this->templateOptions = $templateOptions;

        return $this;
    }
    public function getTransport()
    {
        try {
            $this->prepareMessage();
            $mailTransport = $this->mailTransportFactory->create(['message' => clone $this->message]);
        } finally {
            $this->reset();
        }

        return $mailTransport;
    }
    protected function reset()
    {
        $this->messageData = [];
        $this->templateIdentifier = null;
        $this->templateVars = null;
        $this->templateOptions = null;
        return $this;
    }
    protected function getTemplate()
    {
        return $this->templateFactory->get($this->templateIdentifier, $this->templateModel)
            ->setVars($this->templateVars)
            ->setOptions($this->templateOptions);
    }
    protected function prepareMessage()
    {
        $template = $this->getTemplate();
        $content = $template->processTemplate();
        switch ($template->getType()) {
            case TemplateTypesInterface::TYPE_TEXT:
                $part['type'] = MimeInterface::TYPE_TEXT;
                break;

            case TemplateTypesInterface::TYPE_HTML:
                $part['type'] = MimeInterface::TYPE_HTML;
                break;

            default:
                throw new LocalizedException(
                    new Phrase('Unknown template type')
                );
        }
        $mimePart = $this->mimePartInterfaceFactory->create(['content' => $content]);
        $parts = count($this->attachments) ? array_merge([$mimePart], $this->attachments) : [$mimePart];
        $this->messageData['body'] = $this->mimeMessageInterfaceFactory->create(
            ['parts' => $parts]
        );

        $this->messageData['subject'] = html_entity_decode(
            (string) $template->getSubject(),
            ENT_QUOTES
        );
        $this->message = $this->emailMessageInterfaceFactory->create($this->messageData);

        return $this;
    }
    private function addAddressByType($addressType, $email, $name = null): void
    {
        if (is_string($email)) {
            $this->messageData[$addressType][] = $this->addressConverter->convert($email, $name);
            return;
        }
        $convertedAddressArray = $this->addressConverter->convertMany($email);
        if (isset($this->messageData[$addressType])) {
            $this->messageData[$addressType] = array_merge(
                $this->messageData[$addressType],
                $convertedAddressArray
            );
        }
    }
    public function addAttachment($content, $fileName, $fileType)
    {
        $attachmentPart = $this->partFactory->create();
        $attachmentPart->setContent($content)
            ->setType($fileType)
            ->setFileName($fileName)
            ->setDisposition(Mime::DISPOSITION_ATTACHMENT)
            ->setEncoding(Mime::ENCODING_BASE64);
        $this->attachments[] = $attachmentPart;

        return $this;
    }
}

Add this Code to send Email With Attechment

protected $_transportBuilder;

 public function __construct(
        ...................................................................
        ...................................................................
        \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
        ....................................................................
        ....................................................................
   ) {
       .................................
       .................................
       $this->_transportBuilder = $transportBuilder;
      ..................................... 
      .....................................
   }
   public function execute() {
   
        ...........................
        ...........................
        ...........................

         $transport = $this->_transportBuilder->setTemplateIdentifier($Email_template_name) // put Email Template Name
              ->setTemplateOptions(['area' => 'frontend', 'store' => $store]) // $store is Current Store Name 
              ->setTemplateVars(
                    [
                       'var_1' => 'value_1',
                       'var_2' => 'value_2',
                       'var_3'    => 'value_3'
                    ]
                  )
              ->setFrom('[email protected]') // Sender Email address
              ->addTo('[email protected]') // Receiver Email Address
              ->addAttachment($file_content, $file_name, $extension) // here Addtement are add with Email
              ->getTransport();
          $transport->sendMessage();

        ............................
        ............................
        ............................
   }

Now All code are Place at the Right place now run This Command

php bin/magento s:up

php bin/magento s:s:d -f

php bin/magento c:c

php bin/magento c:f

Now check your Receiver Email address for attachment

2
  • Works fine for Magento 2.4.7 Commented Sep 19 at 12:19
  • @NalinSavaliya good to hear that :) Commented Sep 20 at 16:32
0

If you are on Magento 2.4.4, Zend\Mime\Part no longer exist. Instead do this for the add attachment method for whatever answer you choose above.

 /**
 * Add attachment to email
 *
 * @param string $content
 * @param string $fileName
 * @param string $fileType
 * @return $this
 */
public function addAttachment($content, $fileName, $fileType)
{
    $attachmentPart = new \Zend_Mime_Part($content);
    $attachmentPart->type = $fileType;
    $attachmentPart->filename = $fileName;
    $attachmentPart->disposition = \Zend_Mime::DISPOSITION_ATTACHMENT;
    $attachmentPart->encoding = \Zend_Mime::ENCODING_BASE64;
    $this->{your parts attribute}[] = $attachmentPart;
    return $this;
}

You can either override

0

Or the easier way is

composer require laminas/laminas-zendframework-bridge

Which will replace references to Zend automatically without recoding entire modules.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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