Completed
Push — 4.0 ( 87d096...bcc1be )
by Kiyotaka
05:44 queued 11s
created

src/Eccube/Service/MailService.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/*
4
 * This file is part of EC-CUBE
5
 *
6
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
7
 *
8
 * http://www.ec-cube.co.jp/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Eccube\Service;
15
16
use Eccube\Common\EccubeConfig;
17
use Eccube\Entity\BaseInfo;
18
use Eccube\Entity\Customer;
19
use Eccube\Entity\MailHistory;
20
use Eccube\Entity\MailTemplate;
21
use Eccube\Entity\Order;
22
use Eccube\Entity\OrderItem;
23
use Eccube\Entity\Shipping;
24
use Eccube\Event\EccubeEvents;
25
use Eccube\Event\EventArgs;
26
use Eccube\Repository\BaseInfoRepository;
27
use Eccube\Repository\MailHistoryRepository;
28
use Eccube\Repository\MailTemplateRepository;
29
use Symfony\Component\EventDispatcher\EventDispatcher;
30
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
31
32
class MailService
33
{
34
    /**
35
     * @var \Swift_Mailer
36
     */
37
    protected $mailer;
38
39
    /**
40
     * @var MailTemplateRepository
41
     */
42
    protected $mailTemplateRepository;
43
44
    /**
45
     * @var MailHistoryRepository
46
     */
47
    private $mailHistoryRepository;
48
49
    /**
50
     * @var EventDispatcher
51
     */
52
    protected $eventDispatcher;
53
54
    /**
55
     * @var BaseInfo
56
     */
57
    protected $BaseInfo;
58
59
    /**
60
     * @var EccubeConfig
61
     */
62
    protected $eccubeConfig;
63
64
    /**
65
     * @var \Twig_Environment
66
     */
67
    protected $twig;
68
69
    /**
70
     * MailService constructor.
71
     *
72
     * @param \Swift_Mailer $mailer
73
     * @param MailTemplateRepository $mailTemplateRepository
74
     * @param MailHistoryRepository $mailHistoryRepository
75
     * @param BaseInfoRepository $baseInfoRepository
76
     * @param EventDispatcherInterface $eventDispatcher
77
     * @param \Twig_Environment $twig
78
     * @param EccubeConfig $eccubeConfig
79
     */
80 140
    public function __construct(
81
        \Swift_Mailer $mailer,
82
        MailTemplateRepository $mailTemplateRepository,
83
        MailHistoryRepository $mailHistoryRepository,
84
        BaseInfoRepository $baseInfoRepository,
85
        EventDispatcherInterface $eventDispatcher,
86
        \Twig_Environment $twig,
87
        EccubeConfig $eccubeConfig
88
    ) {
89 140
        $this->mailer = $mailer;
90 140
        $this->mailTemplateRepository = $mailTemplateRepository;
91 140
        $this->mailHistoryRepository = $mailHistoryRepository;
92 140
        $this->BaseInfo = $baseInfoRepository->get();
93 140
        $this->eventDispatcher = $eventDispatcher;
94 140
        $this->eccubeConfig = $eccubeConfig;
95 140
        $this->twig = $twig;
96
    }
97
98
    /**
99
     * Send customer confirm mail.
100
     *
101
     * @param $Customer 会員情報
102
     * @param string $activateUrl アクティベート用url
103
     */
104 2 View Code Duplication
    public function sendCustomerConfirmMail(\Eccube\Entity\Customer $Customer, $activateUrl)
