src/Service/EmailService.php line 55
<?phpnamespace App\Service;use App\Entity\EmailContent;use App\Entity\EmailType;use App\Entity\User;use App\Repository\EmailTypeRepository;use Symfony\Bridge\Twig\Mime\BodyRenderer;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Component\Mailer\Mailer;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\Mailer\Transport;use Symfony\Component\Mime\Address;use Twig\Environment;class EmailService {public const NEWSLETTER_TYPE_HTML = 'html';public const NEWSLETTER_TYPE_TEXT = 'text';private $twig;private $mailerDsn;private $fromEmail;private $adminEmail;private $fromName;/*** @var EmailContentService*/private $emailContentService;/*** @var EmailArchiveService*/private $emailArchiveService;/*** @var EmailTypeRepository*/private $emailTypeRepository;public function __construct(Environment $twig,$mailerDsn,$fromEmail,$adminEmail,$fromName,MailerInterface $mailer,EmailContentService $emailContentService,EmailTypeRepository $emailTypeRepository,EmailArchiveService $emailArchiveService) {$this->mailerDsn = $mailerDsn;$this->fromEmail = $fromEmail;$this->adminEmail = $adminEmail;$this->fromName = $fromName;$this->twig = $twig;$this->mailer = $mailer;$this->emailContentService = $emailContentService;$this->emailTypeRepository = $emailTypeRepository;$this->emailArchiveService = $emailArchiveService;}public function getEmailTypeEntityByEmailTypeCode(string $emailTypeCode): EmailType {return $this->emailTypeRepository->findOneBy(['emailTypeCode' => $emailTypeCode]);}public function send( ?User $user, ?string $receiverEmailAddress, string $subject, EmailType $emailType, array $context, ?User $updatedBy, ?EmailContent $emailContent = null ): void{$receiverEmailAddress = (!is_null($receiverEmailAddress)) ? $receiverEmailAddress : $this->adminEmail;$template = $this->getEmailTemplateByEmailTemplateCode($emailType);self::sendEmailToServiceProvider($user,$receiverEmailAddress,$subject,$emailType,$template,$context,$emailContent,$updatedBy);/*$email = (new TemplatedEmail())->from(new Address($this->fromEmail, $this->fromName))->to($receiverEmailAddress)->subject($subject)->htmlTemplate($template)->context($context);$twigBodyRenderer = new BodyRenderer($this->twig);$twigBodyRenderer->render($email);//$dsn = "smtp://172.17.0.1:1025"; // @note: for mailhug$transport = Transport::fromDsn($this->mailerDsn);$mailer = new Mailer($transport);$mailer->send($email);*///$this->mailer->send($email);}public function sendNewsletter(array $recipients, string $subject, EmailType $emailType, string $emailBody, ?User $updatedBy){// Render the email body with Twig$context = ['subject' => $subject,'message' => $emailBody,];$emailContent = $this->emailContentService->persistEmailContent($emailBody, $subject, $updatedBy);$template = $this->getEmailTemplateByEmailTemplateCode($emailType);$chunkSize = 15;$chunks = array_chunk($recipients, $chunkSize);foreach ($chunks as $chunk) {foreach ($chunk as $recipient) {$context["name"] = $recipient->getFirstName();self::sendEmailToServiceProvider($recipient,$recipient->getEmail(),$subject,$emailType,$template,$context,$emailContent,$updatedBy);}sleep(2); // Sleep for 2 seconds to prevent Server Overload or Timeouts and Reduce the risk of email being Marked as Spam}}/*** Fixme: this should be cached* @param EmailType $emailType* @return string*/private function getEmailTemplateByEmailTemplateCode(EmailType $emailType): string {//$emailTypeEntity = $this->emailTypeRepository->findOneBy(['emailTypeCode' => $emailType->getEmailTypeCode()]);return "email_template/" . $emailType->getTemplate() . ".html.twig";}private function sendEmailToServiceProvider(?User $recipient,string $recipientEmail,string $subject,EmailType $emailType,string $template,array $context,?EmailContent $emailContent,?User $updatedBy): void {$email = (new TemplatedEmail())->from(new Address($this->fromEmail, $this->fromName))->to($recipientEmail)->subject($subject)->htmlTemplate($template)->context($context);$twigBodyRenderer = new BodyRenderer($this->twig);$twigBodyRenderer->render($email);//$dsn = "smtp://172.17.0.1:1025"; // @note: for mailhug$transport = Transport::fromDsn($this->mailerDsn);$mailer = new Mailer($transport);$mailer->send($email);//$htmlBody = $this->twig->render($template, $context);//dd($htmlBody, $email->getHtmlBody());$this->emailArchiveService->persistEmailArchive($recipientEmail, $emailType, $subject, json_encode($context), $recipient, $emailContent, $updatedBy);}}