Magento 2: Dynamisches PDF und Bildanhang mit Bestell-E-Mail

7

Ich muss PDF und Bilder mit Bestell-E-Mail anhängen. Ich habe einen dynamischen PDF- und Bildpfad, der in einer quote_itemTabelle gespeichert ist . Ich habe Code debuggt, um Bild / PDF anzuhängen und E-Mail zu bestellen.

<preference for="Magento\Framework\Mail\Template\TransportBuilder" type="vendor\moduleName\Model\Mail\MailTransportBuilder"></preference>
<preference for="Magento\Sales\Model\Order\Email\SenderBuilder" type="vendor\moduleName\Model\Mail\SenderBuilder"/>


<?php

namespace vendor\moduleName\Model\Mail;

class MailTransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder
{
    public function addPdfAttachment($fileContent, $filename)
    {
        if ($fileContent) {
            $this->message->createAttachment(
                $fileContent,
                'application/pdf',
                \Zend_Mime::DISPOSITION_ATTACHMENT,
                \Zend_Mime::ENCODING_BASE64,
                $filename
            );

            return $this;
        }
    }

    public function addImageAttachment($fileContent, $filename)
    {
        if ($fileContent) {
            $this->message->createAttachment(
                $fileContent,
                \Zend_Mime::TYPE_OCTETSTREAM,
                \Zend_Mime::DISPOSITION_ATTACHMENT,
                \Zend_Mime::ENCODING_BASE64,
                $filename
            );

            return $this;
        }
    }

}


<?php
/**
 * @author     Kristof Ringleff
 * @package    Fooman_EmailAttachments
 * @copyright  Copyright (c) 2015 Fooman Limited (http://www.fooman.co.nz)
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace vendor\moduleName\Model\Mail;

use Magento\Framework\Mail\Template\TransportBuilder;
use Magento\Sales\Model\Order\Email\Container\IdentityInterface;
use Magento\Sales\Model\Order\Email\Container\Template;

class SenderBuilder extends \Magento\Sales\Model\Order\Email\SenderBuilder
{
    /**
     * @var Template
     */
    protected $templateContainer;

    /**
     * @var IdentityInterface
     */
    protected $identityContainer;

    /**
     * @var TransportBuilder
     */
    protected $transportBuilder;

    /**
     * @param Template $templateContainer
     * @param IdentityInterface $identityContainer
     * @param TransportBuilder $transportBuilder
     */
    public function __construct(
        Template $templateContainer,
        IdentityInterface $identityContainer,
        TransportBuilder $transportBuilder
    ) {
        $this->templateContainer = $templateContainer;
        $this->identityContainer = $identityContainer;
        $this->transportBuilder = $transportBuilder;
    }

    /**
     * Prepare and send email message
     *
     * @return void
     */
    public function send()
    {
        $this->transportBuilder->addPdfAttachment(file_get_contents($data),$data);

        parent::send();
    }


}

Wie kann ich ein Auftragsobjekt in die SenderBuilder-Klasse einfügen?

Prakash Patel
quelle
Sie sollten Ihrer Frage weitere Details hinzufügen, Ihren zugehörigen Code hinzufügen.
Piyush,

Antworten:

2

Sie können attechement nach Belieben hinzufügen und dann zu etc / di.xml hinzufügen

<?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="\Vendor\Module\Mail\Template\TransportBuilder"
                type="\Vendor\ModuleMagento\Mail\Template\TransportBuilder" />
</config>

Jetzt können Sie addAttachment () auf Ihrer Website verwenden.

<?php
namespace Vendor\Module\Mail\Template;