105
    {
106 2
        log_info('仮会員登録メール送信開始');
107
108 2
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_entry_confirm_mail_template_id']);
109
110 2
        $body = $this->twig->render($MailTemplate->getFileName(), [
111 2
            'Customer' => $Customer,
112 2
            'BaseInfo' => $this->BaseInfo,
113 2
            'activateUrl' => $activateUrl,
114 2
        ]);
115 2
116
        $message = (new \Swift_Message())
117
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
118 2
            ->setFrom([$this->BaseInfo->getEmail01() => $this->BaseInfo->getShopName()])
119 2
            ->setTo([$Customer->getEmail()])
120 2
            ->setBcc($this->BaseInfo->getEmail01())
121 2
            ->setReplyTo($this->BaseInfo->getEmail03())
122 2
            ->setReturnPath($this->BaseInfo->getEmail04());
123 2
124 2
        // HTMLテンプレートが存在する場合
125 2
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
126
        if (!is_null($htmlFileName)) {
127 2
            $htmlBody = $this->twig->render($htmlFileName, [
128
                'Customer' => $Customer,
129 2
                'BaseInfo' => $this->BaseInfo,
130 2
                'activateUrl' => $activateUrl,
131 2
            ]);
132 2
133
            $message
134 2
                ->setContentType('text/plain; charset=UTF-8')
135
                ->setBody($body, 'text/plain')
136 2
                ->addPart($htmlBody, 'text/html');
137
        } else {
138 2
            $message->setBody($body);
139
        }
140 2
141
        $event = new EventArgs(
142 2
            [
143
                'message' => $message,
144
                'Customer' => $Customer,
145
                'BaseInfo' => $this->BaseInfo,
146
                'activateUrl' => $activateUrl,
147
            ],
148
            null
149
        );
150 2
        $this->eventDispatcher->dispatch(EccubeEvents::MAIL_CUSTOMER_CONFIRM, $event);
151
152 2
        $count = $this->mailer->send($message, $failures);
153
154 2
        log_info('仮会員登録メール送信完了', ['count' => $count]);
155
156 2
        return $count;
157 2
    }
158 2
159 2
    /**
160 2
     * Send customer complete mail.
161
     *
162
     * @param $Customer 会員情報
163 2
     */
164 2 View Code Duplication
    public function sendCustomerCompleteMail(\Eccube\Entity\Customer $Customer)
165 2
    {
166 2
        log_info('会員登録完了メール送信開始');
167 2
168 2
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_entry_complete_mail_template_id']);
169 2
170 2
        $body = $this->twig->render($MailTemplate->getFileName(), [
171
            'Customer' => $Customer,
172 2
            'BaseInfo' => $this->BaseInfo,
173
        ]);
174 2
175 2
        $message = (new \Swift_Message())
176 2
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
177
            ->setFrom([$this->BaseInfo->getEmail01() => $this->BaseInfo->getShopName()])
178 2
            ->setTo([$Customer->getEmail()])
179
            ->setBcc($this->BaseInfo->getEmail01())
180 2
            ->setReplyTo($this->BaseInfo->getEmail03())
181
            ->setReturnPath($this->BaseInfo->getEmail04());
182 2
183
        // HTMLテンプレートが存在する場合
184 2
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
185
        if (!is_null($htmlFileName)) {
186 2
            $htmlBody = $this->twig->render($htmlFileName, [
187
                'Customer' => $Customer,
188
                'BaseInfo' => $this->BaseInfo,
189
            ]);
190
191
            $message
192
                ->setContentType('text/plain; charset=UTF-8')
193
                ->setBody($body, 'text/plain')
194
                ->addPart($htmlBody, 'text/html');
195 2
        } else {
196
            $message->setBody($body);
197 2
        }
198
199 2
        $event = new EventArgs(
200
            [
201 2
                'message' => $message,
202 2
                'Customer' => $Customer,
203 2
                'BaseInfo' => $this->BaseInfo,
204 2
            ],
205 2
            null
206
        );
207
        $this->eventDispatcher->dispatch(EccubeEvents::MAIL_CUSTOMER_COMPLETE, $event);
208 2
209 2
        $count = $this->mailer->send($message);
210 2
211 2
        log_info('会員登録完了メール送信完了', ['count' => $count]);
212 2
213 2
        return $count;
214 2
    }
215 2
216
    /**
217 2
     * Send withdraw mail.
218
     *
219 2
     * @param $Customer Customer
220 2
     * @param $email string
221 2
     */
