ম্যাজেন্টো 2: সংযুক্তি সহ ইমেল প্রেরণ করুন


উত্তর:


19

এম 2 বাক্সের বাইরে আসে না তবে এটি জেন্ড ফ্রেমওয়ার্কের মধ্যে নির্মিত বৈশিষ্ট্য। এই কার্যকারিতাটি ম্যাজেন্টোতে কীভাবে যুক্ত করবেন তা এখানে একটি ভাল রেফারেন্স রয়েছে: https://blog.bitexpert.de/blog/sending-mails-with-attachments-in-magento-2/

যদি লিঙ্কটি মারা যায় তবে নিম্নলিখিতটি তৈরি করুন

<?php
namespace Your\CustomModule\Magento\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;
    }
}

তারপরে ইত্যাদি / 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="\Your\CustomModule\Magento\Mail\Template\TransportBuilder" />
</config>

এখন আপনি addAttachment()আপনার সাইট জুড়ে ব্যবহার করতে পারেন ।


8
আমি এখনও ভাবছি কেন ম্যাজেন্টো ট্রান্সপোর্ট বিল্ডারের এই পদ্ধতি নেই
মুরতুজা জাবুওয়ালা

4
আমরা কীভাবে কাস্টম ইমেল ম্যাজেন্টো ২.৩ এ ফাইল সংযুক্ত করতে পারি? কারণ এটি zendframework 2 ব্যবহার করে এবং এই উত্তর আর কাজ করে না
মণীশ মহেশ্বরী

3
ম্যাজেন্টো ২.৩ এ সংযুক্তি সহ ইমেল কীভাবে প্রেরণ করবেন?
duদুক মিতেশ

@ মনিষমেশেশ্বরী এবং মিতেশ সমাধান কি পেয়েছেন?
সমীর ভায়ানী

1
এই সমাধানটি আর Magento2.3 এ কাজ করছে না। সংযুক্তির জন্য কি কারও বিকল্প আছে?
নিশু

8

Magento 2.2.7 এর মতো সমাধান উপরে বর্ণিত আর কাজ করে না যেহেতু \Magento\Framework\Mail\Messageব্যাপ্ত বাদ \Zend_Mail
পরিবহন বিল্ডারের মাধ্যমে সংযুক্তি যুক্ত করার সহজ পদ্ধতির অভাবকে রোধ করার জন্য (যা বর্তমানে এই জাতীয় কোনও ফাংশনের সঠিক জায়গা বলে মনে হয়), একজনকে ট্রান্সপোর্টবিল্ডারের প্রতিস্থাপন তৈরি করতে হবে এবং ব্যবহার করতে হবে \Zend\Mime\Part:

