resolveConfig($options); $email = $this->create($context, $config); $recipients = (array) $config['to']; foreach ($recipients as $recipient) { $email->to($recipient); $this->send($email); } } public function create(array $context, array $config): TemplatedEmail { $email = (new TemplatedEmail()) ->from($config['from']) ->subject($this->translator->trans($config['subject'], $config['subject_parameters'])) ->htmlTemplate($config['template']) ->context($context) ; foreach ($config['attachments'] as $attachment) { /* @var EmailAttachmentDto $attachment */ $email->attach($attachment->getContent(), $attachment->getName(), $attachment->getMimeType()); } return $email; } public function send(TemplatedEmail $email): void { $recipients = array_map(fn (Address $address) => $address->toString(), $email->getTo()); try { $this->mailer->send($email); $this->logger->info('Send email', [ 'to' => $recipients, 'subject' => $email->getSubject(), ]); } catch (TransportExceptionInterface $e) { $this->logger->error('Email could not be sent', [ 'to' => $recipients, 'subject' => $email->getSubject(), 'error' => $e->getMessage(), ]); } } private function resolveConfig(array $options): array { $resolver = new OptionsResolver(); $resolver ->setDefaults([ 'from' => $this->defaults['from'], 'to' => $this->defaults['to'], 'subject_parameters' => [], 'attachments' => [], ]) ->setRequired([ 'template', 'subject', ]) ->setAllowedTypes('to', ['string', 'array']) ->setAllowedTypes('template', 'string') ->setAllowedTypes('subject', 'string') ->setAllowedTypes('subject_parameters', 'array') ->setAllowedTypes('attachments', 'array') ; return $resolver->resolve($options); } }