222 2 View Code Duplication
    public function sendCustomerWithdrawMail(Customer $Customer, string $email)
223
    {
224 2
        log_info('退会手続き完了メール送信開始');
225
226 2
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_customer_withdraw_mail_template_id']);
227
228 2
        $body = $this->twig->render($MailTemplate->getFileName(), [
229
            'Customer' => $Customer,
230 2
            'BaseInfo' => $this->BaseInfo,
231
        ]);
232 2
233
        $message = (new \Swift_Message())
234
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
235
            ->setFrom([$this->BaseInfo->getEmail01() => $this->BaseInfo->getShopName()])
236
            ->setTo([$email])
237
            ->setBcc($this->BaseInfo->getEmail01())
238
            ->setReplyTo($this->BaseInfo->getEmail03())
239
            ->setReturnPath($this->BaseInfo->getEmail04());
240 4
241
        // HTMLテンプレートが存在する場合
242 4
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
243
        if (!is_null($htmlFileName)) {
244 4
            $htmlBody = $this->twig->render($htmlFileName, [
245
                'Customer' => $Customer,
246 4
                'BaseInfo' => $this->BaseInfo,
247 4
            ]);
248 4
249 4
            $message
250 4
                ->setContentType('text/plain; charset=UTF-8')
251
                ->setBody($body, 'text/plain')
252
                ->addPart($htmlBody, 'text/html');
253
        } else {
254 4
            $message->setBody($body);
255 4
        }
256 4
257 4
        $event = new EventArgs(
258 4
            [
259 4
                'message' => $message,
260 4
                'Customer' => $Customer,
261 4
                'BaseInfo' => $this->BaseInfo,
262
                'email' => $email,
263 4
            ],
264
            null
265 4
        );
266 4
        $this->eventDispatcher->dispatch(EccubeEvents::MAIL_CUSTOMER_WITHDRAW, $event);
267 4
268
        $count = $this->mailer->send($message);
269 4
270
        log_info('退会手続き完了メール送信完了', ['count' => $count]);
271 4
272
        return $count;
273 4
    }
274
275 4
    /**
276
     * Send contact mail.
277 4
     *
278
     * @param $formData お問い合わせ内容
279
     */
280 View Code Duplication
    public function sendContactMail($formData)
281
    {
282
        log_info('お問い合わせ受付メール送信開始');
283
284
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_contact_mail_template_id']);
285
286
        $body = $this->twig->render($MailTemplate->getFileName(), [
287
            'data' => $formData,
288
            'BaseInfo' => $this->BaseInfo,
289
        ]);
290
291
        // 問い合わせ者にメール送信
292
        $message = (new \Swift_Message())
293
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
294
            ->setFrom([$this->BaseInfo->getEmail02() => $this->BaseInfo->getShopName()])
295
            ->setTo([$formData['email']])
296
            ->setBcc($this->BaseInfo->getEmail02())
297
            ->setReplyTo($this->BaseInfo->getEmail02())
298
            ->setReturnPath($this->BaseInfo->getEmail04());
299
300
        // HTMLテンプレートが存在する場合
301 7
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
302
        if (!is_null($htmlFileName)) {
303 7
            $htmlBody = $this->twig->render($htmlFileName, [
304
                'data' => $formData,
305 7
                'BaseInfo' => $this->BaseInfo,
306
            ]);
307 7
308 7
            $message
309 7
                ->setContentType('text/plain; charset=UTF-8')
310 7
                ->setBody($body, 'text/plain')
311
                ->addPart($htmlBody, 'text/html');
312
        } else {
313 7
            $message->setBody($body);
314 7
        }
315 7
316 7
        $event = new EventArgs(
317 7
            [
318 7
                'message' => $message,
319 7
                'formData' => $formData,
320 7
                'BaseInfo' => $this->BaseInfo,
321
            ],
322 7
            null
323
        );
324 7
        $this->eventDispatcher->dispatch(EccubeEvents::MAIL_CONTACT, $event);
325 7
326 7
        $count = $this->mailer->send($message);
327 7
328
        log_info('お問い合わせ受付メール送信完了', ['count' => $count]);
329 7
330
        return $count;
331 7
    }