<?php
namespace Your\CustomModule\Magento\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(
        $body,
        $mimeType = Mime::TYPE_OCTETSTREAM,
        $disposition = Mime::DISPOSITION_ATTACHMENT,
        $encoding = Mime::ENCODING_BASE64,
        $filename = null
    ) {
        $this->parts[] = $this->createMimePart($body, $mimeType, $disposition, $encoding, $filename);
        return $this;
    }

    private function createMimePart(
        $content,
        $type = Mime::TYPE_OCTETSTREAM,
        $disposition = Mime::DISPOSITION_ATTACHMENT,
        $encoding = Mime::ENCODING_BASE64,
        $filename = null
    ) {
        /** @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;
    }
}

\Magento\Framework\Mail\Template\TransportBuilderমাধ্যমে বাস্তবায়নের মাধ্যমে আসলটি প্রতিস্থাপন করতে ভুলবেন না di.xml

নোট করুন যে এই বাস্তবায়নটি সম্ভবত অবহিত হিসাবে ম্যাগন্টো-র আসন্ন প্রকাশের সাথে ভেঙে \Magento\Framework\Mail\MessageInterface::setBody()যাবে এবং শীঘ্রই অপসারণ করা যেতে পারে।

আছে HTH


ওহে! আপনার কোডে আপনার একটি পদ্ধতি অ্যাডএটাচমেন্ট রয়েছে তবে আপনি সেগুলি কোথায় ডাকলেন? আমি এটা দেখতে পাচ্ছি না।
নিকোলাই সিলিন 21'19

ধন্যবাদ! আমি রেডিমেসেজ পদ্ধতি এবং চিরকালের কাজগুলিতে লুপ যুক্ত করেছি।
নিকোলাই সিলিন

@ নিকোলাইসিলিন কীভাবে পিএনজি বা অন্যান্য ফাইল প্রেরণ করতে হয় তা জানুন।
সুমিত বাজাজ

1

ম্যাগেন্টো 2 মডিউল থেকে কাস্টম ইমেল, চিত্র সংযুক্তি সরবরাহ করে না।

আপনি যদি ম্যাজেন্টো 2 এ ইমেল টেমপ্লেটগুলির সাথে চিত্র সংযুক্তিটি ব্যবহার করতে চান তবে আপনাকে ক্লাস ওভাররাইড করতে হবে, ম্যাজেন্টো me ফ্রেমওয়ার্ক \ মেল \ টেমপ্লেট \ ট্রান্সপোর্টবিল্ডার

ম্যাজেন্টো-অফ-বাক্স ইমেলের জন্য সংযুক্তি বৈশিষ্ট্য সরবরাহ করে না। আপনি বিশদে ইমেল সংযুক্তি প্রেরণের জন্য ব্লগগুলি উল্লেখ করতে পারেন,

আপনি নীচের উপায় মত যুক্তি যুক্ত করতে হবে,

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

1
আপনি কি ম্যাজেন্টো ২.৩ এ অর্জন করতে সহায়তা করতে পারেন?
সমীর ভায়ানী

2.2.7 পর্যন্ত এইভাবে সংযুক্তি তৈরি করা হয়েছে। ২.২.৮ এবং ২.৩++ কাজ করছে না
ম্যাথিয়াস ক্লেইন

আমি মাত্র ২.৩.x @ ম্যাথিয়াসক্লিন
ডমডামব্রোগিয়া

হ্যালো, আমার যদি বেস 64 এনকোডিং স্ট্রিং থাকে তবে আমি কীভাবে সংযুক্ত করব?
কেতন বোড়াদা

1

মেগেটনো ২.৩-তে ইমেলের পিডিএফ প্রেরণের উপযুক্ত উত্তর এখানে

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

হাই, এটি একটি মারাত্মক ত্রুটি ছুঁড়ে ফেলছে: অপরিশোধিত ত্রুটি: একটি সদস্য ফাংশনটিতে কল করুন জেনারেট
ম্যাসেজ

আপনি একটি নতুন বার্তা তৈরি করছেন যা অপ্রয়োজনীয় যখন আপনার ট্রান্সপোর্টের ইতিমধ্যে কোনও বার্তা থাকে। কেন কেবল জায়গায় একটি অংশ যুক্ত করবেন না? এটি অগোছালো এবং অনুসরণ করা শক্ত। এই সমস্যাটি সমাধান করার জন্য আপনার প্রয়োজনীয় কাজ এবং মেমরি দ্বিগুণ করছেন।
ডোমডামব্রোগিয়া

1

ম্যাজেন্টো 2.3.x সামঞ্জস্যপূর্ণ:

এটি ম্যাগেন্টো ২.৩ এর জন্য আমার উত্তর ছিল যেহেতু গুগলে এটি শীর্ষস্থানীয় প্রশ্ন ছিল এবং মন্তব্যগুলিতে এমন অনেক লোক রয়েছেন বলে মনে হয়।

ডিফল্ট TransportBuilderক্লাসের মাধ্যমে ওভাররাইট করা সম্পর্কে অন্যান্য পোস্টে প্রচুর আকাঙ্ক্ষা রয়েছে বলে মনে হয় etc/di.xml, তবে আমি যে মডিউলটি নিয়ে কাজ করছি তা এত ছোট যে আমি এটি ডিফল্টর জন্য দায়বদ্ধ হতে চাই না TransportBuilderতাই আমি একটি সহায়ক শ্রেণি তৈরি করেছি (উচিত এটি ঘোষিত ইমেল টেমপ্লেটের সাথে একত্রে কতটা মিলিত - তার ভিত্তিতে একটি মডেল হোন - তবে আমি খনন করি)।

এতে TransportBuilderজনসাধারণের অ্যাক্সেস নেই TransportInterface, তবে পরিবর্তে প্রতিবার একটি ক্লোন তৈরি করে এবং তারপরে নির্মাতাকে পুনরায় সেট করুন। আমি আমার TransportInterfaceউদাহরণটি তৈরি করা এবং তারপরে Partপরিবহণের বার্তায় আমার সংযুক্তিগুলি যুক্ত করতে আরও সহজ পেয়েছি । আপনি যদি TransportBuilderনির্ভরতা ইনজেকশন পছন্দের মাধ্যমে ডিফল্টটিকে ওভাররাইট করার প্রয়োজন মনে করেন , সর্বজনীন পদ্ধতি আপডেট করার বিষয়ে সতর্ক হন। আপনার কোডটি সলিড রাখার সময় অনুশীলন করতে ভুলবেন না !

namespace Vendor\Module\Helper;

use Magento\Framework\App\Area;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\DataObject;
use Magento\Framework\Filesystem\Io\File;
use Magento\Framework\Mail\Template\TransportBuilder;
use Magento\Framework\Mail\TransportInterface;
use Magento\Store\Model\StoreManagerInterface;
use Zend_Mime;
use Zend\Mime\Part;

/**
 * This was initially built out to send a single email. Abstract this as you 
 * wish.
 *
 * @package Vendor\Module\Helper
 */
class Mail extends AbstractHelper
{
    /**
     * @var Context
     */
    protected $context;

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

    /**
     * @var StoreManagerInterface
     */
    protected $storeManager;

    /**
     * @var Config
     */
    protected $config;

    /**
     * Mail constructor.
     *
     * @param Context $context
     * @param TransportBuilder $transportBuilder
     * @param StoreManagerInterface $storeManager
     * @param Config $config
     * @param File $file
     */
    public function __construct(
        Context $context,
        TransportBuilder $transportBuilder,
        StoreManagerInterface $storeManager,
        Config $config,
        File $file
    ) {
        parent::__construct($context);
        $this->transportBuilder = $transportBuilder;
        $this->storeManager = $storeManager;
        $this->config = $config;
        $this->file = $file;
    }

    /**
     * Send the email for a Help Center submission.
     *
     * @param DataObject $templateParams
     * @param array $attachments
     * @return void
     */
    public function send(DataObject $templateParams, array $attachments = [])
    {
        $storeId = $this->storeManager->getStore()->getId();

        // Build transport
        /** @var \Magento\Framework\Mail\TransportInterface $transport */
        $transport = $this->transportBuilder
            ->setTemplateOptions(['area' => Area::AREA_FRONTEND, 'store' => $storeId])
            ->setTemplateIdentifier($this->config->getEmailTemplate())
            ->setTemplateVars($templateParams->toArray())
            ->setFrom($this->config->getEmailSender())
            ->addTo($this->config->getEmailRecipient(), 'Help Center')
            /**
             * Something important to note is that when the getTransport()
             * function is run, the message is compiled and then the builder 
             * class resets (as of 2.3.1). 
             * 
             * This is note worthy because if you want to send > 1 attachment,
             * your $builder will be reset -- losing all of the ->set* functions
             * you just used above as well as your attachment.
             * 
             * Since we append attachments to the transport, it's easier to:
             * build -> attach -> send. And this way multiple attachments 
             * can be included. :thumbsup:
             */
            ->getTransport();

        // Attach Images to transport
        foreach ($attachments as $a) {
            $transport = $this->addAttachment($transport, $a);
        }

        // Send transport
        $transport->sendMessage();
    }

    /**
     * Add an attachment to the message inside the transport builder.
     *
     * @param TransportInterface $transportBuilder
     * @param array $file Sanitized index from $_FILES
     * @return TransportInterface
     */
    protected function addAttachment(TransportInterface $transport, array $file): TransportInterface
    {
        $part = $this->createAttachment($file);
        $transport->getMessage()->addPart($part);

        return $transport;
    }

    /**
     * Create an zend mime part that is an attachment to attach to the email.
     * 
     * This was my usecase, you'll need to edit this to your own needs.
     *
     * @param array $file Sanitized index from $_FILES
     * @return Part
     */
    protected function createAttachment(array $file): Part
    {
        $ext =  '.' . explode('/', $file['type'])[1];
        $fileName = md5(uniqid(microtime()), true) . $ext;

        $attachment = new Part($this->file->read($file['tmp_name']));
        $attachment->disposition = Zend_Mime::TYPE_OCTETSTREAM;
        $attachment->encoding = Zend_Mime::ENCODING_BASE64;
        $attachment->filename = $fileName;

        return $attachment;
    }
}

আমি এটি সঠিকভাবে কাজ করতে পারি না, আমি সর্বদা "ব্যাতীত ত্রুটি: স্ট্রিংয়ের উপর একটি সদস্য ফাংশন অ্যাড পার্ট () এ কল করুন" বলে ব্যতিক্রম পেয়েছি ... সে সম্পর্কে কোনও ধারণা? : /
হল্যরন

1
@হেলরন অদ্ভুতভাবে যথেষ্ট যে আমি যা পাচ্ছিলাম তার থেকে আলাদা তবে এটি দেখতে আপনি সঠিক বলে মনে হচ্ছে। MessageInterface::getBodyপদ্ধতি স্বাক্ষর একটি স্ট্রিং রিটার্ন টাইপ দেখায়। আপনাকে আপনার TransportInterfaceঅবজেক্টের আশেপাশে খনন করতে হবে , তবে আমি আপনাকে বলতে পারি যে addPartপদ্ধতিটি কোনও Zend\Mime\Messageঅবজেক্টে বিদ্যমান । যেহেতু ম্যাজেন্টো সম্ভবত তাদের নিজস্ব বর্গের জন্য এই শ্রেণিটি বাড়িয়েছে Message, আমি মনে করি এটি চেষ্টা করা স্মার্ট হবে$transport->getMessage()->addpart($part);
ডমডামব্রোগিয়া

0

পূর্ববর্তী উত্তরগুলি দ্বারা উল্লিখিত হিসাবে, ম্যাজেন্টো 2-এ সংযুক্তি সহ মেলগুলি প্রেরণের বাইরে কোনও ফাংশন নেই।

এটি সর্বোত্তম অনুশীলন কিনা তা আমি জানি না, তবে আপনি Zend_Mailকোনও কাস্টম ফাংশন তৈরি না করে এবং Magento\Framework\Mail\Template\TransportBuilderনীচের মতো ওভাররাইড না করেই এটি করতে সরাসরি ক্লাস করতে পারেন

$mail = new \Zend_Mail('utf-8');
$mail->setFrom($senderEmail);
$mail->addTo($receiverEmail);
$mail->setSubject($subject);
$mail->setBodyHtml($text);

$content = file_get_contents($attachmentAbsolutePath);

$attachment = new \Zend_Mime_Part($content);
$attachment->type = 'text/xml'; // attachment's mime type
$attachment->disposition = \Zend_Mime::DISPOSITION_ATTACHMENT;
$attachment->encoding = \Zend_Mime::ENCODING_BASE64;
$attachment->filename = $filename;
$mail->addAttachment($attachment);
$mail->send();


$ transport-> getMessage () -> setBody ($ bodyPart);
ইমতিয়াজাউ

এই আনকচড ত্রুটিটি পাওয়া: অপরিজ্ঞাত পদ্ধতিতে কল করুন ম্যাজেন্টো \\ ফ্রেমওয়ার্ক \\ মেইল ​​\\ ইমেলম্যাসেজ :: সেটডোডি ()
ইমতিয়াজ

এই মন্তব্যগুলির উত্তরের সাথে সম্পর্কিত নয়
লুস্ক্কু

আমি এই ত্রুটিটি ম্যাজেন্টো ২.৩.৩ এ পেয়েছি
ইমতিয়াজাউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.