src/Service/EmailService.php line 55

  1. <?php
  2. namespace App\Service;
  3. use App\Entity\EmailContent;
  4. use App\Entity\EmailType;
  5. use App\Entity\User;
  6. use App\Repository\EmailTypeRepository;
  7. use Symfony\Bridge\Twig\Mime\BodyRenderer;
  8. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  9. use Symfony\Component\Mailer\Mailer;
  10. use Symfony\Component\Mailer\MailerInterface;
  11. use Symfony\Component\Mailer\Transport;
  12. use Symfony\Component\Mime\Address;
  13. use Twig\Environment;
  14. class EmailService {
  15.     public const NEWSLETTER_TYPE_HTML 'html';
  16.     public const NEWSLETTER_TYPE_TEXT 'text';
  17.     private $twig;
  18.     private $mailerDsn;
  19.     private $fromEmail;
  20.     private $adminEmail;
  21.     private $fromName;
  22.     /**
  23.      * @var EmailContentService
  24.      */
  25.     private $emailContentService;
  26.     /**
  27.      * @var EmailArchiveService
  28.      */
  29.     private $emailArchiveService;
  30.     /**
  31.      * @var EmailTypeRepository
  32.      */
  33.     private $emailTypeRepository;
  34.     public function __construct(
  35.         Environment $twig,
  36.         $mailerDsn,
  37.         $fromEmail,
  38.         $adminEmail,
  39.         $fromName,
  40.         MailerInterface $mailer,
  41.         EmailContentService $emailContentService,
  42.         EmailTypeRepository $emailTypeRepository,
  43.         EmailArchiveService $emailArchiveService
  44.     ) {
  45.         $this->mailerDsn $mailerDsn;
  46.         $this->fromEmail $fromEmail;
  47.         $this->adminEmail $adminEmail;
  48.         $this->fromName $fromName;
  49.         $this->twig $twig;
  50.         $this->mailer $mailer;
  51.         $this->emailContentService $emailContentService;
  52.         $this->emailTypeRepository $emailTypeRepository;
  53.         $this->emailArchiveService $emailArchiveService;
  54.     }
  55.     public function getEmailTypeEntityByEmailTypeCode(string $emailTypeCode): EmailType {
  56.         return $this->emailTypeRepository->findOneBy(['emailTypeCode' => $emailTypeCode]);
  57.     }
  58.     public function send( ?User $user, ?string $receiverEmailAddressstring $subjectEmailType $emailType, array $context, ?User $updatedBy, ?EmailContent $emailContent null ): void
  59.     {
  60.         $receiverEmailAddress = (!is_null($receiverEmailAddress)) ? $receiverEmailAddress $this->adminEmail;
  61.         $template $this->getEmailTemplateByEmailTemplateCode($emailType);
  62.         self::sendEmailToServiceProvider(
  63.             $user,
  64.             $receiverEmailAddress,
  65.             $subject,
  66.             $emailType,
  67.             $template,
  68.             $context,
  69.             $emailContent,
  70.             $updatedBy
  71.         );
  72.         /*
  73.         $email = (new TemplatedEmail())
  74.             ->from(new Address($this->fromEmail, $this->fromName))
  75.             ->to($receiverEmailAddress)
  76.             ->subject($subject)
  77.             ->htmlTemplate($template)
  78.             ->context($context);
  79.         $twigBodyRenderer = new BodyRenderer($this->twig);
  80.         $twigBodyRenderer->render($email);
  81.         //$dsn = "smtp://172.17.0.1:1025"; // @note: for mailhug
  82.         $transport = Transport::fromDsn($this->mailerDsn);
  83.         $mailer = new Mailer($transport);
  84.         $mailer->send($email);
  85.         */
  86.         //$this->mailer->send($email);
  87.     }
  88.     public function sendNewsletter(array $recipientsstring $subjectEmailType $emailTypestring $emailBody, ?User $updatedBy){
  89.         // Render the email body with Twig
  90.         $context = [
  91.             'subject' => $subject,
  92.             'message' => $emailBody,
  93.         ];
  94.         $emailContent $this->emailContentService->persistEmailContent($emailBody$subject$updatedBy);
  95.         $template $this->getEmailTemplateByEmailTemplateCode($emailType);
  96.         $chunkSize 15;
  97.         $chunks array_chunk($recipients$chunkSize);
  98.         foreach ($chunks as $chunk) {
  99.             foreach ($chunk as $recipient) {
  100.                 $context["name"] = $recipient->getFirstName();
  101.                 self::sendEmailToServiceProvider(
  102.                     $recipient,
  103.                     $recipient->getEmail(),
  104.                     $subject,
  105.                     $emailType,
  106.                     $template,
  107.                     $context,
  108.                     $emailContent,
  109.                     $updatedBy
  110.                 );
  111.             }
  112.             sleep(2); // Sleep for 2 seconds to prevent Server Overload or Timeouts and Reduce the risk of email being Marked as Spam
  113.         }
  114.     }
  115.     /**
  116.      * Fixme: this should be cached
  117.      * @param EmailType $emailType
  118.      * @return string
  119.      */
  120.     private function getEmailTemplateByEmailTemplateCode(EmailType $emailType): string {
  121.         //$emailTypeEntity = $this->emailTypeRepository->findOneBy(['emailTypeCode' => $emailType->getEmailTypeCode()]);
  122.        return "email_template/" $emailType->getTemplate() . ".html.twig";
  123.     }
  124.     private function sendEmailToServiceProvider(
  125.         ?User $recipient,
  126.         string $recipientEmail,
  127.         string $subject,
  128.         EmailType $emailType,
  129.         string $template,
  130.         array $context,
  131.         ?EmailContent $emailContent,
  132.         ?User $updatedBy
  133.     ): void {
  134.         $email = (new TemplatedEmail())
  135.             ->from(new Address($this->fromEmail$this->fromName))
  136.             ->to($recipientEmail)
  137.             ->subject($subject)
  138.             ->htmlTemplate($template)
  139.             ->context($context);
  140.         $twigBodyRenderer = new BodyRenderer($this->twig);
  141.         $twigBodyRenderer->render($email);
  142.         //$dsn = "smtp://172.17.0.1:1025"; // @note: for mailhug
  143.         $transport Transport::fromDsn($this->mailerDsn);
  144.         $mailer = new Mailer($transport);
  145.         $mailer->send($email);
  146.         //$htmlBody = $this->twig->render($template, $context);
  147.         //dd($htmlBody, $email->getHtmlBody());
  148.         $this->emailArchiveService->persistEmailArchive($recipientEmail$emailType$subjectjson_encode($context), $recipient$emailContent$updatedBy);
  149.     }
  150. }