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
vendor\magento\zendframework1\library\Zend\Mail.php
but its giving method not defined
Please give any suggestion regarding issue
- 
 How did you used code can you please show?Zahirabbas– Zahirabbas2018年12月06日 07:23:19 +00:00Commented Dec 6, 2018 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– Manish Maheshwari2018年12月06日 11:50:28 +00:00Commented Dec 6, 2018 at 11:50
- 
 Hello @ManishMaheshwari Have you got solution? I stuck in same issueSameer Bhayani– Sameer Bhayani2019年01月08日 06:08:29 +00:00Commented Jan 8, 2019 at 6:08
- 
 @SameerBhayani I haven't tried yet but you can try last answerManish Maheshwari– Manish Maheshwari2019年01月09日 06:51:08 +00:00Commented Jan 9, 2019 at 6:51
- 
 @ManishMaheshwari I tried but It didn't work :(Sameer Bhayani– Sameer Bhayani2019年01月09日 07:05:52 +00:00Commented Jan 9, 2019 at 7:05
7 Answers 7
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'
**$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.
- 
 1what about 2.2.11? how can i add attachment in 2.2.11Mohit Rane– Mohit Rane2020年09月01日 13:19:31 +00:00Commented Sep 1, 2020 at 13:19
- 
 @MohitRane try this magento.stackexchange.com/a/154092/82670Msquare– Msquare2020年09月02日 10:06:10 +00:00Commented Sep 2, 2020 at 10:06
- 
 unluckily it's not workingMohit Rane– Mohit Rane2020年09月02日 10:57:02 +00:00Commented Sep 2, 2020 at 10:57
- 
 can you check this issue magento.stackexchange.com/q/321365/73212Mohit Rane– Mohit Rane2020年09月02日 10:59:22 +00:00Commented Sep 2, 2020 at 10:59
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';
 $attachment=$this->_transportBuilder->addAttachment($pdfString,$pdf_name); 
 $bodyPart = new \Zend\Mime\Message();
 $bodyPart->setParts(array($bodyMessage,$attachment));
 $transport->getMessage()->setBody($bodyPart);
 $transport->sendMessage();
- 
 what we have to assign on that variables $pdfString,$pdf_name?sumeet bajaj– sumeet bajaj2019年06月03日 15:09:14 +00:00Commented Jun 3, 2019 at 15:09
- 
 @sumeetbajaj ,here $pdfString will be $pdf->render() and $pdf_name will be name of pdf which you want.Urvashi Prajapati– Urvashi Prajapati2019年06月04日 08:52:58 +00:00Commented Jun 4, 2019 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 attachmentsumeet bajaj– sumeet bajaj2019年06月04日 09:48:44 +00:00Commented Jun 4, 2019 at 9:48
Magento2.3using 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– Manish Maheshwari2018年12月06日 08:50:34 +00:00Commented Dec 6, 2018 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– Manish Maheshwari2018年12月07日 04:37:35 +00:00Commented Dec 7, 2018 at 4:37
- 
 @ManishMaheshwari add those code in your question2018年12月17日 14:26:19 +00:00Commented Dec 17, 2018 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– Sameer Bhayani2019年01月07日 08:18:45 +00:00Commented Jan 7, 2019 at 8:18
- 
 @SameerBhayani I checked once again the stuff. All is working. Simply use this module github.com/extait-com/email-attachmentJack Rush– Jack Rush2019年01月10日 09:19:48 +00:00Commented Jan 10, 2019 at 9:19
- 
 Then it could be problem in somewhere from my end. TySameer Bhayani– Sameer Bhayani2019年01月10日 10:36:45 +00:00Commented Jan 10, 2019 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– Abdul Kadir2019年06月13日 08:33:11 +00:00Commented Jun 13, 2019 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:206Abdul Kadir– Abdul Kadir2019年06月13日 08:49:24 +00:00Commented Jun 13, 2019 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);
 $attachment->setType($mimeType);
 $attachment->setDisposition($disposition);
 $attachment->setEncoding($encoding);
 $attachment->setFileName($filename);
 $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);
 $htmlPart->setCharset($this->zendMessage->getEncoding());
 $htmlPart->setType(Mime::TYPE_HTML);
 $mimeMessage = new \Zend\Mime\Message();
 $mimeMessage->addPart($htmlPart);
 if ($this->attachment) {
 $mimeMessage->addPart($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;
}
- 
 Sounds like we went through the same journey. I created an extension which adds a file field to contact us which works in 2.2 and 2.3 github.com/DominicWatts/ContactAttachment I hope this all helps someoneDominic Pixie– Dominic Pixie2019年07月26日 12:53:30 +00:00Commented Jul 26, 2019 at 12:53
I am getting the same error in Magento [2.4.6] while applying the security patch. This was for
Magento\Framework\Mail\Template\TransportBuilder
As suggested by @Msquare Replace this Class
use Zend\Mime\Mime;
use Zend\Mime\PartFactory;
With this Class
use Laminas\Mime\Mime;
use Laminas\Mime\PartFactory;
which is works for me.
Explore related questions
See similar questions with these tags.