src/Service/MailerService.php line 44

Open in your IDE?
  1. <?php
  2. namespace Acme\SudcmsBundle\Service;
  3. use Acme\SudcmsBundle\Entity\FormAdresses;
  4. use Acme\SudcmsBundle\Entity\FormSite;
  5. use Acme\SudcmsBundle\Entity\Site;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  8. use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
  9. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  10. use Symfony\Component\Filesystem\Filesystem;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. use Symfony\Component\HttpFoundation\Session\Session;
  13. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  14. use Symfony\Component\Mailer\MailerInterface;
  15. use Symfony\Component\Mime\Address;
  16. use Twig\Environment;
  17. class MailerService extends CommonLogsService {
  18.     private $mailer;
  19.     public  $subject   = "";
  20.     public  $fromEmail = "";
  21.     public  $fromName  = "";
  22.     private $defaultRecipient = [
  23.         "prenom" => "Agence",
  24.         "nom"    => "Otidea",
  25.         "email"  => "mathieu@otidea.com",
  26.         "type"   => "to"
  27.     ];
  28.     private $renderer;
  29.     private $entityManager;
  30.     private $containerBag;
  31.     private $parameterBag;
  32.     public bool   $errorLogsFolder = false;
  33.     public string $siteDirectory   = '';
  34.     private string $logsFolder = '/public/logs/mail/normal';
  35.     public function __construct(
  36.         private Filesystem     $filesystem,
  37.         private RequestStack   $requestStack,
  38.         MailerInterface        $mailer,
  39.         Environment            $renderer,
  40.         EntityManagerInterface $entityManager,
  41.         ParameterBagInterface  $parameterBag,
  42.         ContainerBagInterface  $containerBag
  43.     ) {
  44.         parent::__construct($filesystem, $parameterBag, $this, $entityManager);
  45.         $this->mailer = $mailer;
  46.         $this->renderer = $renderer;
  47.         $this->entityManager = $entityManager;
  48.         $this->containerBag = $containerBag;
  49.         $this->parameterBag = $parameterBag;
  50.         $pathFoler = explode('/', $this->requestStack->getCurrentRequest()->server->get('SCRIPT_NAME'));
  51.         $pathInfo = explode('/', $this->requestStack->getCurrentRequest()->getPathInfo());
  52.         $session = new Session();
  53.         if ($pathInfo[0] == 'admin' || $pathInfo[1] == 'admin') {
  54.             $this->site = $entityManager->getRepository(Site::class)->findOneBy(['id' => $session->get('admin_site_uid')]);
  55.         } else {
  56.             $this->site = $entityManager->getRepository(Site::class)->findOneBy(['projectDirectory' => $pathFoler[1]]);
  57.         }
  58.     }
  59.     /**
  60.      * Envoi d'un email avec une enveloppe (skin) par défaut
  61.      * @param array $recipients ce tableau contient les différentes adresses mails ( $recipients[[to],[cc],[cci]] )
  62.      * @param array $attachments pièces jointes à ajouter au mail
  63.      * @param string|null $formName Nom du formulaire lié pour récupération des destinataires
  64.      */
  65.     public function sendMail(array  $recipients = array(), $htmlContent = NULL, array $attachments = array(),
  66.                              string $formName = NULL,
  67.                                     $typeTo = true): bool {
  68.         if ($this->subject == null || trim($this->subject) == "" || $htmlContent == null || trim($htmlContent) == "") {
  69.             throw new \Exception('MailerService: Les paramètres ne sont pas correctement définis.');
  70.         }
  71.         $site = $this->entityManager->getRepository(Site::class)->find(CURRENT_SITE_ID);
  72.         $email = (new TemplatedEmail());
  73.         $email->subject($this->subject);
  74.         $email->from(new Address($site->getSiteSenderMail(), $site->getSiteSenderNameMail()));
  75.         // récupération de l'adresse en copie de tous les mails.
  76.         if ($site->getSiteCopyMail() !== null && trim($site->getSiteCopyMail()) != "") {
  77.             $recipients[] = [
  78.                 'type'   => 'cci',
  79.                 'email'  => $site->getSiteCopyMail(),
  80.                 'prenom' => 'Copie mail du site',
  81.                 'nom'    => $site->getSiteName(),
  82.             ];
  83.         }
  84.         //Si liaison avec un formulaire, on rajoute les destinataires
  85.         if ($formName != NULL) {
  86.             $recipientsForm = $this->getFormRecipients($formName);
  87.             if (is_array($recipientsForm) && sizeof($recipientsForm) > 0) {
  88.                 $recipients = array_merge($recipients, $recipientsForm);
  89.             }
  90.         }
  91.         // nombre de destinataires direct
  92.         $numberRecipientTo = $numberRecipientCc = $numberRecipientBcc = 0;
  93.         // définition des destinataires et le type d'envoi
  94.         foreach ($recipients as $recip) {
  95.             $firstname = isset($recip['prenom']) ? $recip['prenom'] : "";
  96.             $lastname = isset($recip['nom']) ? $recip['nom'] : "";
  97.             if (isset($recip['email']) && filter_var($recip['email'], FILTER_VALIDATE_EMAIL) && isset($recip['type'])) {
  98.                 $fullName = trim($firstname . " " . $lastname);
  99.                 if ($recip['type'] == "to") {
  100.                     if ($numberRecipientTo == 0)
  101.                         $email->to(new Address($recip['email'], $fullName));
  102.                     else
  103.                         $email->addTo(new Address($recip['email'], $fullName));
  104.                     $numberRecipientTo++;
  105.                 }
  106.                 //Tableau contenant les adresses mails en cc
  107.                 if ($recip['type'] == "cc") {
  108.                     if ($numberRecipientCc == 0)
  109.                         $email->cc(new Address($recip['email'], $fullName));
  110.                     else
  111.                         $email->addCc(new Address($recip['email'], $fullName));
  112.                     $numberRecipientCc++;
  113.                 }
  114.                 //Tableau contenant les adresses mails en cci (copie conforme invisible)(cci ->Bcc)
  115.                 if ($recip['type'] == "cci") {
  116.                     if ($numberRecipientBcc == 0)
  117.                         $email->bcc(new Address($recip['email'], $fullName));
  118.                     else
  119.                         $email->addBcc(new Address($recip['email'], $fullName));
  120.                     $numberRecipientBcc++;
  121.                 }
  122.             }
  123.         }
  124.         // si aucun mail to n'est définit, on envoi le mail sur notre boite pour
  125.         // nous informer du probleme
  126.         if ($numberRecipientTo === 0 && $typeTo) {
  127.             $fullName = $this->defaultRecipient['prenom'] . " " . $this->defaultRecipient['nom'];
  128.             $email->to(new Address($this->defaultRecipient['email'], $fullName));
  129.             $this->subject = "Erreur destinataire mail sur " . $site->getSiteName() . " : " . $this->subject;
  130.         }
  131.         //        $originFile = $this->parameterBag->get('upload_mail_media') . '/' . $site->getSiteHeaderMail();
  132.         if ($site->getSiteHeaderMail() != null || $site->getSiteHeaderMail() != '') {
  133.             // bandeau haut sur le mail
  134.             $imageData = $this->parameterBag->get("upload_mail_media_" . $site->getId()) . '/' . $site->getSiteHeaderMail();
  135.             $email->embedFromPath($imageData, 'header', 'image/jpg');
  136.         }
  137.         // création du template mail
  138.         $email->htmlTemplate('layouts/layouts_emails/skin_default.html.twig')
  139.             ->context([
  140.                           'content' => $htmlContent,
  141.                       ]);
  142.         // piece jointe
  143.         if (isset($attachments) && is_array($attachments) && sizeof($attachments) > 0) {
  144.             foreach ($attachments as $attachment)
  145.                 $email->attachFromPath($attachment);
  146.         }
  147.         // envoi du mail
  148.         try {
  149.             $this->mailer->send($email);
  150.             $this->writeLog(json_encode(
  151.                 [
  152.                     'status' => 'Envoyé',
  153.                     'destinataires' => $recipients,
  154.                     'sujet' => $this->subject,
  155.                     'formulaire' => $formName,
  156.                     'contenu' => $htmlContent,
  157.                     'piece jointe' => $attachments
  158.                 ]
  159.                             ), 'Envoi de mail');
  160.             return true;
  161.         } catch (TransportExceptionInterface $e) {
  162.             $this->errorLogsFolder = true;
  163.             $this->writeLog(json_encode(
  164.                                 [
  165.                                     'status' => $e->getMessage(),
  166.                                     'destinataires' => $recipients,
  167.                                     'sujet' => $this->subject,
  168.                                     'formulaire' => $formName,
  169.                                     'contenu' => $htmlContent,
  170.                                     'piece jointe' => $attachments
  171.                                 ]
  172.                             ), 'Envoi de mail');
  173.             return false;
  174.         }
  175.     }
  176.     /**
  177.      * Retourne la liste des mails liés au formulaire
  178.      * @param string $formName nom du formulaire pour récupérer les destinataires
  179.      * @return array tableau contenant les destinataires
  180.      */
  181.     private function getFormRecipients(string $formName = ""): array {
  182.         $allRecipients = [];
  183.         if ($formName !== "") {
  184.             $form = $this->entityManager->getRepository(FormSite::class)->findOneBy(['name' => $formName]);
  185.             $addresses = $this->entityManager->getRepository(FormAdresses::class)->findBy(['formSite' => $form->getId(),
  186.                                                                                            'enabled'  => 1]);
  187.             if (is_array($addresses) && sizeof($addresses) > 0) {
  188.                 foreach ($addresses as $address) {
  189.                     $allRecipients[] = [
  190.                         "nom"    => $address->getNom(),
  191.                         "prenom" => $address->getPrenom(),
  192.                         "email"  => $address->getEmail(),
  193.                         "type"   => $address->getType()
  194.                     ];
  195.                 }
  196.             }
  197.         }
  198.         return $allRecipients;
  199.     }
  200.     // Surcharge de la fonction writeLog pour ajouter le type de log avec son dossier
  201.     public function getPathLogFile(): string {
  202.         $this->siteDirectory = $this->site->getProjectDirectory();
  203.         if ($this->errorLogsFolder) {
  204.             $this->logsFolder = '/public/logs/mail/error';
  205.         }
  206.         // Vérification de l'existence du dossier de logs pour les API
  207.         if (!$this->filesystem->exists($this->parameterBag->get('kernel.project_dir') . '/../' . $this->siteDirectory . $this->logsFolder)) {
  208.             $this->filesystem->mkdir($this->parameterBag->get('kernel.project_dir') . '/../' . $this->siteDirectory . $this->logsFolder,
  209.                                      0755);
  210.         }
  211.         return $this->parameterBag->get('kernel.project_dir') . '/../' . $this->siteDirectory . $this->logsFolder . '/';
  212.     }
  213. }