0

I have installed https://github.com/manishjoy1993/email-attachment extesnion in my magento 2.2.8 version. Everthing is fine but I can not send multiple attachment in single mail. For multiple attachments I have created 2 functions in controller

->addAttachment(self::TEST_FILE_CONTENT, self::TEST_FILE_NAME, self::TEST_FILE_TYPE)
->addAttachment1(self::TEST_FILE_CONTENT, self::TEST_FILE_NAME, self::TEST_FILE_TYPE)

If I pass only one addAttachment() function,so I am receiving pdf file perfectly if I attach 2 pdf file in two different function so I am getting this kind of mail enter image description here

here is my code in Controller file

<?php
namespace Excellence\EmailAttachment\Controller\Index;
use Excellence\EmailAttachment\Mail\Template\TransportBuilder;
use Magento\Framework\App\Area;
use Magento\Framework\App\State;
use Magento\Framework\Exception\MailException;
class Index extends \Magento\Framework\App\Action\Action
{
 /**@#+
 * Test Data.
 */
 const TEST_TEMPLATE_IDENTIFIER = 'excellence_test_attachment';
 const TEST_FROM_EMAIL = 'general';
 const TEST_TO_EMAIL = '[email protected]';
 const TEST_FILE_CONTENT = 'Test file content.';
 const TEST_FILE_NAME = 'test12.pdf';
 const TEST_FILE_TYPE = 'application/pdf';
 /**@#-*/
 /**
 * @var \Excellence\EmailAttachment\Mail\Template\TransportBuilder
 */
 protected $transportBuilder;
 /**
 * @var \Magento\Framework\App\State
 */
 protected $state;
 /**
 * TestAttachment constructor.
 *
 * @param \Excellence\EmailAttachment\Mail\Template\TransportBuilder $transportBuilder
 * @param \Magento\Framework\App\State $state
 * @param null $name
 */
 public function __construct(
 \Magento\Framework\App\Action\Context $context,
 TransportBuilder $transportBuilder, State $state)
 {
 $this->transportBuilder = $transportBuilder;
 $this->state = $state;
 return parent::__construct($context);
 }
 public function execute()
 {
 try {
 // $this->state->setAreaCode(Area::AREA_FRONTEND);
 $sender = [
 'email' => '[email protected]',
 'name' => 'aaaaa'
 ];
 $this->transportBuilder
 ->setTemplateIdentifier(self::TEST_TEMPLATE_IDENTIFIER)
 ->setTemplateOptions([
 'area' => 'frontend',
 'store' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
 ])
 ->setTemplateVars([])
 ->addAttachment(self::TEST_FILE_CONTENT, self::TEST_FILE_NAME, self::TEST_FILE_TYPE)
 ->addAttachment1(self::TEST_FILE_CONTENT, self::TEST_FILE_NAME, self::TEST_FILE_TYPE)
 ->setFrom($sender )
 ->addTo(self::TEST_TO_EMAIL)
 ->getTransport()
 ->sendMessage();
 print_r(__('Everything is fine, email has been sent.'));
 } catch (MailException $me) {
 print_r(__('MailException: %1', $me->getMessage()));
 } catch (\Exception $e) {
 print_r(__('Exception: %1', $e->getMessage()));
 }
 } 
}

Here is app\code\Excellence\EmailAttachment\Mail\Template\TransportBuilder.php file

<?php
namespace Excellence\EmailAttachment\Mail\Template;
class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder
{
 public function addAttachment($content, $fileName, $fileType)
 {
 $this->message->setBodyAttachment($content, $fileName, $fileType);
 return $this;
 }
 public function addAttachment1($content, $fileName, $fileType)
 {
 $this->message->setBodyAttachment($content, $fileName, $fileType);
 return $this;
 }
 protected function prepareMessage()
 {
 parent::prepareMessage();
 $this->message->setPartsToBody();
 return $this;
 }
}

app\code\Excellence\EmailAttachment\Mail\Message.php file

