• 2018.08.30
  • [最終更新日]2018.09.07
  • EC-cube

【EC-cube2.13】注文時に指定アドレスへ受付メールを送信する

【EC-cube2.13】注文時に指定アドレスへ受付メールを送信するのイメージ画像

EC-cubeでは、注文受付のメールが「管理者」とBCCで「注文者」に届くようになっています。

上記2つ以外にも届けたいメールアドレスがあったりします。
勉強を兼ねて色々なパターンを試しながら構築したのでメモしておきます。

しっかりと理解できていない部分もあって変な書き方になっているかもしれませんが、もし参考にされる方がおられましたら、ご了承のほどよろしくお願いいたします!

管理者側メールアドレスを追加して送信したい場合

管理者が複数いる場合など管理者側メールアドレスを追加して送信したい場合があります。
メールサーバー側で対応してもよいのですが、EC-cubeを触るのであれば下記のような方法があります。

ソースに直接メールアドレスを記述

/data/class/helper/SC_Helper_Mail.php

/* 注文受付メール送信 */
public function sfSendOrderMail($order_id, $template_id, $subject = '', $header = '', $footer = '', $send = true)
{
     ・
     ・
$bcc1 = "○○○○1@○○○○.co.jp";  //追加アドレス1
$bcc2 = "○○○○2@○○○○.co.jp";  //追加アドレス2
$bcc = $arrInfo['email01'] . "," . $bcc1 . "," . $bcc2;  //変更

会員情報にメールアドレスを追加して送信したい場合

管理者側ではなく、購入者側のメールアドレスを追加したいケースもあると思います。
その場合、会員情報にメールアドレスを追加しなくてはなりません。

データベース(DB)を触りたくないという方

会員の方に登録させる必要がないのであれば、SHOP用メモあたりが利用できます。

/data/class/helper/SC_Helper_Mail.php

/* 注文受付メール送信 */
public function sfSendOrderMail($order_id, $template_id, $subject = '', $header = '', $footer = '', $send = true)
{
     ・
     ・
	$arrRet = $objQuery->select('point', 'dtb_customer', 'customer_id = ?', array($customer_id));

	//追記
	$arrNote = $objQuery->select('note', 'dtb_customer', 'customer_id = ?', array($customer_id));
	$addressList = $arrNote[0]['note'];
	//ここまで
	$arrCustomer = isset($arrRet[0]) ? $arrRet[0] : '';
     ・
     ・
	// メール送信処理
	$objSendMail = new SC_SendMail_Ex();
	$bcc = $arrInfo['email01'] . "," .$addressList; //変更

会員情報にメールアドレスを追加して送信したい場合(DB項目追加)

データベース(DB)に5項目追加

phpMyAdminを使用してDBに項目を追加する

「担当者アドレス:1~5」を「email_child01」~「email_child05」という項目名で追加
名前「email_child01」~「email_child05」データ型「TEXT」デフォルト値「NULL」
もしくはSQL文だと、「ALTER TABLE `dtb_customer` ADD `email_child01` TEXT NULL DEFAULT NULL ;」これを1~5まで5行並べて実行すれば大丈夫かと思います。

会員情報への項目追加に関しては下記の記事もご覧ください。
SQL文を使用しています。

【EC-cube2.13】会員管理に項目を追加したい

SC_Helper_Customer_Ex.php

SC_Helper_Customer.phpの「sfCustomerRegisterParam」メソッドをコピーして編集。

/data/class/helper/SC_Helper_Customer.php

public function sfCustomerRegisterParam(&$objFormParam, $isAdmin = false, $is_mypage = false, $prefix = '')
{
     ・
     ・
	if (SC_Display_Ex::detectDevice() !== DEVICE_TYPE_MOBILE) {
		$objFormParam->addParam('メールアドレス', $prefix . 'email', null, 'a', array('NO_SPTAB', 'EXIST_CHECK', 'EMAIL_CHECK', 'SPTAB_CHECK', 'EMAIL_CHAR_CHECK'));
		//追加
		$objFormParam->addParam('担当者アドレス:1', $prefix . 'email_child01', null, 'a', array('NO_SPTAB', 'EMAIL_CHECK', 'SPTAB_CHECK', 'EMAIL_CHAR_CHECK'));
    ・
    ・

Smartyテンプレート側ファイルの編集

管理画面から登録する場合、「data/Smarty/templates/admin/customer/edit.tpl」「data/Smarty/templates/admin/customer/edit_confirm.tpl」を編集します。

あとは前述の/data/class/helper/SC_Helper_Mail.php「note」を「email_child01」に変更すればいいと思います。

注文時にメールアドレスを入力して送信したい場合

phpMyAdminを使用してDBに項目を追加する

「追加アドレス:1」を「add_mail01」という項目名で追加
名前「add_mail01」データ型「TEXT」デフォルト値「NULL」

LC_Page_Shopping_Payment_Ex.phpを編集

「lfInitParam」メソッドを編集

    public function lfInitParam(&$objFormParam, $deliv_only, &$arrShipping)
    {
        $objFormParam->addParam('配送業者', 'deliv_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
        $objFormParam->addParam('ポイント', 'use_point', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK', 'ZERO_START'));
        $objFormParam->addParam('その他お問い合わせ', 'message', LTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('ポイントを使用する', 'point_check', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '2');

        if ($deliv_only) {
            $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
        } else {
            $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));

            foreach ($arrShipping as $val) {
                $objFormParam->addParam('お届け時間', 'deliv_time_id' . $val['shipping_id'], INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
                $objFormParam->addParam('お届け日', 'deliv_date' . $val['shipping_id'], STEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
            }
        }
		
		//この行加えて上書きしているだけ
		$objFormParam->addParam('担当者', 'person_in_charge', STEXT_LEN, 'KVa', array('EXIST_CHECK', 'MAX_LENGTH_CHECK'));
		$objFormParam->addParam('追加アドレス:1', 'add_mail01', null, 'a', array('NO_SPTAB', 'EMAIL_CHECK', 'SPTAB_CHECK', 'EMAIL_CHAR_CHECK'));


        $objFormParam->setParam($arrShipping);
        $objFormParam->convParam();
    }

Smartyテンプレート側ファイルの編集

「data/Smarty/templates/default/shopping/payment.tpl」のフォームに追加

<!--{assign var=key value="add_mail01"}-->
<span class="attention"><!--{$arrErr[$key]}--></span>
<p><input type="text" name="<!--{$key}-->" value="<!--{$arrForm[$key].value}-->" maxlength="<!--{$arrForm[$key].length}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" class="box200" /></p>

先ほど追加したメールアドレスを注文時に選択して送信したい場合

会員情報からメールアドレス(最大5件)を取得

LC_Page_Shopping_Payment.phpのactionメソッドをコピーしてきてLC_Page_Shopping_Payment_Ex.phpに内容を上書きします。
ここに記述しておかないと、会員情報に関するデータが表示されません。

    public function action()
    {
     ・
     ・
        // 会員情報の取得
        if ($objCustomer->isLoginSuccess(true)) {
            $this->tpl_login = '1';
            $this->tpl_user_point = $objCustomer->getValue('point');
            $this->name01 = $objCustomer->getValue('name01');
            $this->name02 = $objCustomer->getValue('name02');
			//ここから追加
			$this->email_child01 = $objCustomer->getValue('email_child01');
			$this->email_child02 = $objCustomer->getValue('email_child02');
			$this->email_child03 = $objCustomer->getValue('email_child03');
			$this->email_child04 = $objCustomer->getValue('email_child04');
			$this->email_child05 = $objCustomer->getValue('email_child05');
			//ここまで
        }

1つだけ選択すればいい場合(ラジオボタン)

/data/class/helper/SC_Helper_Mail.php

/* 注文受付メール送信 */
public function sfSendOrderMail($order_id, $template_id, $subject = '', $header = '', $footer = '', $send = true)
{
     ・
     ・
	$arrRet = $objQuery->select('point', 'dtb_customer', 'customer_id = ?', array($customer_id));

	//追記
	$addressList = $arrOrder['add_mail01'];
	//ここまで
	$arrCustomer = isset($arrRet[0]) ? $arrRet[0] : '';
     ・
     ・
	// メール送信処理
	$objSendMail = new SC_SendMail_Ex();
	$bcc = $arrInfo['email01'] . "," .$addressList; //変更

「data/Smarty/templates/default/shopping/payment.tpl」のフォームに追加

<!--{assign var=key value="add_mail01"}-->
<span class="attention"><!--{$arrErr[$key]}--></span>
<!--{if $email_child01 !=""}-->
<label for=""><input type="radio" id="" name="<!--{$key}-->" value="<!--{$email_child01|h}-->" /><!--{$email_child01|h}--></label>
<!--{/if}-->
<!--{if $email_child02 !=""}-->
<label for=""><input type="radio" id="" name="<!--{$key}-->" value="<!--{$email_child02|h}-->" /><!--{$email_child02|h}--></label>
<!--{/if}-->
     ・
     ・

複数選択させたい場合(チェックボックス)

ちょっと変なソースかもしれませんが、一応動作確認済みです。

/data/class/helper/SC_Helper_Mail.php

/* 注文受付メール送信 */
public function sfSendOrderMail($order_id, $template_id, $subject = '', $header = '', $footer = '', $send = true)
{
     ・
     ・
	$arrRet = $objQuery->select('point', 'dtb_customer', 'customer_id = ?', array($customer_id));

	//追記
	$addressList = array();
	if ($arrOrder['add_mail01'] != '') {
		$addressList[] = $arrOrder['add_mail01'];
	}
	if ($arrOrder['add_mail02'] != '') {
		$addressList[] = $arrOrder['add_mail02'];
	}
	if ($arrOrder['add_mail03'] != '') {
		$addressList[] = $arrOrder['add_mail03'];
	}
	if ($arrOrder['add_mail04'] != '') {
		$addressList[] = $arrOrder['add_mail04'];
	}
	if ($arrOrder['add_mail05'] != '') {
		$addressList[] = $arrOrder['add_mail05'];
	}
	//ここまで
	$arrCustomer = isset($arrRet[0]) ? $arrRet[0] : '';
     ・
     ・
	// メール送信処理
	$objSendMail = new SC_SendMail_Ex();
	$bcc = $arrInfo['email01'] . ',' . implode(',', $addressList); //$addressList配列を,で区切って連結

「data/Smarty/templates/default/shopping/payment.tpl」のフォームに追加

<!--{if $email_child01 !=""}-->
<label><input type="checkbox" id="" name="add_mail01" value="<!--{$email_child01|h}-->" /><!--{$email_child01|h}--></label>
<!--{/if}-->
<!--{if $email_child02 !=""}-->
<label><input type="checkbox" id="" name="add_mail02" value="<!--{$email_child02|h}-->" /><!--{$email_child02|h}--></label>
<!--{/if}-->
<!--{if $email_child03 !=""}-->
<label><input type="checkbox" id="" name="add_mail03" value="<!--{$email_child03|h}-->" /><!--{$email_child03|h}--></label>
<!--{/if}-->
<!--{if $email_child04 !=""}-->
<label><input type="checkbox" id="" name="add_mail04" value="<!--{$email_child04|h}-->" /><!--{$email_child04|h}--></label>
<!--{/if}-->
<!--{if $email_child05 !=""}-->
<label><input type="checkbox" id="" name="add_mail05" value="<!--{$email_child05|h}-->" /><!--{$email_child05|h}--></label>
<!--{/if}-->

うまくいきましたでしょうか?
ソースは汚いかもしれませんが、目的の仕様まで到達できて満足です。

複数選択させたい場合(チェックボックス)の追記

上の例では、送信先のアドレスをDBのカラムに1つずつ格納してましたが、1つのカラムに複数のアドレスを保存する形式も試しました。

/data/class/helper/SC_Helper_Mail.php

/* 注文受付メール送信 */
public function sfSendOrderMail($order_id, $template_id, $subject = '', $header = '', $footer = '', $send = true)
{
     ・
     ・
	$arrRet = $objQuery->select('point', 'dtb_customer', 'customer_id = ?', array($customer_id));

	//追記
	$addressList = array();
	$addressList = unserialize($arrOrder['add_mail01']); //デシリアライズ
	//ここまで
	$arrCustomer = isset($arrRet[0]) ? $arrRet[0] : '';
     ・
     ・
	// メール送信処理
	$objSendMail = new SC_SendMail_Ex();
	$bcc = $arrInfo['email01'] . ',' . implode(',', $addressList); //$addressList配列を,で区切って連結

「data/Smarty/templates/default/shopping/payment.tpl」のフォームに追加

<!--{if $email_child01 !=""}-->
<label><input type="checkbox" id="" name="add_mail01[]" value="<!--{$email_child01|h}-->" /><!--{$email_child01|h}--></label>
<!--{/if}-->
<!--{if $email_child02 !=""}-->
<label><input type="checkbox" id="" name="add_mail01[]" value="<!--{$email_child02|h}-->" /><!--{$email_child02|h}--></label>
<!--{/if}-->
<!--{if $email_child03 !=""}-->
<label><input type="checkbox" id="" name="add_mail01[]" value="<!--{$email_child03|h}-->" /><!--{$email_child03|h}--></label>
<!--{/if}-->
<!--{if $email_child04 !=""}-->
<label><input type="checkbox" id="" name="add_mail01[]" value="<!--{$email_child04|h}-->" /><!--{$email_child04|h}--></label>
<!--{/if}-->
<!--{if $email_child05 !=""}-->
<label><input type="checkbox" id="" name="add_mail01[]" value="<!--{$email_child05|h}-->" /><!--{$email_child05|h}--></label>
<!--{/if}-->

うまくいきましたでしょうか?
フォームから配列として保存するとシリアライズされるようなので、送信する前にデシリアライズしてあげるみたいです。