src/Library/Subscribers/EmailSubscriber.php line 119

Open in your IDE?
  1. <?php
  2. namespace App\Library\Subscribers;
  3. use App\Library\Database;
  4. use App\Library\Event\demoSendEvent;
  5. use App\Library\Event\GrapperProcessEvent;
  6. use App\Library\Event\GrapperQueueEvent;
  7. use App\Library\Event\testEvent;
  8. use App\Library\Helper;
  9. use App\Library\Mailer as MailHandler;
  10. use App\Library\TemplateLibrary;
  11. use App\models\acount;
  12. use App\models\blacklistEmail;
  13. use App\models\eadr;
  14. use App\models\emain;
  15. use App\models\grapperEmailTemplate;
  16. use App\models\grapperMailLog;
  17. use DateInterval;
  18. use DateTime;
  19. use Doctrine\DBAL\Exception as BaseException;
  20. use Error;
  21. use ErrorException;
  22. use Exception;
  23. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  26. use Symfony\Component\Mime\Email;
  27. use Symfony\Component\Mime\Exception\RfcComplianceException;
  28. use Twig\Environment;
  29. use Twig\Error\LoaderError;
  30. use Twig\Error\RuntimeError;
  31. use Twig\Error\SyntaxError;
  32. use Twig\Loader\ArrayLoader;
  33. class EmailSubscriber implements EventSubscriberInterface
  34. {
  35.     /**
  36.      * SQL Statement to select email template
  37.      */
  38.     
  39.     protected const TEMPLATE_NEW_EVENTS_ONLY 1;
  40.     protected const TEMPLATE_NEW_AND_OLD_EVENTS 2;
  41.     protected const TEMPLATE_OLD_EVENTS_ONLY 3;
  42.     protected const TEMPLATE_NO_EVENTS 4;
  43.     
  44.     public const FS_TEMPLATES = [
  45.         141 => [
  46.             'html'=>'customer/141/html.twig',
  47.             'text'=>false,
  48.         ],
  49.     ];
  50.     public function __construct(
  51.         private readonly Database    $database,
  52.         private readonly MailHandler $mailer,
  53.         private readonly TemplateLibrary $template
  54.     ){
  55.     }
  56.     /**
  57.      * Defining required events
  58.      * @return \array[][]
  59.      */
  60.     public static function getSubscribedEvents():array
  61.     {
  62.         return [
  63.             GrapperProcessEvent::EVENT_RENDER => [
  64.                 [
  65.                     'renderTemplate'1000
  66.                 ]  
  67.             ],
  68.             GrapperProcessEvent::EVENT_SEND => [
  69.                 [
  70.                     'sendEmail'1000
  71.                 ]
  72.             ],
  73.             GrapperQueueEvent::EVENT_POST=>[
  74.                 [
  75.                     'sendEmailsToCustomer'1000,
  76.                 ]
  77.             ],
  78.             demoSendEvent::EVENT=>[
  79.                 'demoSend'1000
  80.             ],
  81.             testEvent::EVENT=>[
  82.                 'testSend'1000
  83.             ]
  84.         ];
  85.     }
  86.     public function testSend(testEvent $event):void{
  87.         try{
  88.             $mailObj = new Email();
  89.             $mailObj->to(base64_decode($event->getEmail()));
  90.             $mailObj->subject('Event Scout SMTP Test');
  91.             $mailObj->text('Test Email');
  92.             $mailObj->from('noreply@rce-event-service.de');
  93.             $mailObj->addReplyTo('support@rce.de');
  94.             $this->mailer->init($event->getCustomerId());
  95.             $this->mailer->getMailer()->send($mailObj);
  96.             $event->setResponse(new JsonResponse(['sent'=>true]));
  97.             return;
  98.         }catch(ErrorException|BaseException|Error  $ex){
  99.             $event->setResponse(new JsonResponse(['sent'=>false,'reason'=>'Bitte prüfen Sie ihre SMTP-Zugangsdaten!''debug' => $ex->getMessage()]));
  100.             return;
  101.         }
  102.     }
  103.     /**
  104.      * @throws TransportExceptionInterface
  105.      * @throws RuntimeError
  106.      * @throws BaseException
  107.      * @throws LoaderError
  108.      * @throws SyntaxError
  109.      */
  110.     public function demoSend(demoSendEvent $event):void{
  111.         $stmt $this->database->getConnection()->prepare(acount::GET_SPECIFIC_GRAPPER_CUSTOMER);
  112.         $stmt->bindValue(1,$event->getCustomerId());
  113.         $resultSet $stmt->executeQuery();
  114.         $customer $resultSet->fetchAssociative();
  115.         if(empty($event->getAdrId())){
  116.             $sql grapperEmailTemplate::GET_TEMPLATE_ACCOUNT;
  117.             $stmt $this->database->getConnection()->prepare($sql);
  118.             $stmt->bindValue(1$event->getCustomerId());
  119.         }else{
  120.             $sql grapperEmailTemplate::GET_TEMPLATE;
  121.             $stmt $this->database->getConnection()->prepare($sql);
  122.             $stmt->bindValue(1$event->getCustomerId());
  123.             $stmt->bindValue(2$event->getAdrId());
  124.         }
  125.         $resultSet $stmt->executeQuery();
  126.         $template $resultSet->fetchAssociative();
  127.         if(empty($event->getAdrId())){
  128.             $row = [
  129.                 'adrid'=>42,
  130.                 'adrname'=>'test eintrag',
  131.                 'adrstreet'=>'test straße 1',
  132.                 'adrcity'=>'test stadt',
  133.                 'extra1'=>'test',
  134.                 'extra2'=>'test',
  135.                 'extra3'=>'test',
  136.                 'extra4'=>'test',
  137.             ];
  138.         }else{
  139.             $sql eadr::SELECT_ADDRESSE;
  140.             $stmt $this->database->getConnection()->prepare($sql);
  141.             $stmt->bindValue(1$event->getAdrId());
  142.             $resultSet $stmt->executeQuery();
  143.             $row $resultSet->fetchAllAssociative()[0];
  144.         }
  145.         if(empty($template)){
  146.             $event->setResponse(new JsonResponse(['sent'=>false,'reason'=>'Template existiert nicht']));
  147.             return;
  148.         }
  149.         $link 'https://events.rceevent.de/region/?eintragen';
  150.         if(!empty($customer['grapper_meldemodul_link'])){
  151.             $link $customer['grapper_meldemodul_link'];
  152.         }
  153.         $visibleLink $link;
  154.         $subStmt $this->database->getConnection()->prepare(emain::GET_REACENT_EVENTS);
  155.         $subStmt->bindValue(1$event->getCustomerId());
  156.         $subStmt->bindValue(2$event->getAdrId());
  157.         $subStmt->bindValue(3$event->getAdrId());
  158.         $subStmt->bindValue(4$event->getAdrId());
  159.         $subResultSet $subStmt->executeQuery();
  160.         $events $subResultSet->fetchAllAssociative();
  161.         $resultEvents = [];
  162.         if(count($events)>0){
  163.             foreach($events as $item){
  164.                 $resultEvents[] = [
  165.                     'name'         => $item['ename'],
  166.                     'desc'         => $item['edesc'],
  167.                     'date'         => $item['edate'],
  168.                     'dateTo'     => $item['edateto'],
  169.                     'start'     => $item['etimestart'],
  170.                     'end'         => $item['etimeend'],
  171.                     'hash'         => $item['hashid'],
  172.                     'seolink'    => sprintf(Helper::generateSeoUrl($item['ename'], $row['adrcity'], $item['hashid']), $customer['grapper_domain']),
  173.                     'link'         => 'http link zur veranstaltung',
  174.                 ];
  175.             }
  176.         }
  177.         $replaceSet = [
  178.             'adressid'            => $row['adrid'],
  179.             'name'                => $row['adrname'],
  180.             'street'            => $row['adrstreet'],
  181.             'city'                => $row['adrcity'],
  182.             'extra1'            => $row['extra1'],
  183.             'extra2'            => $row['extra2'],
  184.             'extra3'            => $row['extra3'],
  185.             'extra4'            => $row['extra4'],
  186.             'teamname'            => $customer['Name'],
  187.             'teamvorname'        => $customer['Vorname'],
  188.             'teamfirma'            => $customer['Firma'],
  189.             'teamstrasse'         => $customer['Strasse'],
  190.             'teamplz'             => $customer['Plz'],
  191.             'teamort'             => $customer['Ort'],
  192.             'teamland'             => $customer['Land'],
  193.             'sender'            => $customer['grapper_smtp_self_receive'],
  194.             'link'                 => $link,
  195.             'visibleLink'        => $visibleLink,
  196.             'linkUnsubscribe'     => 'https://rce-event.de/modules/meldung/optout.php?id='.$row['adrid'],
  197.             'events'             => $resultEvents,
  198.             'eventCount'        => count($resultEvents),
  199.         ];
  200.         $subject $customer['grapper_betreff'];
  201.         if(!empty($template['grapper_betreff'])){
  202.             $subject $template['grapper_betreff'];
  203.         }
  204.         $loader = new ArrayLoader(
  205.             [
  206.                 'html.twig'=>str_replace(
  207.                     [
  208.                         '#sender#''#teamland#''#teamort#''#teamplz#''#teamstrasse#''#teamfirma#''#teamvorname#''#teamname#''#name#','#street#','#city#''#extra1''extra2''extra2''extra4',
  209.                     ],
  210.                     [
  211.                         '{{ sender}}''{{ teamland}}''{{ teamort}}''{{ teamplz}}''{{ teamstrasse}}''{{ teamfirma}}''{{ teamvorname}}''{{ teamname}}''{{name}}','{{street}}','{{city}}','{{extra1}}','{{extra2}}','{{extra3}}','{{extra4}}',
  212.                     ],
  213.                     (empty($template['html'])?'':$template['html'])
  214.                 ),
  215.                 'text.twig'=>str_replace(
  216.                     [
  217.                         '#name#','#street#','#city#''#extra1''extra2''extra2''extra4',
  218.                     ],
  219.                     [
  220.                         '{{name}}','{{street}}','{{city}}','{{extra1}}','{{extra2}}','{{extra3}}','{{extra4}}',
  221.                     ],
  222.                     (empty($template['text'])?'':$template['text'])
  223.                 ),
  224.             ]
  225.         );
  226.         $twig = new Environment($loader, [
  227.             'cache'=>__DIR__.'/../../var/twig',
  228.         ]);
  229.         $text str_replace('&amp;''&'$twig->render('text.twig'$replaceSet));
  230.         $html str_replace('&amp;''&'$twig->render('html.twig'$replaceSet));
  231.         $mailObj = new Email();
  232.         $mailObj->to(base64_decode($event->getEmail()));
  233.         $mailObj->subject($subject);
  234.         if(!empty($text)){
  235.             $mailObj->text($text);
  236.         }else{
  237.             $mailObj->text('leer');
  238.         }
  239.         if(!empty($html)){
  240.             $mailObj->html($html);
  241.         }
  242.         $mailObj->from('noreply@rce-event-service.de');
  243.         $mailObj->addReplyTo('support@rce.de');
  244.         try{
  245.             $this->mailer->init($event->getCustomerId());
  246.             $this->mailer->getMailer()->send($mailObj);
  247.             $event->setResponse(new JsonResponse(['sent'=>true]));
  248.             return;
  249.         }catch(Exception $ex){
  250.             $event->setResponse(new JsonResponse(['sent'=>false,'reason'=>'Bitte prüfen Sie ihre SMTP-Zugangsdaten!''debug' => $ex->getMessage()]));
  251.             return;
  252.         }
  253.         $event->setResponse(JsonResponse(['sent'=>false,'reason'=>'Unbekannter Fehler. Bitte kontaktieren Sie den Support''debug' => $ex->getMessage()]));
  254.     }
  255.     /**
  256.      * render text and html template
  257.      * @param \App\Library\Event\GrapperEvent $event
  258.      * @return void
  259.      * @throws BaseException
  260.      * @throws LoaderError
  261.      * @throws RuntimeError
  262.      * @throws SyntaxError
  263.      */
  264.     public function renderTemplate(GrapperProcessEvent $event):void
  265.     {
  266.         $event->addVerboseOutput('Parsing Templates');
  267.         $template null;
  268.         $event->addVerboseOutput('Customer: '.$event->getAcount()->getId().' Address ID: '.$event->getAddress()->getId());
  269.         $this->template->reset();
  270.         $this->template->prepareTemplate($event);
  271.         $this->template->prepareTwig();
  272.         $link 'https://events.rceevent.de/region/?eintragen';
  273.         if(!empty($event->getAcount()->getMeldeModulLink())){
  274.             $link $event->getAcount()->getMeldeModulLink();
  275.         }
  276.         $visibleLink $link;
  277.         if(!strpos($link'?')!==false){
  278.             $link .= '?';
  279.         }else{
  280.             $link .= '&';
  281.         }
  282.         $link .= 'gid='.(int)$event->getAddress()->getId();
  283.         //var_dump($rowResult);
  284.         $subStmt $this->database->getConnection()->prepare(emain::GET_REACENT_EVENTS);
  285.         $subStmt->bindValue(1$event->getAcount()->getId());
  286.         $subStmt->bindValue(2$event->getAddress()->getId());
  287.         $subStmt->bindValue(3$event->getAddress()->getId());
  288.         $subStmt->bindValue(4$event->getAddress()->getEmail());
  289.         $subResultSet $subStmt->executeQuery();
  290.         $events $subResultSet->fetchAllAssociative();
  291.         $resultEvents = [];
  292.         $eventMode 0;
  293.         $n 0;
  294.         if(count($events)>0){
  295.             foreach($events as $item){
  296.                 $resultEvents[] = [
  297.                     'active'    => ($item['eonline']==='enable,free'?1:0),
  298.                     'name'         => (strlen($item['ename']) > 35?substr($item['ename'], 0,35).'...':$item['ename']),
  299.                     'fullname'     => $item['ename'],
  300.                     'desc'         => $item['edesc'],
  301.                     'date'         => $item['edate'],
  302.                     'dateTo'     => $item['edateto'],
  303.                     'start'     => $item['etimestart'],
  304.                     'end'         => $item['etimeend'],
  305.                     'hash'         => $item['hashid'],
  306.                     'city'        => (!empty($item['adrcity']) && $item['adrcity']!='-' && $item['adrcity']!=' '?$item['adrcity']:$item['ecity']),
  307.                     'location'    => (!empty($item['adrname'])?$item['adrname']:$item['elocation']),
  308.                     'street'    => (!empty($item['adrstreet'])?$item['adrstreet']:$item['estreet']),
  309.                     'adrzip'    => (!empty($item['adrzip'])?$item['adrzip']:$item['ezip']),
  310.                     'country'    => (!empty($item['adrland'])?$item['adrland']:$item['eland']),
  311.                     'old'        => 0,
  312.                     'seolink'    => sprintf(Helper::generateSeoUrl($item['ename'], $item['adrcity'], $item['hashid']), $event->getAcount()->getDomain()),
  313.                     'link'         => 'http link zur veranstaltung',
  314.                 ];
  315.                 $n++;
  316.             }
  317.         }
  318.         $i=0;
  319.         $o=0;
  320.         unset($events$item);
  321.         if(count($resultEvents) < 4){
  322.             $subStmt $this->database->getConnection()->prepare(emain::GET_ALL_EVENTS);
  323.             $subStmt->bindValue(1$event->getAcount()->getId());
  324.             $subStmt->bindValue(2$event->getAddress()->getId());
  325.             $subStmt->bindValue(3$event->getAddress()->getId());
  326.             $subStmt->bindValue(4$event->getAddress()->getEmail());
  327.             $datemin = new DateTime();
  328.             $dateDiff = new DateInterval('P4Y');
  329.             $datemin->sub($dateDiff);
  330.             $subStmt->bindValue(5$datemin->format('Y.m.d H:i:s'));
  331.             $subResultSet $subStmt->executeQuery();
  332.             $events $subResultSet->fetchAllAssociative();
  333.             $i count($resultEvents);
  334.             $o 0;
  335.             if(count($events)>0){
  336.                 foreach($events as $item){
  337.                     if($i>5){
  338.                         continue;
  339.                     }
  340.                     $resultEvents[] = [
  341.                         'active'    => 0,
  342.                         'name'         => (strlen($item['ename']) > 35?substr($item['ename'], 0,35).'...':$item['ename']),
  343.                         'fullname'     => $item['ename'],
  344.                         'desc'         => $item['edesc'],
  345.                         'date'         => $item['edate'],
  346.                         'dateTo'     => $item['edateto'],
  347.                         'start'     => $item['etimestart'],
  348.                         'end'         => $item['etimeend'],
  349.                         'hash'         => $item['hashid'],
  350.                         'city'        => (!empty($item['adrcity']) && $item['adrcity']!='-' && $item['adrcity']!=' '?$item['adrcity']:$item['ecity']),
  351.                         'location'    => (!empty($item['adrname'])?$item['adrname']:$item['elocation']),
  352.                         'street'    => (!empty($item['adrstreet'])?$item['adrstreet']:$item['estreet']),
  353.                         'adrzip'    => (!empty($item['adrzip'])?$item['adrzip']:$item['ezip']),
  354.                         'country'    => (!empty($item['adrland'])?$item['adrland']:$item['eland']),
  355.                         'old'        => 1,
  356.                         'seolink'    => 'false',
  357.                         'link'         => 'http link zur veranstaltung',
  358.                     ];
  359.                     $i++;
  360.                     $o++;
  361.                 }
  362.             }
  363.         }
  364.         if($n && $o 1){
  365.             $eventMode self::TEMPLATE_NEW_EVENTS_ONLY;
  366.         }
  367.         if($n && $o 0){
  368.             $eventMode self::TEMPLATE_NEW_AND_OLD_EVENTS;
  369.         }
  370.         if($n && $o 0){
  371.             $eventMode self::TEMPLATE_OLD_EVENTS_ONLY;
  372.         }
  373.         if($n && $o 1){
  374.             $eventMode self::TEMPLATE_NO_EVENTS;
  375.         }
  376.         unset($events$item);
  377.         if(count($resultEvents) < 1){
  378.             $eventMode self::TEMPLATE_NO_EVENTS;
  379.         }
  380.         $replaceSet = [
  381.             'adressid'            => $event->getAddress()->getId(),
  382.             'name'                => $event->getAddress()->getName(),
  383.             'street'            => $event->getAddress()->getStreet(),
  384.             'city'                => $event->getAddress()->getCity(),
  385.             'extra1'            => $event->getAddress()->getExtra1(),
  386.             'extra2'            => $event->getAddress()->getExtra2(),
  387.             'extra3'            => $event->getAddress()->getExtra3(),
  388.             'extra4'            => $event->getAddress()->getExtra4(),
  389.             'email'                => $event->getAddress()->getEmail(),
  390.             'eventMode'            => $eventMode,
  391.             'teamname'            => $event->getAcount()->getName(),
  392.             'teamvorname'        => $event->getAcount()->getFirstName(),
  393.             'teamfirma'            => $event->getAcount()->getCompany(),
  394.             'teamstrasse'         => $event->getAcount()->getStreet(),
  395.             'teamplz'             => $event->getAcount()->getZipCode(),
  396.             'teamort'             => $event->getAcount()->getCity(),
  397.             'teamland'             => $event->getAcount()->getCountry(),
  398.             'sender'            => $event->getAcount()->getSmtpSelfReceive(),
  399.             'link'                 => $link,
  400.             'visibleLink'        => $visibleLink,
  401.             'linkUnsubscribe'     => 'https://rce-event.de/modules/meldung/optout.php?id='.$event->getAddress()->getId(),
  402.             'events'             => $resultEvents,
  403.             'eventCount'        => count($resultEvents),
  404.         ];
  405.         $event->addVerboseOutput('Mail Mode:'.$eventMode);
  406.         $subject $this->template->getTemplate()->getSubject();
  407.         if(!empty($subject)){
  408.             $subject $event->getAcount()->getBetreff();
  409.         }
  410.         $this->template->render($replaceSet$event$subject);
  411.     }
  412.     /**
  413.      * @param GrapperProcessEvent $event
  414.      * @return void
  415.      * @throws BaseException
  416.      */
  417.     public function sendEmail(GrapperProcessEvent $event):void
  418.     {
  419.         $event->addVerboseOutput('sending Email');
  420.         $this->mailer->initMailer($this->mailer->getDsn($event));
  421.         if(
  422.             !$event->getTemplate()->containsKey('subject')
  423.             ||
  424.             empty($event->getTemplate()->get('subject'))
  425.         ){
  426.             $event->stopPropagation();
  427.             $event->addVerboseOutput('html templateis empty for '.$event->getAddressId());
  428.             return;
  429.         }
  430.        $template $event->getTemplate();
  431.        $adrid $event->getAddress()->getId();
  432.       $event->addVerboseOutput('Customer: '.$event->getAcount()->getId().' Address ID: '.$adrid);
  433.        if(!filter_var($event->getAddress()->getEmail(), FILTER_VALIDATE_EMAIL)){
  434.            //disable Address as it fails
  435.            $stmt $this->database->getConnection()->prepare(eadr::DISABLE_EMAIL_SENDING_DUE_TO_ERROR);
  436.            $stmt->bindValue(1,$event->getCustomerId());
  437.            $stmt->bindValue(2,$event->getAddressId());
  438.            $stmt->executeQuery();
  439.            $event->addVerboseOutput('Due to an error within the email Adress the Addressid '.$event->getAddressId(). ' was disabled');
  440.            $event->stopPropagation();
  441.            return;
  442.        }
  443.        $blacklist $this->database->getData(blacklistEmail::class, blacklistEmail::CHECK_EMAIL_BLACKLIST, [$event->getAddress()->getEmail()]);
  444.        if(!empty($blacklist)){
  445.            $stmt $this->database->getConnection()->prepare(eadr::DISABLE_EMAIL_SENDING_DUE_TO_ERROR);
  446.            $stmt->bindValue(1,$event->getCustomerId());
  447.            $stmt->bindValue(2,$event->getAddressId());
  448.            $stmt->executeQuery();
  449.            $event->addVerboseOutput('The Address is Blacklisted '.$event->getAddressId(). ' so it was disabled');
  450.            $event->stopPropagation();
  451.            $event->addVerboseOutput('email address is blacklisted'.$event->getAddress()->getEmail());
  452.            return;
  453.        }
  454.         try{
  455.             //blacklist scann end
  456.             $email = new Email();
  457.             $receiver = [];
  458.             if(MailHandler::DEBUG_MODE 0){
  459.                 $i=0;
  460.                 foreach(MailHandler::DEBUG_EMAILS as $row){
  461.                     if($i===0){
  462.                         $receiver[] = $row;
  463.                         $email->to($row);
  464.                         $i++;
  465.                     }else{
  466.                         $receiver[] = $row;
  467.                         $email->addTo($row);
  468.                     }
  469.                 }
  470.             }else{
  471.                 $receiver[] = $event->getAddress()->getEmail();
  472.                 $email->to($event->getAddress()->getEmail());
  473.             }
  474.             $email->subject($event->getTemplate()->get('subject'));
  475.             if(!empty($event->getTemplate()->get('html'))){
  476.                 $email->html($event->getTemplate()->get('html'));
  477.             }
  478.            if(!empty($event->getTemplate()->get('text'))){
  479.                $email->text($event->getTemplate()->get('text'));
  480.            }
  481.            if(!empty($event->getAcount()->getSmtpSelfReceive())){
  482.                $email->addBcc($event->getAcount()->getSmtpSelfReceive());
  483.            }
  484.             if(MailHandler::FREE_MAILER_ENABLED && $event->getAcount()->getLizenz()->isFreeMailer()){
  485.                 $email->from(MailHandler::FREE_MAILER_USER);
  486.             }else{
  487.                 $email->from($event->getAcount()->getSender());
  488.             }
  489.             if(!empty($event->getAcount()->getReplyTo())){
  490.                 $email->addReplyTo($event->getAcount()->getReplyTo());
  491.             }else{
  492.                 $email->addReplyTo($event->getAcount()->getSender());
  493.             }
  494.             if(!empty($event->getAcount()->getSmtpSelfReceive())){
  495.                 $email->bcc($event->getAcount()->getSmtpSelfReceive());
  496.             }
  497.         }catch(RfcComplianceException $ex){
  498.             $event->addVerboseOutput($ex->getMessage());
  499.         }
  500.           $event->addVerboseOutput('email is sent');
  501.         if(MailHandler::DEBUG_SEND 0){
  502.             $event->addVerboseOutput($event->getAddress()->getEmail());
  503.         }else{
  504.             $event->addVerboseOutput('email sent');
  505.                 $this->mailer->getMailer()->send($email);
  506.         }
  507.         
  508.         $sql sprintf(grapperMailLog::LOG_MAIL_SENT$event->getAddress()->getEmail(), (int)$event->getAcount()->getId());
  509.         $stmt $this->database->getConnection()->prepare($sql);
  510.         $stmt->executeQuery();
  511.            $event->setSent(true);
  512.        if($event->getAcount()->getSendDelay() > 0){
  513.            //sleep($event->getAcount()->getSendDelay());
  514.        }
  515.          unset($transport$mailer$email$dsn$stmt);
  516.     }
  517.     /**
  518.      * @throws SyntaxError
  519.      * @throws RuntimeError
  520.      * @throws LoaderError
  521.      * @throws BaseException
  522.      */
  523.     public function sendEmailsToCustomer(GrapperQueueEvent $event):void{
  524.         $this->mailer->initMailer($this->mailer->initStatisticSender($event));
  525.         $email = new Email();
  526.         if(MailHandler::DEBUG_MODE 0){
  527.             $i=0;
  528.             foreach(MailHandler::DEBUG_EMAILS as $row){
  529.                 $email->addTo($row);
  530.             }
  531.         }else{
  532.             $email->addTo($event->getAcount()->getEmail());
  533.         }
  534.         if(!empty(MailHandler::DEFAULT_STATISTIC_RECEIVER))
  535.         {
  536.             $email->addTo(MailHandler::DEFAULT_STATISTIC_RECEIVER);
  537.         }
  538.         $email->from(MailHandler::STATISTICS_MAILER_USER);
  539.         $email->addReplyTo(MailHandler::DEFAULT_STATISTIC_SENDER);
  540.         $email->subject(MailHandler::STATISTICS_SUBJECT);
  541.         $loader = new ArrayLoader(
  542.             [
  543.                 'html.twig'=>file_get_contents(__DIR__.'/../../../templates/email.statistics.html.twig'),
  544.             ]
  545.         );
  546.         
  547.         $twig = new Environment($loader, [
  548.             'cache'=>__DIR__.'/../../../var/twig',
  549.         ]);
  550.         $stmt $this->database->getConnection()->prepare(grapperMailLog::LOG_MAIL_SENT_SUCCESSFULL);
  551.         $stmt->bindValue(1$event->getStartTime()->format('y.m.d H:i:s'));
  552.         $interval = new DateInterval('PT30S');
  553.         $currentTime = (new DateTime())->add($interval);
  554.         $stmt->bindValue(2$currentTime->format('y.m.d H:i:s'));
  555.         $result $stmt->executeQuery();
  556.         $resultArray $result->fetchAssociative();
  557.         $parameters = [
  558.             'sent' => $event->getAddresses()->toArray(),
  559.             'total' => $event->getAddresses()->count(),
  560.             'customer' => $event->getAcount(),
  561.             'sentCounter'=>$resultArray['cnt'],
  562.         ];
  563.         $html $twig->render('html.twig'$parameters);
  564.         $email->html($html);
  565.         try{
  566.             if(MailHandler::DEBUG_MODE === 0)
  567.             {
  568.                 $this->mailer->send($email);
  569.             }else{
  570.                 dump($parameters);
  571.             }
  572.         }catch (TransportExceptionInterface $ex){
  573.             $event->addVerboseOutput($ex->getMessage());
  574.         }catch(Exception $ex){
  575.             $event->addVerboseOutput($ex->getMessage());
  576.         }
  577.     }
  578. }