Magento 2: PDF động và đính kèm hình ảnh với email đặt hàng


7

Tôi cần phải đính kèm PDF và hình ảnh với email đặt hàng. Tôi có đường dẫn hình ảnh và PDF động được lưu trữ trong quote_itembảng. Tôi đã gỡ lỗi mã để đính kèm hình ảnh / PDF để đặt hàng email.

<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();
    }


}

Làm thế nào tôi có thể tiêm đối tượng thứ tự trong lớp SendBuilder.


Bạn nên thêm chi tiết vào câu hỏi của bạn, thêm mã liên quan của bạn, chỉ cần cung cấp tiền thưởng sẽ không giúp bạn có câu trả lời
Piyush

Câu trả lời:


2

Bạn cũng có thể thêm sự tham gia theo sở thích sau đó thêm vào 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="\Vendor\Module\Mail\Template\TransportBuilder"
                type="\Vendor\ModuleMagento\Mail\Template\TransportBuilder" />
</config>

Bây giờ bạn có thể sử dụng addAttachment () trên toàn bộ trang web của mình.

<?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;
    }
}

Điều này sẽ chỉ gửi email đặt hàng hoặc tất cả các loại email (hóa đơn, ghi nhớ tín dụng, ...)?
tarek fellah

1

Lớp gửi email mặc định của Magento TransportBuilderkhông mặc định cung cấp tệp đính kèm trong thư, nhưng bạn có thể thực hiện thủ công bằng cách ghi đè và sử dụng khung Zend được tích hợp vào Magento.

Đây là một blog giải thích tương tự - https://webkul.com/blog/attach-pdf-file-magento-2-email/


1

Sau khi nghiên cứu, tôi đã tìm ra cách chúng ta có thể đính kèm một hình ảnh động và PDF để đặt hàng email. Vui lòng làm theo các bước dưới đây để đính kèm hình ảnh để đặt hàng email.

Bước 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"/>

Bước 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;
        }
    }

}

Bước 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();
    }


}

Bước 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);
    }
}

Bước 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;
    }


}

Làm thế nào chúng ta có thể đính kèm tập tin trong email magento tùy chỉnh 2.3? bởi vì nó sử dụng zendframework 2
Manish Maheshwari

Làm cách nào tôi có thể đính kèm tệp PDF được tạo. Ví dụ: trên trang thành công, tôi đã viết một hàm để tạo tệp Pdf bằng id đơn hàng của mình và tệp đó đang được lưu với tên của id đơn hàng để làm cách nào tôi có thể đính kèm tệp động đó với email
Sayaned Hasan

1

Để gửi tệp đính kèm PDF trong magento 2.3 trong _transportBuilder, Dưới đây là mã..đây chắc chắn sẽ hoạt động:

$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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.