app/Plugin/NZMailSystem42/Event.php line 87

Open in your IDE?
  1. <?php
  2. namespace Plugin\NZMailSystem42;
  3. use Eccube\Service\MailService;
  4. use Eccube\Repository\OrderRepository;
  5. use Eccube\Repository\BaseInfoRepository;
  6. use Eccube\Repository\MailHistoryRepository;
  7. use Eccube\Repository\MailTemplateRepository;
  8. use Eccube\Repository\PaymentRepository;
  9. use Eccube\Entity\MailHistory;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\EventDispatcher\GenericEvent;
  13. use Twig\Environment;
  14. use Eccube\Common\EccubeConfig;
  15. use Symfony\Component\Mailer\MailerInterface;
  16. use Symfony\Component\Mime\Email;
  17. use Symfony\Component\Mime\Address;
  18. class Event implements EventSubscriberInterface
  19. {
  20.     private $mailService;
  21.     private $orderRepository;
  22.     private $baseInfoRepository;
  23.     private $mailHistoryRepository;
  24.     private $mailTemplateRepository;
  25.     private $paymentRepository;
  26.     private $entityManager;
  27.     private $twig;
  28.     private $eccubeConfig;
  29.     private $mailer;
  30.     public function __construct(
  31.         MailService $mailService,
  32.         OrderRepository $orderRepository,
  33.         BaseInfoRepository $baseInfoRepository,
  34.         MailHistoryRepository $mailHistoryRepository,
  35.         MailTemplateRepository $mailTemplateRepository,
  36.         PaymentRepository $paymentRepository,
  37.         EntityManagerInterface $entityManager,
  38.         Environment $twig,
  39.         EccubeConfig $eccubeConfig,
  40.         MailerInterface $mailer
  41.     ) {
  42.         $this->mailService $mailService;
  43.         $this->orderRepository $orderRepository;
  44.         $this->baseInfoRepository $baseInfoRepository;
  45.         $this->mailHistoryRepository $mailHistoryRepository;
  46.         $this->mailTemplateRepository $mailTemplateRepository;
  47.         $this->paymentRepository $paymentRepository;
  48.         $this->entityManager $entityManager;
  49.         $this->twig $twig;
  50.         $this->eccubeConfig $eccubeConfig;
  51.         $this->mailer $mailer;
  52.     }
  53.     public static function getSubscribedEvents()
  54.     {
  55.         return [
  56.             'nz.mail.payment.confirm' => 'onPaymentConfirm',
  57.             'nz.mail.payment.received' => 'onPaymentReceived',
  58.             'nz.mail.order.cancel' => 'onOrderCancel',
  59.             'nz.mail.payment.complete' => 'onPaymentComplete',
  60.             'nz.mail.test' => 'onTestMail',
  61.         ];
  62.     }
  63.     public function onPaymentConfirm(GenericEvent $event)
  64.     {
  65.         $Order $event->getArgument('Order');
  66.         $this->sendMail($Order'NZ決済確認メール');
  67.     }
  68.     public function onPaymentReceived(GenericEvent $event)
  69.     {
  70.         $Order $event->getArgument('Order');
  71.         $this->sendMail($Order'NZ入金確認済みメール');
  72.     }
  73.     public function onOrderCancel(GenericEvent $event)
  74.     {
  75.         $Order $event->getArgument('Order');
  76.         $this->sendMail($Order'NZキャンセルメール');
  77.     }
  78.     public function onPaymentComplete(GenericEvent $event)
  79.     {
  80.         $Order $event->getArgument('Order');
  81.         $this->sendMail($Order'NZ決済完了メール');
  82.     }
  83.     public function onTestMail(GenericEvent $event)
  84.     {
  85.         $Order $event->getArgument('Order');
  86.         $mailType $event->getArgument('mail_type');
  87.         
  88.         $templateNames = [
  89.             'payment_complete' => 'NZ決済完了メール',
  90.             'payment_confirm' => 'NZ決済確認メール',
  91.             'payment_received' => 'NZ入金確認済みメール',
  92.             'order_cancel' => 'NZキャンセルメール',
  93.         ];
  94.         
  95.         $templateName $templateNames[$mailType] ?? 'NZ決済完了メール';
  96.         $this->sendMail($Order$templateName);
  97.     }
  98.     private function sendMail($Order$templateName)
  99.     {
  100.         try {
  101.             $BaseInfo $this->baseInfoRepository->get();
  102.             $Customer $Order->getCustomer();
  103.             
  104.             $MailTemplate $this->mailTemplateRepository->findOneBy(['name' => $templateName]);
  105.             
  106.             if (!$MailTemplate) {
  107.                 throw new \Exception("メールテンプレート '{$templateName}' が見つかりません");
  108.             }
  109.             
  110.             $subject $this->twig->createTemplate($MailTemplate->getMailSubject())->render([
  111.                 'Order' => $Order,
  112.                 'Customer' => $Customer,
  113.                 'BaseInfo' => $BaseInfo,
  114.             ]);
  115.             
  116.             $body $this->twig->render($MailTemplate->getFileName(), [
  117.                 'Order' => $Order,
  118.                 'Customer' => $Customer,
  119.                 'BaseInfo' => $BaseInfo,
  120.             ]);
  121.             
  122.             $message = (new Email())
  123.                 ->from(new Address($BaseInfo->getEmail01(), $BaseInfo->getShopName()))
  124.                 ->to($Customer->getEmail())
  125.                 ->bcc($BaseInfo->getEmail01())
  126.                 ->replyTo($BaseInfo->getEmail03())
  127.                 ->subject($subject)
  128.                 ->text($body);
  129.             
  130.             $this->mailer->send($message);
  131.             
  132.             $this->saveMailHistory($Order$subject$body);
  133.             
  134.             log_info('NZMailSystem42: メール送信完了', [
  135.                 'template' => $templateName,
  136.                 'order_id' => $Order->getId(),
  137.                 'order_no' => $Order->getOrderNo(),
  138.                 'customer_email' => $Customer->getEmail()
  139.             ]);
  140.             
  141.         } catch (\Exception $e) {
  142.             log_error('NZMailSystem42: メール送信エラー', [
  143.                 'template' => $templateName,
  144.                 'order_id' => $Order->getId(),
  145.                 'error' => $e->getMessage()
  146.             ]);
  147.             throw $e;
  148.         }
  149.     }
  150.     private function saveMailHistory($Order$mailSubject$mailBody)
  151.     {
  152.         try {
  153.             $MailHistory = new MailHistory();
  154.             $MailHistory->setOrder($Order);
  155.             $MailHistory->setSendDate(new \DateTime());
  156.             $MailHistory->setMailSubject($mailSubject);
  157.             $MailHistory->setMailBody($mailBody);
  158.             
  159.             $this->entityManager->persist($MailHistory);
  160.             $this->entityManager->flush();
  161.             
  162.         } catch (\Exception $e) {
  163.             log_error('NZMailSystem42: メール履歴保存エラー', [
  164.                 'order_id' => $Order->getId(),
  165.                 'error' => $e->getMessage()
  166.             ]);
  167.         }
  168.     }
  169. }