332
333 7
    /**
334
     * Send order mail.
335 7
     *
336
     * @param \Eccube\Entity\Order $Order 受注情報
337 7
     *
338
     * @return \Swift_Message
339
     */
340
    public function sendOrderMail(\Eccube\Entity\Order $Order)
341
    {
342
        log_info('受注メール送信開始');
343
344
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_order_mail_template_id']);
345
346 2
        $body = $this->twig->render($MailTemplate->getFileName(), [
347
            'Order' => $Order,
348 2
        ]);
349
350
        $message = (new \Swift_Message())
351 2
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
352
            ->setFrom([$this->BaseInfo->getEmail01() => $this->BaseInfo->getShopName()])
353 2
            ->setTo([$Order->getEmail()])
354 2
            ->setBcc($this->BaseInfo->getEmail01())
355 2
            ->setReplyTo($this->BaseInfo->getEmail03())
356 2
            ->setReturnPath($this->BaseInfo->getEmail04());
357 2
358 2
        // HTMLテンプレートが存在する場合
359
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
360
        if (!is_null($htmlFileName)) {
361 2
            $htmlBody = $this->twig->render($htmlFileName, [
362 2
                'Order' => $Order,
363 2
            ]);
364 2
365 2
            $message
366 2
                ->setContentType('text/plain; charset=UTF-8')
367 2
                ->setBody($body, 'text/plain')
368 2
                ->addPart($htmlBody, 'text/html');
369
        } else {
370 2
            $message->setBody($body);
371
        }
372 2
373 2
        $event = new EventArgs(
374 2
            [
375 2
                'message' => $message,
376
                'Order' => $Order,
377 2
                'MailTemplate' => $MailTemplate,
378
                'BaseInfo' => $this->BaseInfo,
379 2
            ],
380
            null
381 2
        );
382
        $this->eventDispatcher->dispatch(EccubeEvents::MAIL_ORDER, $event);
383 2
384
        $count = $this->mailer->send($message);
385 2
386
        $MailHistory = new MailHistory();
387
        $MailHistory->setMailSubject($message->getSubject())
388
            ->setMailBody($message->getBody())
389
            ->setOrder($Order)
390
            ->setSendDate(new \DateTime());
391
392
        // HTML用メールの設定
393
        $multipart = $message->getChildren();
394
        if (count($multipart) > 0) {
395
            $MailHistory->setMailHtmlBody($multipart[0]->getBody());
396
        }
397
398
        $this->mailHistoryRepository->save($MailHistory);
399
400
        log_info('受注メール送信完了', ['count' => $count]);
401 3
402
        return $message;
403 3
    }
404
405 3
    /**
406 3
     * Send admin customer confirm mail.
407 3
     *
408 3
     * @param $Customer 会員情報
409
     * @param string $activateUrl アクティベート用url
410
     */
411 3 View Code Duplication
    public function sendAdminCustomerConfirmMail(\Eccube\Entity\Customer $Customer, $activateUrl)
