この記事では、商品注文時や会員登録時などに自動送信されるメールテンプレートを変更する方法を紹介します。
デフォルトのテンプレート内容を変更することは、EC-CUBE管理画面から簡単に編集できます。
が、新しく用意したテンプレートなど、テンプレート自体を別のものに変更するには、サーバー上のServiceと呼ばれるファイルを修正する必要があります。
デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については 以下記事 で解説しています。
カスタマイズ後は、デバッグモードの解除を忘れないように。
実装後の状態
事前に、『注文受付メール2』というテンプレートを1つ追加しておきます。
※メールテンプレートの増やし方は以下記事にて紹介しています。

冒頭に「※これは新しく用意したテンプレートです。」という一文を追加しておきます。
商品を注文した際に自動送信されるメールを、このテンプレートに変更します。
(デフォルトでは『注文受付メール』が自動送信されます。)

新しいテンプレートに追加した一文が表示されており、送信メールが変更されています。
ちなみに、『出荷通知メール』や『問合受付メール』を設定することもできます。
(注文時に送る内容ではないので、実用的ではありませんが。)
実装の手順
『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
『MailService.php』の修正 or Customizeディレクトリに新規作成
メール送信に関するコードが記述されているServiceファイルを修正します。
「src/Eccube/Service」下にある『MailService.php』に、メールの自動送信に関するコードが記述されています。

注文時のメール送信は、sendOrderMail()
で定義されており、このメソッドにある変数$MailTemplate
に自動送信したいテンプレートを代入します。
具体的には、mailTemplateRepository
のfind()
メソッドの引数に、代入したいテンプレートの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のバージョンアップに強くなるのでこちらがお薦めです。)
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;
}
}
app/config/eccube/services.yaml に MailService を登録
Customize\Service\MailService
を Eccube\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'
これで、オリジナルファイルに手を加えることなくカスタマイズできます。
キャッシュを削除
以上でカスタマイズ完了です。
最後に管理画面 → コンテンツ管理よりキャッシュを削除し、実際に変更したテンプレートが送信されるか確認しておきましょう。
