【EC-CUBE 4】自動送信されるメールテンプレートを変更する方法

この記事では、商品注文時や会員登録時などに自動送信されるメールテンプレートを変更する方法を紹介します。

デフォルトのテンプレート内容を変更することは、EC-CUBE管理画面から簡単に編集できます。
が、新しく用意したテンプレートなど、テンプレート自体を別のものに変更するには、サーバー上のServiceと呼ばれるファイルを修正する必要があります。

開発前にデバッグモードの設定をお薦めします

デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については 以下記事 で解説しています。

カスタマイズ後は、デバッグモードの解除を忘れないように。

【動作環境】
EC CUBEのバージョン:4.3.0
サーバー:XServer

目次

実装後の状態

事前に、『注文受付メール2』というテンプレートを1つ追加しておきます。
※メールテンプレートの増やし方は以下記事にて紹介しています。

新規追加したメールテンプレート
冒頭に「※これは新しく用意したテンプレートです。」という一文を追加しておきます。

商品を注文した際に自動送信されるメールを、このテンプレートに変更します。
(デフォルトでは『注文受付メール』が自動送信されます。)

自動送信された新規テンプレートのメール

新しいテンプレートに追加した一文が表示されており、送信メールが変更されています。

ちなみに、『出荷通知メール』や『問合受付メール』を設定することもできます。
(注文時に送る内容ではないので、実用的ではありませんが。)

実装の手順

STEP

『eccube.yaml』の修正

「app/config/eccube/package」下にある『eccube.yaml』に、新しく追加したメールテンプレート情報を追記します。

110~120行目付近より、メールテンプレート名とidを紐づける情報が記載されているので、こちらに追加したいテンプレート名(自由に決めてOK)とidを追記します。

eccube_order_mail_template_id: 1 #注文受付メール
eccube_entry_confirm_mail_template_id: 2 #会員仮登録メール
eccube_entry_complete_mail_template_id: 3 #会員本登録メール
eccube_customer_withdraw_mail_template_id: 4 #会員退会メール
eccube_contact_mail_template_id: 5 #問合受付メール
eccube_forgot_mail_template_id: 6 #パスワードリセット
eccube_reset_complete_mail_template_id: 7 #パスワードリマインダー
eccube_shipping_notify_mail_template_id: 8 #出荷通知メール

#追加したメールテンプレート
my_order_mail_template_id: 9 #出荷通知メール2
STEP

『MailService.php』の修正 or Customizeディレクトリに新規作成

メール送信に関するコードが記述されているServiceファイルを修正します。
「src/Eccube/Service」下にある『MailService.php』に、メールの自動送信に関するコードが記述されています。

注文時のメール送信は、sendOrderMail()で定義されており、このメソッドにある変数$MailTemplateに自動送信したいテンプレートを代入します。

具体的には、mailTemplateRepositoryfind()メソッドの引数に、代入したいテンプレートのidを渡します。デフォルトではeccubeConfig['eccube_order_mail_template_id'] となっているので、[]内をSTEP 1で設定したテンプレート名(本例では'my_order_mail_template_id')に書き換えます。(以下にコード修正後の『MailService.php』の一部を掲載します。)

/**
 * Send order mail.
 *
 * @param \Eccube\Entity\Order $Order 受注情報
 *
 * @return \Swift_Message
 */
public function sendOrderMail(Order $Order)
{
log_info('受注メール送信開始');

// デフォルトのコード
// $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_order_mail_template_id']);

// 修正コード
$MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['my_order_mail_template_id']);

$body = $this->twig->render($MailTemplate->getFileName(), [
    'Order' => $Order,
]);

$message = (new \Swift_Message())
    ->setSubject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
    ->setFrom([$this->BaseInfo->getEmail01() => $this->BaseInfo->getShopName()])
    ->setTo([$Order->getEmail()])
    ->setBcc($this->BaseInfo->getEmail01())
    ->setReplyTo($this->BaseInfo->getEmail03())
    ->setReturnPath($this->BaseInfo->getEmail04());

デフォルトのServiceファイルを触らないでおきたい場合、Customizeディレクトリに『MailService.php』を複製し、sendOrderMail()をオーバーライドすることもできます。(修正するファイルやコードが増えますが、EC-CUBEのバージョンアップに強くなるのでこちらがお薦めです。)

STEP

app/Customize/Service に MailService.phpを作成する

以下コードを記載した MailService.php をアップします。

<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Customize\Service;