412 3
    {
413 3
        log_info('仮会員登録再送メール送信開始');
414 3
415 3
        /* @var $MailTemplate \Eccube\Entity\MailTemplate */
416 3
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_entry_confirm_mail_template_id']);
417 3
418 3
        $body = $this->twig->render($MailTemplate->getFileName(), [
419
            'BaseInfo' => $this->BaseInfo,
420 3
            'Customer' => $Customer,
421
            'activateUrl' => $activateUrl,
422 3
        ]);
423 3
424 3
        $message = (new \Swift_Message())
425 3
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
426
            ->setFrom([$this->BaseInfo->getEmail03() => $this->BaseInfo->getShopName()])
427 3
            ->setTo([$Customer->getEmail()])
428
            ->setBcc($this->BaseInfo->getEmail01())
429 3
            ->setReplyTo($this->BaseInfo->getEmail03())
430
            ->setReturnPath($this->BaseInfo->getEmail04());
431 3
432
        // HTMLテンプレートが存在する場合
433 3
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
434
        if (!is_null($htmlFileName)) {
435 3
            $htmlBody = $this->twig->render($htmlFileName, [
436
                'BaseInfo' => $this->BaseInfo,
437
                'Customer' => $Customer,
438
                'activateUrl' => $activateUrl,
439
            ]);
440
441
            $message
442
                ->setContentType('text/plain; charset=UTF-8')
443
                ->setBody($body, 'text/plain')
444 1
                ->addPart($htmlBody, 'text/html');
445
        } else {
446 1
            $message->setBody($body);
447
        }
448 1
449 1
        $event = new EventArgs(
450 1
            [
451 1
                'message' => $message,
452 1
                'Customer' => $Customer,
453 1
                'BaseInfo' => $this->BaseInfo,
454 1
                'activateUrl' => $activateUrl,
455 1
            ],
456
            null
457
        );
458 1
        $this->eventDispatcher->dispatch(EccubeEvents::MAIL_ADMIN_CUSTOMER_CONFIRM, $event);
459 1
460 1
        $count = $this->mailer->send($message);
461 1
462 1
        log_info('仮会員登録再送メール送信完了', ['count' => $count]);
463 1
464 1
        return $count;
465 1
    }
466
467 1
    /**
468
     * Send admin order mail.
469 1
     *
470 1
     * @param Order $Order 受注情報
471 1
     * @param $formData 入力内容
472 1
     *
473
     * @return \Swift_Message
474 1
     *
475
     * @throws \Twig_Error_Loader
476 1
     * @throws \Twig_Error_Runtime
477
     * @throws \Twig_Error_Syntax
478 1
     */
479
    public function sendAdminOrderMail(Order $Order, $formData)
480 1
    {
481
        log_info('受注管理通知メール送信開始');
482 1
483
        $message = (new \Swift_Message())
484
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$formData['mail_subject'])
485
            ->setFrom([$this->BaseInfo->getEmail01() => $this->BaseInfo->getShopName()])
486
            ->setTo([$Order->getEmail()])
487
            ->setBcc($this->BaseInfo->getEmail01())
488
            ->setReplyTo($this->BaseInfo->getEmail03())
489
            ->setReturnPath($this->BaseInfo->getEmail04())
490
            ->setBody($formData['tpl_data']);
491 1
492
        $event = new EventArgs(
493 1
            [
494
                'message' => $message,
495 1
                'Order' => $Order,
496
                'formData' => $formData,
497 1
                'BaseInfo' => $this->BaseInfo,
498 1
            ],
499 1
            null
500 1
        );
501 1
        $this->eventDispatcher->dispatch(EccubeEvents::MAIL_ADMIN_ORDER, $event);
502 1
503
        $count = $this->mailer->send($message);
504
505 1
        log_info('受注管理通知メール送信完了', ['count' => $count]);
506 1
507 1
        return $message;
508 1
    }
509 1
510 1
    /**
511 1
     * Send password reset notification mail.
512 1
     *
513
     * @param $Customer 会員情報
514 1
     * @param string $reset_url
515
     */
516 1
    public function sendPasswordResetNotificationMail(\Eccube\Entity\Customer $Customer, $reset_url)
