CS-Cartで開発時や検証時に、CS-Cartから送信されるメールを一箇所に送りたいことがある。ここではその実現方法を紹介する。
前提として、CS-CartのPHPフックを使うので、適当なAddonを作っておく。
使うフック
init.php
fn_register_hooks(
'send_mail_pre'
);
フック関数の実装
func.php
/**
* @param $mailer
* @param $params
* @param $area
* @param $lang_code
*/
function fn_{アドオンID}_send_mail_pre($mailer, &$params, $area, $lang_code)
{
$debugEmails = Registry::get('config.debug_email_to');
if ($debugEmails === null or $debugEmails === []) {
return; // デバッグモードではない場合
}
if (array_key_exists('to', $params)) {
$params['to'] = $debugEmails;
}
if (array_key_exists('cc', $params)) {
unset($params['cc']);
}
}
送信先固定はconfig.local.phpに定義する
config.local.php
// メール送信先固定設定(コメントアウトすると固定解除)
$config['debug_email_to'] = [
'debug@example.com',
];
もしくは、local_conf.php
に定義する。
local_conf.php
if ($_SERVER['SERVER_NAME'] === 'localhost') {
// メール送信先固定設定
$config['debug_email_to'] = [
'developer@example.com',
];
}
送信先固定が効いているかを管理画面で確認できるようにする
ディスパッチのフックに噛んで、通知を表示する。
init.php
fn_register_hooks(
'send_mail_pre',
'before_dispatch'
);
func.php
function fn_myaddon_before_dispatch($controller, $mode, $action, $dispatch_extra, $area)
{
fn_myaddon_warn_email_debug_mode();
if ($controller === 'index' and $area === 'A') {
fn_myaddon_info_email_debug_mode();
}
}
function fn_myaddon_warn_email_debug_mode()
{
$isDebugMode = defined('DEBUG_MODE') and DEBUG_MODE === true;
if ($isDebugMode and fn_myaddon_is_email_debug_mode() === false) {
fn_set_notification('E', "警告", "全てのメール通知は実ユーザに送信されてしまいます。local_conf.phpに`debug_email_to`を設定し、メール送信先を固定してください。");
}
}
function fn_myaddon_info_email_debug_mode()
{
$debugEmails = Registry::get('config.debug_email_to');
if (fn_myaddon_is_email_debug_mode()) {
$filename = defined('DEBUG_MODE') ? 'local_conf.php' : 'config.local.php';
fn_set_notification('W', "検証モード", sprintf('メール送信検証のため、全てのメール通知は%sに固定送信されます。この設定を変更するには %s の `debug_email_to` を変更してください。', json_encode($debugEmails), $filename));
}
}
function fn_myaddon_is_email_debug_mode()
{
$debugEmails = Registry::get('config.debug_email_to');
if ($debugEmails === null or $debugEmails === []) {
return false;
}
return true;
}