use Doctrine\ORM\NonUniqueResultException;
use Eccube\Common\EccubeConfig;
use Eccube\Entity\BaseInfo;
use Eccube\Entity\Customer;
use Eccube\Entity\MailHistory;
use Eccube\Entity\MailTemplate;
use Eccube\Entity\Order;
use Eccube\Entity\OrderItem;
use Eccube\Entity\Shipping;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\MailHistoryRepository;
use Eccube\Repository\MailTemplateRepository;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
use Eccube\Service\MailService as BaseMailService;

class MailService extends BaseMailService
{
    public function __construct(
        MailerInterface $mailer,
        MailTemplateRepository $mailTemplateRepository,
        MailHistoryRepository $mailHistoryRepository,
        BaseInfoRepository $baseInfoRepository,
        EventDispatcherInterface $eventDispatcher,
        \Twig\Environment $twig,
        EccubeConfig $eccubeConfig,
    ) {
        parent::__construct(
            $mailer,
            $mailTemplateRepository,
            $mailHistoryRepository,
            $baseInfoRepository,
            $eventDispatcher,
            $twig,
            $eccubeConfig
        );
    }

    /**
     * Send order mail.
     *
     * @param \Eccube\Entity\Order $Order 受注情報
     *
     * @return Email
     */
    public function sendOrderMail(Order $Order)
    {
        log_info('受注メール送信開始');

        // デフォルトのコード
        // $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['eccube_order_mail_template_id']);

        // 修正コード
        $MailTemplate = $this->mailTemplateRepository->find($this->eccubeConfig['my_order_mail_template_id']);

        $body = $this->twig->render($MailTemplate->getFileName(), [
            'Order' => $Order,
        ]);

        $message = (new Email())
            ->subject('['.$this->BaseInfo->getShopName().'] '.$MailTemplate->getMailSubject())
            ->from(new Address($this->BaseInfo->getEmail01(), $this->BaseInfo->getShopName()))
            ->to($this->convertRFCViolatingEmail($Order->getEmail()))
            ->bcc($this->BaseInfo->getEmail01())
            ->replyTo($this->BaseInfo->getEmail03())
            ->returnPath($this->BaseInfo->getEmail04());

        // HTMLテンプレートが存在する場合
        $htmlFileName = $this->getHtmlTemplate($MailTemplate->getFileName());
        if (!is_null($htmlFileName)) {
            $htmlBody = $this->twig->render($htmlFileName, [
                'Order' => $Order,
            ]);

            $message
                ->text($body)
                ->html($htmlBody);
        } else {
            $message->text($body);
        }

        $event = new EventArgs(
            [
                'message' => $message,
                'Order' => $Order,
                'MailTemplate' => $MailTemplate,
                'BaseInfo' => $this->BaseInfo,
            ],
            null
        );
        $this->eventDispatcher->dispatch($event, EccubeEvents::MAIL_ORDER);

        try {
            $this->mailer->send($message);
        } catch (TransportExceptionInterface $e) {
            log_critical($e->getMessage());
        }

        $MailHistory = new MailHistory();
        $MailHistory->setMailSubject($message->getSubject())
            ->setMailBody($message->getTextBody())
            ->setOrder($Order)
            ->setSendDate(new \DateTime());

        // HTML用メールの設定
        $htmlBody = $message->getHtmlBody();
        if (!empty($htmlBody)) {
            $MailHistory->setMailHtmlBody($htmlBody);
        }

        $this->mailHistoryRepository->save($MailHistory);

        log_info('受注メール送信完了');

        return $message;
    }
}
STEP

app/config/eccube/services.yaml に MailService を登録

Customize\Service\MailServiceEccube\Service\MailService として認識させるため、以下コードをservices.yamlファイルの最後に追記します。

    Eccube\Service\MailService:
        class: Customize\Service\MailService
        arguments:
            - '@mailer.mailer'
            - '@Eccube\Repository\MailTemplateRepository'
            - '@Eccube\Repository\MailHistoryRepository'
            - '@Eccube\Repository\BaseInfoRepository'
            - '@event_dispatcher'
            - '@twig'
            - '@Eccube\Common\EccubeConfig'

これで、オリジナルファイルに手を加えることなくカスタマイズできます。

STEP

キャッシュを削除

以上でカスタマイズ完了です。
最後に管理画面 → コンテンツ管理よりキャッシュを削除し、実際に変更したテンプレートが送信されるか確認しておきましょう。


よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次