517 1
    {
518 1
        log_info('パスワード再発行メール送信開始');
519 1
520
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_forgot_mail_template_id']);
521 1
        $body = $this->twig->render($MailTemplate->getFileName(), [
522
            'BaseInfo' => $this->BaseInfo,
523 1
            'Customer' => $Customer,
524
            'expire' => $this->eccubeConfig['eccube_customer_reset_expire'],
525 1
            'reset_url' => $reset_url,
526
        ]);
527 1
528
        $message = (new \Swift_Message())
529 1
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
530
            ->setFrom([$this->BaseInfo->getEmail01() => $this->BaseInfo->getShopName()])
531
            ->setTo([$Customer->getEmail()])
532
            ->setReplyTo($this->BaseInfo->getEmail03())
533
            ->setReturnPath($this->BaseInfo->getEmail04());
534
535
        // HTMLテンプレートが存在する場合
536
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
537
        if (!is_null($htmlFileName)) {
538
            $htmlBody = $this->twig->render($htmlFileName, [
539
                'BaseInfo' => $this->BaseInfo,
540
                'Customer' => $Customer,
541
                'expire' => $this->eccubeConfig['eccube_customer_reset_expire'],
542
                'reset_url' => $reset_url,
543
            ]);
544
545
            $message
546
                ->setContentType('text/plain; charset=UTF-8')
547
                ->setBody($body, 'text/plain')
548
                ->addPart($htmlBody, 'text/html');
549
        } else {
550
            $message->setBody($body);
551
        }
552
553
        $event = new EventArgs(
554
            [
555
                'message' => $message,
556
                'Customer' => $Customer,
557
                'BaseInfo' => $this->BaseInfo,
558
                'resetUrl' => $reset_url,
559
            ],
560
            null
561
        );
562
        $this->eventDispatcher->dispatch(EccubeEvents::MAIL_PASSWORD_RESET, $event);
563
564
        $count = $this->mailer->send($message);
565
566
        log_info('パスワード再発行メール送信完了', ['count' => $count]);
567 4
568
        return $count;
569 4
    }
570
571 4
    /**
572
     * Send password reset notification mail.
573
     *
574 4
     * @param $Customer 会員情報
575 4
     * @param string $password
576 4
     */
577 4 View Code Duplication
    public function sendPasswordResetCompleteMail(\Eccube\Entity\Customer $Customer, $password)
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
578 4
    {
579 4
        log_info('パスワード変更完了メール送信開始');
580 4
581 4
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_reset_complete_mail_template_id']);
582 4
583
        $body = $this->twig->render($MailTemplate->getFileName(), [
584 4
            'BaseInfo' => $this->BaseInfo,
585
            'Customer' => $Customer,
586 4
            'password' => $password,
587 4
        ]);
588 4
589 4
        $message = (new \Swift_Message())
590 4
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
591
            ->setFrom([$this->BaseInfo->getEmail01() => $this->BaseInfo->getShopName()])
592 4
            ->setTo([$Customer->getEmail()])
593
            ->setBcc($this->BaseInfo->getEmail01())
594 4
            ->setReplyTo($this->BaseInfo->getEmail03())
595
            ->setReturnPath($this->BaseInfo->getEmail04());
596
597
        // HTMLテンプレートが存在する場合
598
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
599
        if (!is_null($htmlFileName)) {
600
            $htmlBody = $this->twig->render($htmlFileName, [
601
                'BaseInfo' => $this->BaseInfo,
602
                'Customer' => $Customer,
603
                'password' => $password,
604
            ]);
605
606
            $message
607
                ->setContentType('text/plain; charset=UTF-8')
608 4
                ->setBody($body, 'text/plain')
609 4
                ->addPart($htmlBody, 'text/html');
610 4
        } else {
611
            $message->setBody($body);
612
        }
613 4
614
        $event = new EventArgs(
615 4
            [
616 4
                'message' => $message,
617 4
                'Customer' => $Customer,
618 4
                'BaseInfo' => $this->BaseInfo,
619 4
                'password' => $password,
620
            ],
621
            null
622
        );
623
        $this->eventDispatcher->dispatch(EccubeEvents::MAIL_PASSWORD_RESET_COMPLETE, $event);
624
625
        $count = $this->mailer->send($message);
626
627
        log_info('パスワード変更完了メール送信完了', ['count' => $count]);
628
629
        return $count;
630
    }
631
632
    /**
633
     * 発送通知メールを送信する.
634
     * 発送通知メールは受注ごとに送られる
635
     *
636
     * @param Shipping $Shipping
637
     *
638
     * @throws \Twig_Error
639
     */
640
    public function sendShippingNotifyMail(Shipping $Shipping)
