vendor/frosh/frosh-platform-template-mail/src/DependencyInjection/MailSendSubscriber.php line 75

Open in your IDE?
  1. <?php
  2. declare (strict_types=1);
  3. namespace Frosh\TemplateMail\DependencyInjection;
  4. use \Shopware\Core\Content\MailTemplate\Subscriber\MailSendSubscriberConfig;
  5. use Psr\Log\LoggerInterface;
  6. use Shopware\Core\Checkout\Document\DocumentService;
  7. use Shopware\Core\Content\Mail\Service\AbstractMailService;
  8. use Shopware\Core\Content\MailTemplate\Event\MailSendSubscriberBridgeEvent;
  9. use Shopware\Core\Content\MailTemplate\Exception\MailEventConfigurationException;
  10. use Shopware\Core\Content\MailTemplate\Exception\SalesChannelNotFoundException;
  11. use Shopware\Core\Content\MailTemplate\MailTemplateActions;
  12. use Shopware\Core\Content\MailTemplate\MailTemplateEntity;
  13. use Shopware\Core\Content\Media\MediaService;
  14. use Shopware\Core\Framework\Adapter\Translation\Translator;
  15. use Shopware\Core\Framework\Context;
  16. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  17. use Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException;
  18. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  19. use Shopware\Core\Framework\Event\BusinessEvent;
  20. use Shopware\Core\Framework\Event\MailActionInterface;
  21. use Shopware\Core\Framework\Feature;
  22. use Shopware\Core\Framework\Validation\DataBag\DataBag;
  23. use Shopware\Core\System\Locale\LanguageLocaleCodeProvider;
  24. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  25. use Symfony\Contracts\EventDispatcher\Event;
  26. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  27. /**
  28.  * @deprecated tag:v6.5.0 - reason:remove-subscriber - Will be removed in v6.5.0 Use SendMailAction instead
  29.  */
  30. class MailSendSubscriber extends \Shopware\Core\Content\MailTemplate\Subscriber\MailSendSubscriber implements EventSubscriberInterface
  31. {
  32.     public $froshEventDispatcher;
  33.     public const ACTION_NAME MailTemplateActions::MAIL_TEMPLATE_MAIL_SEND_ACTION;
  34.     public const MAIL_CONFIG_EXTENSION 'mail-attachments';
  35.     private EntityRepositoryInterface $mailTemplateRepository;
  36.     private MediaService $mediaService;
  37.     private EntityRepositoryInterface $mediaRepository;
  38.     private DocumentService $documentService;
  39.     private EntityRepositoryInterface $documentRepository;
  40.     private LoggerInterface $logger;
  41.     private AbstractMailService $emailService;
  42.     private EventDispatcherInterface $eventDispatcher;
  43.     private EntityRepositoryInterface $mailTemplateTypeRepository;
  44.     private Translator $translator;
  45.     private LanguageLocaleCodeProvider $languageLocaleProvider;
  46.     /**
  47.      * @internal
  48.      */
  49.     public function __construct(AbstractMailService $emailServiceEntityRepositoryInterface $mailTemplateRepositoryMediaService $mediaServiceEntityRepositoryInterface $mediaRepositoryEntityRepositoryInterface $documentRepositoryDocumentService $documentServiceLoggerInterface $loggerEventDispatcherInterface $eventDispatcherEntityRepositoryInterface $mailTemplateTypeRepositoryTranslator $translatorLanguageLocaleCodeProvider $languageLocaleProvider$froshEventDispatcher)
  50.     {
  51.         $this->mailTemplateRepository $mailTemplateRepository;
  52.         $this->mediaService $mediaService;
  53.         $this->mediaRepository $mediaRepository;
  54.         $this->documentRepository $documentRepository;
  55.         $this->documentService $documentService;
  56.         $this->logger $logger;
  57.         $this->emailService $emailService;
  58.         $this->eventDispatcher $eventDispatcher;
  59.         $this->mailTemplateTypeRepository $mailTemplateTypeRepository;
  60.         $this->translator $translator;
  61.         $this->languageLocaleProvider $languageLocaleProvider;
  62.         $this->froshEventDispatcher $froshEventDispatcher;
  63.     }
  64.     public static function getSubscribedEvents() : array
  65.     {
  66.         return [self::ACTION_NAME => 'sendMail'];
  67.     }
  68.     /**
  69.      * @throws MailEventConfigurationException
  70.      * @throws SalesChannelNotFoundException
  71.      * @throws InconsistentCriteriaIdsException
  72.      */
  73.     public function sendMail(Event $event) : void
  74.     {
  75.         if (Feature::isActive('FEATURE_NEXT_17858')) {
  76.             return;
  77.         }
  78.         if (!$event instanceof BusinessEvent) {
  79.             return;
  80.         }
  81.         $mailEvent $event->getEvent();
  82.         $extension $event->getContext()->getExtension(self::MAIL_CONFIG_EXTENSION);
  83.         if (!$extension instanceof MailSendSubscriberConfig) {
  84.             $extension = new MailSendSubscriberConfig(false, [], []);
  85.         }
  86.         if ($extension->skip()) {
  87.             return;
  88.         }
  89.         if (!$mailEvent instanceof MailActionInterface) {
  90.             throw new MailEventConfigurationException('Not a instance of MailActionInterface'\get_class($mailEvent));
  91.         }
  92.         $config $event->getConfig();
  93.         if (!isset($config['mail_template_id'])) {
  94.             return;
  95.         }
  96.         $mailTemplate $this->getMailTemplate($config['mail_template_id'], $event->getContext());
  97.         if ($mailTemplate === null) {
  98.             return;
  99.         }
  100.         $injectedTranslator $this->injectTranslator($mailEvent);
  101.         $data = new DataBag();
  102.         $recipients $mailEvent->getMailStruct()->getRecipients();
  103.         if (isset($config['recipients']) && !empty($config['recipients'])) {
  104.             $recipients $config['recipients'];
  105.         }
  106.         $data->set('recipients'$recipients);
  107.         $data->set('senderName'$mailTemplate->getTranslation('senderName'));
  108.         $data->set('salesChannelId'$mailEvent->getSalesChannelId());
  109.         $data->set('templateId'$mailTemplate->getId());
  110.         $data->set('customFields'$mailTemplate->getCustomFields());
  111.         $data->set('contentHtml'$mailTemplate->getTranslation('contentHtml'));
  112.         $data->set('contentPlain'$mailTemplate->getTranslation('contentPlain'));
  113.         $data->set('subject'$mailTemplate->getTranslation('subject'));
  114.         $this->froshEventDispatcher->dispatch(new \Frosh\TemplateMail\Event\MailDataBagFilter($data$mailTemplate$event->getContext()));
  115.         $data->set('mediaIds', []);
  116.         $attachments $this->buildAttachments($event$mailTemplate$extension);
  117.         if (!empty($attachments)) {
  118.             $data->set('binAttachments'$attachments);
  119.         }
  120.         $this->eventDispatcher->dispatch(new MailSendSubscriberBridgeEvent($data$mailTemplate$event));
  121.         if ($data->has('templateId')) {
  122.             try {
  123.                 $this->mailTemplateTypeRepository->update([['id' => $mailTemplate->getMailTemplateTypeId(), 'templateData' => $this->getTemplateData($mailEvent)]], $mailEvent->getContext());
  124.             } catch (\Throwable $e) {
  125.                 // Dont throw errors if this fails // Fix with NEXT-15475
  126.             }
  127.         }
  128.         try {
  129.             $this->emailService->send($data->all(), $event->getContext(), $this->getTemplateData($mailEvent));
  130.             $writes array_map(static function ($id) {
  131.                 return ['id' => $id'sent' => true];
  132.             }, $extension->getDocumentIds());
  133.             if (!empty($writes)) {
  134.                 $this->documentRepository->update($writes$event->getContext());
  135.             }
  136.         } catch (\Exception $e) {
  137.             $this->logger->error("Could not send mail:\n" $e->getMessage() . "\n" 'Error Code:' $e->getCode() . "\n" "Template data: \n" json_encode($data->all()) . "\n");
  138.         }
  139.         if ($injectedTranslator) {
  140.             $this->translator->resetInjection();
  141.         }
  142.     }
  143.     private function getMailTemplate(string $idContext $context) : ?MailTemplateEntity
  144.     {
  145.         $criteria = new Criteria([$id]);
  146.         $criteria->addAssociation('media.media');
  147.         $criteria->setLimit(1);
  148.         return $this->mailTemplateRepository->search($criteria$context)->first();
  149.     }
  150.     /**
  151.      * @throws MailEventConfigurationException
  152.      */
  153.     private function getTemplateData(MailActionInterface $event) : array
  154.     {
  155.         $data = [];
  156.         foreach (array_keys($event::getAvailableData()->toArray()) as $key) {
  157.             $getter 'get' ucfirst($key);
  158.             if (method_exists($event$getter)) {
  159.                 $data[$key] = $event->{$getter}();
  160.             } else {
  161.                 throw new MailEventConfigurationException('Data for ' $key ' not available.'\get_class($event));
  162.             }
  163.         }
  164.         return $data;
  165.     }
  166.     private function buildAttachments(BusinessEvent $eventMailTemplateEntity $mailTemplateMailSendSubscriberConfig $config) : array
  167.     {
  168.         $attachments = [];
  169.         if ($mailTemplate->getMedia() !== null) {
  170.             foreach ($mailTemplate->getMedia() as $mailTemplateMedia) {
  171.                 if ($mailTemplateMedia->getMedia() === null) {
  172.                     continue;
  173.                 }
  174.                 if ($mailTemplateMedia->getLanguageId() !== null && $mailTemplateMedia->getLanguageId() !== $event->getContext()->getLanguageId()) {
  175.                     continue;
  176.                 }
  177.                 $attachments[] = $this->mediaService->getAttachment($mailTemplateMedia->getMedia(), $event->getContext());
  178.             }
  179.         }
  180.         if (!empty($config->getMediaIds())) {
  181.             $entities $this->mediaRepository->search(new Criteria($config->getMediaIds()), $event->getContext());
  182.             foreach ($entities as $media) {
  183.                 $attachments[] = $this->mediaService->getAttachment($media$event->getContext());
  184.             }
  185.         }
  186.         if (!empty($config->getDocumentIds())) {
  187.             $criteria = new Criteria($config->getDocumentIds());
  188.             $criteria->addAssociation('documentMediaFile');
  189.             $criteria->addAssociation('documentType');
  190.             $entities $this->documentRepository->search($criteria$event->getContext());
  191.             foreach ($entities as $document) {
  192.                 $document $this->documentService->getDocument($document$event->getContext());
  193.                 $attachments[] = ['content' => $document->getFileBlob(), 'fileName' => $document->getFilename(), 'mimeType' => $document->getContentType()];
  194.             }
  195.         }
  196.         return $attachments;
  197.     }
  198.     private function injectTranslator(MailActionInterface $event) : bool
  199.     {
  200.         if ($event->getSalesChannelId() === null) {
  201.             return false;
  202.         }
  203.         if ($this->translator->getSnippetSetId() !== null) {
  204.             return false;
  205.         }
  206.         $this->translator->injectSettings($event->getSalesChannelId(), $event->getContext()->getLanguageId(), $this->languageLocaleProvider->getLocaleForLanguageId($event->getContext()->getLanguageId()), $event->getContext());
  207.         return true;
  208.     }
  209. }