How to send image attachment with email template in magento 2

For Attach image in email template, you need to override TransportBuilder Class from Magento\Framework\Mail\Template\TransportBuilder

For Send Email Magento 2 without image attachment refer link,  Send Mail from Custom module Magento 2

For Override TransportBuilder.php file in Magento 2, you need to create di.xml file.
Using di.xml file you can override any PHP class in Magento 2.

Create di.xml in your module,
app/code/Rbj/ImageAttachement/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">
    <!-- Mail sending with attachment -->
    <preference for="\Magento\Framework\Mail\Template\TransportBuilder" type="Rbj\ImageAttachement\Model\Mail\Template\TransportBuilder" />
</config>

Create TransportBuilder.php file at below location,

app/code/Rbj/ImageAttachement/Model/Mail/Template/TransportBuilder.php

<?php
namespace Rbj\ImageAttachement\Model\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;
    }
}

Create helper file to send image attachment in mail template,

<?php
namespace Rbj\ImageAttachement\Helper;
 
use Magento\Customer\Model\Session;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    const EMAIL_IDENTIFIER_TEMPLATE = 'custommodule/general/emailtemplate';

    protected $_inlineTranslation;
 
    protected $_storeManager;

    protected $_transportBuilder;
 
    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder    ) 
    {
        $this->_inlineTranslation = $inlineTranslation;
        $this->_storeManager = $storeManager;
        $this->_transportBuilder = $transportBuilder;
        parent::__construct($context);
    }
    
    public function mailSend() {

        $storeId = $this->_storeManager->getStore()->getStoreId();
        $templateName = $this->scopeConfig->getValue(
            self::EMAIL_IDENTIFIER_TEMPLATE,
            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
            $storeId
        );
       
        $senderName = 'Sender name'; //store admin sender name
        $senderEmail = 'senderemailid@xyz.com'; // store admin email id
        $recipientEmail = 'recipientemail@xyz.com'; // recipient email id
        $recipientName = 'recipient name';

        if (!$senderEmail && !$recipientEmail) {
            return false;
        }

        $this->_inlineTranslation->suspend();

        $this->_transportBuilder
            ->setTemplateIdentifier($templateName)
            ->setTemplateOptions([
                'area'  => \Magento\Framework\App\Area::AREA_FRONTEND,
                'store' => $storeId,
            ])
            ->setTemplateVars(
                [
                    'order' => 'custom order data',
                    'store' => $this->_storeManager->getStore(),
                ]
            );
           /*  image attachment logic */
            $image = 'abc.jpg'; //actual image name
            $mediaPath = 'image_dynamic_file_path'.$image; //set image path
            $body = file_get_contents($mediaPath);
            $imageName = pathinfo($image,PATHINFO_BASENAME);
            $this->_transportBuilder->addAttachment(
                $body,
                'image/jpeg',
                \Zend_Mime::DISPOSITION_ATTACHMENT,
                \Zend_Mime::ENCODING_BASE64,
                $imageName
            );

        $this->_transportBuilder
            ->setFrom([
                'name'  => $senderName,
                'email' => $senderEmail,
            ])
            ->addTo($recipientEmail, $recipientName);

        /* @var \Magento\Framework\Mail\Transport $transport */
        $transport = $this->_transportBuilder->getTransport();

        try {
            $transport->sendMessage();
        } catch (\Exception $e) {
            $this->context->getLogger()->alert($e->getMessage());
        }

        $this->_inlineTranslation->resume();
    }
 }