class TransportBuilder 
    extends \Magento\Framework\Mail\Template\TransportBuilder
{
    public function addAttachment(
        $body,
        $mimeType    = Zend_Mime::TYPE_OCTETSTREAM,
        $disposition = Zend_Mime::DISPOSITION_ATTACHMENT,
        $encoding    = Zend_Mime::ENCODING_BASE64,
        $filename    = null
    ) {
        $this->message->createAttachment($body, $mimeType, $disposition, $encoding, $filename);
        return $this;
    }
}
Birjitsinh Zala
quelle
Dadurch werden nur Bestell-E-Mails oder alle E-Mail-Typen (Rechnung, Gutschrift, ...) gesendet.
Tarek Fellah
1

Die Standard-E-Mail-Sendeklasse von Magento stellt standardmäßig TransportBuilderkeine Anhänge in E-Mails bereit. Sie können dies jedoch manuell tun, indem Sie das in Magento integrierte Zend-Framework überschreiben und verwenden.

Hier ist ein Blog, der dasselbe erklärt - https://webkul.com/blog/attach-pdf-file-magento-2-email/

Vivek Kumar
quelle
1

Nach Recherchen habe ich herausgefunden, wie wir ein dynamisches Bild und ein PDF anhängen können, um E-Mails zu bestellen. Befolgen Sie bitte die folgenden Schritte, um Bilder an die Bestell-E-Mail anzuhängen.

Schritt 1:

<preference for="Magento\Framework\Mail\Template\TransportBuilder" type="vendor\moduleName\Model\Mail\MailTransportBuilder"></preference>
<preference for="Magento\Sales\Model\Order\Email\SenderBuilder" type="vendor\moduleName\Model\Mail\SenderBuilder"/>
<preference for="Magento\Sales\Model\Order\Email\Sender\OrderSender" type="vendor\moduleName\Model\Mail\Sender\OrderSender"/>
<preference for="Magento\Sales\Model\Order\Email\Container\Template" type="vendor\moduleName\Model\Mail\Container\Template"/>

Schritt 2:

<?php

namespace vendor\moduleName\Model\Mail;

class MailTransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder
{
    public function addPdfAttachment($fileContent, $filename)
    {
        if ($fileContent) {
            $this->message->createAttachment(
                $fileContent,
                'application/pdf',
                \Zend_Mime::DISPOSITION_ATTACHMENT,
                \Zend_Mime::ENCODING_BASE64,
                $filename
            );

            return $this;
        }
    }

    public function addImageAttachment($fileContent, $filename)
    {
        if ($fileContent) {
            $this->message->createAttachment(
                $fileContent,
                \Zend_Mime::TYPE_OCTETSTREAM,
                \Zend_Mime::DISPOSITION_ATTACHMENT,
                \Zend_Mime::ENCODING_BASE64,
                $filename
            );

            return $this;
        }
    }

}

Schritt 3:

<?php
/**
 * @author     Kristof Ringleff
 * @package    Fooman_EmailAttachments
 * @copyright  Copyright (c) 2015 Fooman Limited (http://www.fooman.co.nz)
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace vendor\moduleName\Model\Mail;


class SenderBuilder extends \Magento\Sales\Model\Order\Email\SenderBuilder
{

    /**
     * Prepare and send email message
     *
     * @return void
     */
    public function send()
    {
        $ImageList = $this->templateContainer->getImageList();
        $PdfList = $this->templateContainer->getPdfList();

        if(is_array($ImageList)){              
                foreach ($ImageList as $key => $data) {
                        $this->transportBuilder->addImageAttachment(file_get_contents($data),$data);
                }
        }

        if(is_array($PdfList)){
                foreach ($PdfList as $key => $data) {
                        $this->transportBuilder->addPdfAttachment(file_get_contents($data),$data);
                }
        }

        parent::send();
    }


}

Schritt 4:

<?php
/**
 * @author     Kristof Ringleff
 * @package    Fooman_EmailAttachments
 * @copyright  Copyright (c) 2015 Fooman Limited (http://www.fooman.co.nz)
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace vendor\moduleName\Model\Mail\Sender;


class OrderSender extends \Magento\Sales\Model\Order\Email\Sender\OrderSender
{
    /**
     * @var \Fooman\EmailAttachments\Model\AttachmentContainerInterface
     */
    protected $templateContainer;
     protected $_designerhelper;

    public function __construct(
        \Magento\Sales\Model\Order\Email\Container\Template $templateContainer,
        \Magento\Sales\Model\Order\Email\Container\OrderIdentity $identityContainer,
        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory,
        \Psr\Log\LoggerInterface $logger,
        \Magento\Sales\Model\Order\Address\Renderer $addressRenderer,
        \Magento\Payment\Helper\Data $paymentHelper,
        \Magento\Sales\Model\ResourceModel\Order $orderResource,
        \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig,
        \Magento\Framework\Event\ManagerInterface $eventManager
    ) {
        $this->templateContainer = $templateContainer;

        parent::__construct(
            $this->templateContainer,
            $identityContainer,
            $senderBuilderFactory,
            $logger,
            $addressRenderer,
            $paymentHelper,
            $orderResource,
            $globalConfig,
            $eventManager
        );
      /*  $this->attachmentContainer = $attachmentContainer;*/
    }

    public function send(\Magento\Sales\Model\Order $order, $forceSyncMode = false)
    {
        $items = $order->getAllVisibleItems();
        $IncrementId = $order->getIncrementId();
        $imageData = array();
        $pdfData = array();

        foreach ($items as $item) {

            if($item->getFilename() && $item->getDocumentId())
            {          
                       $imageData[] = $item->getImagePath();
                       $pdfData[] = $item->getPdfPath();
             }
        }

        if(count($pdfData) > 0){
                $this->templateContainer->setPdfList($pdfData);            
        }

        if(count($imageData) > 0){
                $this->templateContainer->setImageList($imageData);            
        }



        return parent::send($order, $forceSyncMode);
    }
}

Schritt 5

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace vendor\moduleName\Model\Mail\Container;

class Template extends \Magento\Sales\Model\Order\Email\Container\Template
{
    /**
     * @var array
     */
    protected $pdfAttach;

    /**
     * @var array
     */
    protected $imageAttach;

    public function setPdfList(array $pdfList)
    {
        $this->pdfAttach = $pdfList;
    }

    public function getPdfList()
    {
        return $this->pdfAttach;
    }

    public function setImageList(array $imageList)
    {
        $this->imageAttach = $imageList;
    }

    public function getImageList()
    {
        return $this->imageAttach;
    }


}
Prakash Patel
quelle
Wie können wir Dateien in benutzerdefinierten E-Mail Magento 2.3 anhängen? weil es zendframework 2 verwendet
Manish Maheshwari
Wie kann ich eine generierte PDF-Datei anhängen? Zum Beispiel habe ich auf der Erfolgsseite eine Funktion zum Generieren einer PDF-Datei unter Verwendung meiner Bestell-ID geschrieben und diese Datei wird mit dem Namen der Bestell-ID gespeichert. Wie kann ich diese dynamische Datei per E-Mail anhängen?
Sayyed Hasan
1

Um einen PDF-Anhang in Magento 2.3 in _transportBuilder zu senden, sehen Sie unten den Code. Dies wird definitiv funktionieren:

$transport = $_transportBuilder-setTemplateIdentifier(20)
-setTemplateOptions($templateOptions)
-setTemplateVars($templateVars)
-setFrom($from)
-addTo($vendor_email)
-getTransport();

$html= $transport-getMessage()-getBody()-generateMessage();       
$bodyMessage = new \Zend\Mime\Part($html); $bodyMessage-type =
'text/html';
$attachment=$_transportBuilder-addAttachment($pdfData,$fileName);    
$bodyPart = new \Zend\Mime\Message();
$bodyPart-setParts(array($bodyMessage,$attachment));
$transport-getMessage()-setBody($bodyPart);                
$transport-sendMessage(); $inlineTranslation-resume();
Jignesh Patel
quelle