If you want to implement “add file attachment in the email” functionality in Magento 2, then please follow the below step.
Step 1) Create Vendor/Module/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="MagentoFrameworkMailTemplateTransportBuilder" type="VendorModuleModelMailTransportBuilder" /> </config>
Step 2) Please create the email template in Vendor/Module/view/frontend/email/email_template.html
then after calling this file to Vendor/Module/etc/email_templates.xml
Step 3) CreateTransportBuilder and extend with MagentoFrameworkMailTemplateTransportBuilder
Create Vendor/Module/Model/Mail/TransportBuilder.php
<?php
namespace VendorModuleModelMail;
use Zend_Mime;
class TransportBuilder extends MagentoFrameworkMailTemplateTransportBuilder
{
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;
}
}
Step 4) Send mail using controller in execute method
Create Vendor/Module/Controller/Index/Index.php
<?php
namespace VendorModuleControllerIndex;
use MagentoFrameworkAppActionContext;
use MagentoFrameworkUrlFactory;
use MagentoFrameworkAppFilesystemDirectoryList;
use MagentoFrameworkTranslateInlineStateInterface;
use VendorModuleModelMailTransportBuilder;
use MagentoFrameworkAppConfigScopeConfigInterface;
use MagentoStoreModelScopeInterface;
use Zend_Mime;
class Index extends MagentoCustomerControllerAbstractAccount {
public function __construct(Context $context,
MagentoFrameworkFilesystem $fileSystem,
StateInterface $inlineTranslation,
TransportBuilder $transportBuilder,
ScopeConfigInterface $scopeConfig,
UrlFactory $urlFactory,
MagentoFrameworkMessageManagerInterface $messageManager
) {
$this->_filesystem = $fileSystem;
$this->urlModel = $urlFactory->create ();
$this->inlineTranslation = $inlineTranslation;
$this->_transportBuilder = $transportBuilder;
$this->scopeConfig = $scopeConfig;
$this->messageManager = $messageManager;
parent::__construct ( $context );
}
public function execute() {
$objectManager = MagentoFrameworkAppObjectManager::getInstance();
$storeurl = $objectManager->get( 'MagentoStoreModelStoreManagerInterface' )->getStore()->getBaseUrl();
$result = array();
$resultRedirect = $this->resultRedirectFactory->create ();
if($_FILES['fileattach']['name']){
try {
$uploader = $objectManager->create('MagentoMediaStorageModelFileUploader',['fileId' => 'fileattach']);
$uploader->setAllowedExtensions(['docx']);
$uploader->setAllowRenameFiles(true);
$uploader->setFilesDispersion(true);
// get media directory
$mediaDirectory = $this->_filesystem->getDirectoryRead(DirectoryList::MEDIA);
// save the image to media directory
$result = $uploader->save($mediaDirectory->getAbsolutePath()."fileupload");
$email = $this->scopeConfig->getValue('trans_email/ident_general/email',ScopeInterface::SCOPE_STORE);
$name = $this->scopeConfig->getValue('trans_email/ident_general/name',ScopeInterface::SCOPE_STORE);
$pdfFile = $result['path'].$result['file'];
$emailTemplateVariables['message'] = 'This is a test message.';
$this->inlineTranslation->suspend();
$this->_transportBuilder->setTemplateIdentifier('email_template') // Add your template name
->setTemplateOptions(
[
'area' => MagentoFrameworkAppArea::AREA_FRONTEND,
'store' => $objectManager->get( 'MagentoStoreModelStoreManagerInterface' )->getStore()->getId(),
]
)
->setTemplateVars($emailTemplateVariables)
->setFrom([
'name' => 'From Name',
'email' => "test1@gmail.com",
])
->addTo("test123@gmail.com", "To Name")
->addAttachment(file_get_contents($pdfFile),$result['type'],Zend_Mime::DISPOSITION_ATTACHMENT,Zend_Mime::ENCODING_BASE64,$result['name']); //Attachment goes here.
try {
$transport = $this->_transportBuilder->getTransport();
$transport->sendMessage();
$this->inlineTranslation->resume();
} catch (Exception $e) {
echo $e->getMessage(); die;
}
} catch (Exception $e) {
Zend_Debug::dump($e->getMessage());
}
}else{
$url = $this->urlModel->getUrl ( '*/*/create', [
'_secure' => true
] );
$resultRedirect->setUrl ( $this->_redirect->error ( $url ) );
$this->messageManager->addError(__('Please upload the document'));
return $resultRedirect;
}
}
}

