Skip to content

Unable to add attachment as PDF

I’m using Magento 2.4.6-p3 and have saved a PDF file in the pub/media/credit/ directory. The email is being sent correctly, but the attachment is not included when I check the email.

<?php
namespace AcmeCustomFormHelper;

use MagentoFrameworkAppHelperAbstractHelper;
use LaminasMimePart as MimePart;
use LaminasMimeMime;
use MagentoFrameworkAppResponseHttpFileFactory;
use MagentoFrameworkMailTemplateTransportBuilder;
use MagentoFrameworkTranslateInlineStateInterface;
use MagentoStoreModelStoreManagerInterface;
use MagentoFrameworkUrlInterface;
use MagentoStoreModelScopeInterface;

class Data extends AbstractHelper
{
    const EMAIL_TEMPLATE = 'email_section/sendmail/email_template';

    protected $transportBuilder;
    protected $inlineTranslation;
    protected $storeManager;
    protected $fileFactory;
    protected $url;

    public function __construct(
        MagentoFrameworkAppHelperContext $context,
        TransportBuilder $transportBuilder,
        StateInterface $inlineTranslation,
        StoreManagerInterface $storeManager,
        FileFactory $fileFactory,
        UrlInterface $url
    ) {
        $this->transportBuilder = $transportBuilder;
        $this->inlineTranslation = $inlineTranslation;
        $this->storeManager = $storeManager;
        $this->fileFactory = $fileFactory;
        $this->url = $url;
        parent::__construct($context);
    }

    public function sendMail($customerEmail)
    {
        $filePath = 'pub/media/credit/test.pdf';
        $writer = new Zend_Log_Writer_Stream(BP . '/var/log/storeManager.log');
        $logger = new Zend_Log();
        $logger->addWriter($writer);

        try {
            $logger->info('Starting email send process.');

            $this->inlineTranslation->suspend();
            $sender = [
                'name' => 'ProjectName',
                'email' => '[email protected]'
            ];

            // Read the file contents to attach
            if (file_exists($filePath)) {
                $fileContents = file_get_contents($filePath);
                $fileName = basename($filePath);
                $logger->info('File found and contents read successfully.');
            } else {
                $logger->err('File does not exist: ' . $filePath);
                throw new Exception('File not found: ' . $filePath);
            }

            $storeId = $this->getStoreId();
            $logger->info('Current Store ID: ' . $storeId);

            // Get templateId value from config
            $templateId = $this->scopeConfig->getValue(
                self::EMAIL_TEMPLATE,
                ScopeInterface::SCOPE_STORE,
                $storeId
            );
            $logger->info('Template ID retrieved: ' . $templateId);

            $templateVars = [
                'message_1' => 'CUSTOM MESSAGE STR 1',
                'message_2' => 'custom message str 2',
                'test_message' => 'This is a test message.',
                'store' => $this->getStore()
            ];

            // Build the email with the template and set template variables
            $this->transportBuilder
                ->setTemplateIdentifier($templateId)
                ->setTemplateOptions(
                    [
                        'area' => MagentoFrameworkAppArea::AREA_FRONTEND,
                        'store' => MagentoStoreModelStore::DEFAULT_STORE_ID,
                    ]
                )
                ->setTemplateVars($templateVars)
                ->setFrom($sender)
                ->addTo($customerEmail);
            $logger->info('Email transport built successfully.');

            // Create the MIME part for the attachment
            $attachmentPart = new LaminasMimePart($fileContents);
            $attachmentPart->type = LaminasMimeMime::TYPE_OCTETSTREAM;
            $attachmentPart->disposition = LaminasMimeMime::DISPOSITION_ATTACHMENT;
            $attachmentPart->encoding = LaminasMimeMime::ENCODING_BASE64;
            $attachmentPart->filename = $fileName;
            $logger->info('Attachment part created with filename: ' . $fileName);

            // Get the transport and the message object
            $transport = $this->transportBuilder->getTransport();
            $message = $transport->getMessage();
            $logger->info('Transport and message object retrieved.');

            // Check and create MIME message if it doesn't exist
            $existingBody = $message->getBody();
            if (!$existingBody) {
                $mimeMessage = new LaminasMimeMessage();
                $message->setBody($mimeMessage);
                $existingBody = $message->getBody();
                $logger->info('New MIME message created.');
            }

            // Get the existing body and append the attachment
            $mimeParts = $existingBody->getParts();
            $mimeParts[] = $attachmentPart;
            $logger->info('Attachment added to MIME parts.');

            // Create the MIME message with both parts
            $mimeMessage = new LaminasMimeMessage();
            $mimeMessage->setParts($mimeParts);
            $logger->info('MIME message set with attachment.');

            // Set the MIME message as the body of the email message
            $message->setBody($mimeMessage);
            $logger->info('MIME message body set.');

            // Send the email
            $transport->sendMessage();
            $logger->info('Email sent successfully.');

            $this->inlineTranslation->resume();
        } catch (Exception $e) {
            $logger->err('Error during email send: ' . $e->getMessage());
            $this->inlineTranslation->resume();
        }
    }

    /*
     * Get current store ID
     */
    public function getStoreId()
    {
        return $this->storeManager->getStore()->getId();
    }

    /*
     * Get current store info
     */
    public function getStore()
    {
        return $this->storeManager->getStore();
    }
}

log

2024-09-04T12:00:16+00:00 INFO (6): Starting email send process.
2024-09-04T12:00:16+00:00 INFO (6): File found and contents read
successfully. 2024-09-04T12:00:16+00:00 INFO (6): Current Store ID: 1
2024-09-04T12:00:16+00:00 INFO (6): Template ID retrieved: 16
2024-09-04T12:00:16+00:00 INFO (6): Email transport built
successfully. 2024-09-04T12:00:16+00:00 INFO (6): Attachment part
created with filename: spd_web_ins_feb_22_1.pdf
2024-09-04T12:00:16+00:00 INFO (6): Transport and message object
retrieved. 2024-09-04T12:00:16+00:00 INFO (6): New MIME message
created. 2024-09-04T12:00:16+00:00 INFO (6): Attachment added to MIME
parts. 2024-09-04T12:00:16+00:00 INFO (6): MIME message set with
attachment. 2024-09-04T12:00:16+00:00 INFO (6): MIME message body set.
2024-09-04T12:00:20+00:00 INFO (6): Email sent successfully.