641
    {
642
        log_info('出荷通知メール送信処理開始', ['id' => $Shipping->getId()]);
643
644
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_shipping_notify_mail_template_id']);
645
646
        /** @var Order $Order */
647
        $Order = $Shipping->getOrder();
648
        $body = $this->getShippingNotifyMailBody($Shipping, $Order, $MailTemplate->getFileName());
649
650
        $message = (new \Swift_Message())
651
            ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
652
            ->setFrom([$this->BaseInfo->getEmail01() => $this->BaseInfo->getShopName()])
653
            ->setTo($Order->getEmail())
654
            ->setBcc($this->BaseInfo->getEmail01())
655
            ->setReplyTo($this->BaseInfo->getEmail03())
656
            ->setReturnPath($this->BaseInfo->getEmail04());
657
658
        // HTMLテンプレートが存在する場合
659
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
660
        if (!is_null($htmlFileName)) {
661
            $htmlBody = $this->getShippingNotifyMailBody($Shipping, $Order, $htmlFileName, true);
662
663
            $message
664
                ->setContentType('text/plain; charset=UTF-8')
665
                ->setBody($body, 'text/plain')
666
                ->addPart($htmlBody, 'text/html');
667
        } else {
668
            $message->setBody($body);
669
        }
670
671
        $this->mailer->send($message);
672
673
        $MailHistory = new MailHistory();
674
        $MailHistory->setMailSubject($message->getSubject())
675
                ->setMailBody($message->getBody())
676
                ->setOrder($Order)
677
                ->setSendDate(new \DateTime());
678
679
        // HTML用メールの設定
680
        $multipart = $message->getChildren();
681
        if (count($multipart) > 0) {
682
            $MailHistory->setMailHtmlBody($multipart[0]->getBody());
683
        }
684
685
        $this->mailHistoryRepository->save($MailHistory);
686
687
        log_info('出荷通知メール送信処理完了', ['id' => $Shipping->getId()]);
688
    }
689
690
    /**
691
     * @param Shipping $Shipping
692
     * @param Order $Order
693
     * @param string|null $templateName
694
     * @param boolean $is_html
695
     *
696
     * @return string
697
     *
698
     * @throws \Twig_Error
699
     */
700
    public function getShippingNotifyMailBody(Shipping $Shipping, Order $Order, $templateName = null, $is_html = false)
701
    {
702
        $ShippingItems = array_filter($Shipping->getOrderItems()->toArray(), function (OrderItem $OrderItem) use ($Order) {
703
            return $OrderItem->getOrderId() === $Order->getId();
704
        });
705
706
        if (is_null($templateName)) {
707
            /** @var MailTemplate $MailTemplate */
708
            $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_shipping_notify_mail_template_id']);
709
            $fileName = $MailTemplate->getFileName();
710
        } else {
711
            $fileName = $templateName;
712
        }
713
714
        if ($is_html) {
715
            $htmlFileName = $this->getHtmlTemplate($fileName);
716
            $fileName = !is_null($htmlFileName) ? $htmlFileName : $fileName;
717
        }
718
719
        return $this->twig->render($fileName, [
720
            'Shipping' => $Shipping,
721
            'ShippingItems' => $ShippingItems,
722
            'Order' => $Order,
723
        ]);
724
    }
725
726
    /**
727
     * [getHtmlTemplate description]
728
     *
729
     * @param  string $templateName  プレーンテキストメールのファイル名
730
     *
731
     * @return string|null  存在する場合はファイル名を返す
732
     */
733
    public function getHtmlTemplate($templateName)
734
    {
735
        // メールテンプレート名からHTMLメール用テンプレート名を生成
736
        $fileName = explode('.', $templateName);
737
        $suffix = '.html';
738
        $htmlFileName = $fileName[0].$suffix.'.'.$fileName[1];
739
740
        // HTMLメール用テンプレートの存在チェック
741
        if ($this->twig->getLoader()->exists($htmlFileName)) {
742
            return $htmlFileName;
743
        } else {
744
            return null;
745
        }
746
    }
747
}
748