<?php
namespace Excellence\EmailAttachment\Mail;
use Zend\Mime\Mime;
use Zend\Mime\PartFactory;
use Zend\Mail\MessageFactory as MailMessageFactory;
use Zend\Mime\MessageFactory as MimeMessageFactory;
class Message extends \Magento\Framework\Mail\Message implements \Magento\Framework\Mail\MailMessageInterface
{
 /**
 * @var \Zend\Mime\PartFactory
 */
 protected $partFactory;
 /**
 * @var \Zend\Mime\MessageFactory
 */
 protected $mimeMessageFactory;
 /**
 * @var \Zend\Mail\Message
 */
 private $zendMessage;
 /**
 * @var \Zend\Mime\Part[]
 */
 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)
 {
 $textPart = $this->partFactory->create();
 $textPart->setContent($content)
 ->setType(Mime::TYPE_TEXT)
 ->setCharset($this->zendMessage->getEncoding());
 $this->parts[] = $textPart;
 return $this;
 }
 public function setBodyHtml($content)
 {
 $htmlPart = $this->partFactory->create();
 $htmlPart->setContent($content)
 ->setType(Mime::TYPE_HTML)
 ->setCharset($this->zendMessage->getEncoding());
 $this->parts[] = $htmlPart;
 return $this;
 }
 public function setBodyAttachment($content, $fileName, $fileType)
 {
 $attachmentPart = $this->partFactory->create();
 $attachmentPart->setContent($content)
 ->setType($fileType)
 ->setFileName($fileName)
 ->setDisposition(Mime::DISPOSITION_ATTACHMENT)
 ->setEncoding(Mime::ENCODING_BASE64);
 $this->parts[] = $attachmentPart;
 return $this;
 }
 public function setPartsToBody()
 {
 $mimeMessage = $this->mimeMessageFactory->create();
 $mimeMessage->setParts($this->parts);
 $this->zendMessage->setBody($mimeMessage);
 return $this;
 }
 /**
 * {@inheritdoc}
 */
 public function setBody($body)
 {
 return $this;
 }
 /**
 * {@inheritdoc}
 */
 public function setSubject($subject)
 {
 $this->zendMessage->setSubject($subject);
 return $this;
 }
 /**
 * {@inheritdoc}
 */
 public function getSubject()
 {
 return $this->zendMessage->getSubject();
 }
 /**
 * {@inheritdoc}
 */
 public function getBody()
 {
 return $this->zendMessage->getBody();
 }
 /**
 * {@inheritdoc}
 */
 public function setFrom($fromAddress)
 {
 $this->zendMessage->setFrom($fromAddress);
 return $this;
 }
 /**
 * {@inheritdoc}
 */
 public function addTo($toAddress)
 {
 $this->zendMessage->addTo($toAddress);
 return $this;
 }
 /**
 * {@inheritdoc}
 */
 public function addCc($ccAddress)
 {
 $this->zendMessage->addCc($ccAddress);
 return $this;
 }
 /**
 * {@inheritdoc}
 */
 public function addBcc($bccAddress)
 {
 $this->zendMessage->addBcc($bccAddress);
 return $this;
 }
 /**
 * {@inheritdoc}
 */
 public function setReplyTo($replyToAddress)
 {
 $this->zendMessage->setReplyTo($replyToAddress);
 return $this;
 }
 /**
 * {@inheritdoc}
 */
 public function getRawMessage()
 {
 return $this->zendMessage->toString();
 }
 /**
 * @inheritDoc
 */
 public function setMessageType($type)
 {
 return $this;
 }
}
asked Aug 27, 2019 at 21:42

1 Answer 1

0

Hi bro try like this..

TransportBuilder

<?php
namespace Vendor\Module\Mail\Template;
use Magento\Framework\Mail\MessageInterface;
use Magento\Framework\Mail\MessageInterfaceFactory;
use Magento\Framework\Mail\Template\FactoryInterface;
use Magento\Framework\Mail\Template\SenderResolverInterface;
use Magento\Framework\Mail\TransportInterfaceFactory;
use Magento\Framework\ObjectManagerInterface;
use Zend\Mime\Mime;
use Zend\Mime\Part as MimePart;
use Zend\Mime\PartFactory as MimePartFactory;
use Zend\Mime\Message as MimeMessage;
use Zend\Mime\MessageFactory as MimeMessageFactory;
class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder
{
/** @var MimePart[] */
private $parts = [];
/** @var MimeMessageFactory */
private $mimeMessageFactory;
/** @var MimePartFactory */
private $mimePartFactory;
public function __construct(
 FactoryInterface $templateFactory,
 MessageInterface $message,
 SenderResolverInterface $senderResolver,
 ObjectManagerInterface $objectManager,
 TransportInterfaceFactory $mailTransportFactory,
 MimePartFactory $mimePartFactory,
 MimeMessageFactory $mimeMessageFactory,
 MessageInterfaceFactory $messageFactory = null
) {
 parent::__construct(
 $templateFactory,
 $message,
 $senderResolver,
 $objectManager,
 $mailTransportFactory,
 $messageFactory
 );
 $this->mimePartFactory = $mimePartFactory;
 $this->mimeMessageFactory = $mimeMessageFactory;
}
protected function prepareMessage()
{
 parent::prepareMessage();
 $mimeMessage = $this->getMimeMessage($this->message);
 foreach ($this->parts as $part) {
 $mimeMessage->addPart($part);
 }
 $this->message->setBody($mimeMessage);
 return $this;
}
public function addAttachment(
 $filename = null,
 $body,
 $mimeType = Mime::TYPE_OCTETSTREAM,
 $disposition = Mime::DISPOSITION_ATTACHMENT,
 $encoding = Mime::ENCODING_BASE64
) {
 $this->parts[] = $this->createMimePart($filename, $body, $mimeType, $disposition, $encoding);
 return $this;
}
private function createMimePart(
 $filename = null,
 $content,
 $type = Mime::TYPE_OCTETSTREAM,
 $disposition = Mime::DISPOSITION_ATTACHMENT,
 $encoding = Mime::ENCODING_BASE64
) {
 /** @var MimePart $mimePart */
 $mimePart = $this->mimePartFactory->create(['content' => $content]);
 $mimePart->setType($type);
 $mimePart->setDisposition($disposition);
 $mimePart->setEncoding($encoding);
 if ($filename) {
 $mimePart->setFileName($filename);
 }
 return $mimePart;
}
private function getMimeMessage(MessageInterface $message)
{
 $body = $message->getBody();
 if ($body instanceof MimeMessage) {
 return $body;
 }
 /** @var MimeMessage $mimeMessage */
 $mimeMessage = $this->mimeMessageFactory->create();
 if ($body) {
 $mimePart = $this->createMimePart((string)$body, Mime::TYPE_TEXT, Mime::DISPOSITION_INLINE);
 $mimeMessage->setParts([$mimePart]);
 }
 return $mimeMessage;
}

Create a preference for Magento\Framework\Mail\Template\TransportBuilder.php and than test in your custom controller with the multiple addAttachment() method. It should work. It worked for me.

answered Sep 16, 2019 at 20:48

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.