メールの定型文に可変文字列(変数)を埋め込みたいとき
こんにちは。sagaraです。昔と違い、誰もがインターネットショッピングを利用する時代ですね。
私のAmazonの利用開始年度は2007年らしいのですが、当時の購入履歴がまだ残っているのでビックリです。
10年前、こんなもの欲しがっていたなあと暫く懐かしんでおりました。
さて、注文した際に自動で送られてくるメールには、あらたまった定型文の中にも、
当然、自分の名前や注文した商品名などが書かれています。
このように、定型文への動的な文字列の埋め込みは、どのように実現しているのでしょうか。
とくに難しいことはありませんので、例を出して見ていこうと思います。
メッセージに特定の情報を埋め込む
商品発送メールのテンプレートの例です。
$mail_template = <<< EOF
{{username}}様
この度はネコネコ配送サービスをご利用いただき、ありがとうございます。
本日、ご注文の商品を発送いたしました。
注文番号: {{orderid}}
また、配送状況につきましては、以下のURLからご検索ください。
{{deliverystatus}}
またのご利用をお待ちしております。
EOF;
ユーザ名は{{username}}
、注文番号は{{orderid}}
といったように
タグのようなものを決めておくと便利です。
定型文で必ず使う変数をタグ化しておくことで、定型文に変更があったり、
パターンが増えたりしたときに編集しやすくなると思います。
テンプレートの編集を担当する人が理解しやすいようにアレンジしてもよいでしょうし、
フレームワークのモデル名やフィールド名と対応させてもいいかもしれません。
顧客名や注文番号などの情報が入っている配列$order
を使って、
以下のように埋め込み対応の配列を使って変換することにします。
//文字列置換の対応をあらわす配列
$replacement = [
'{{username}}' => $order['user_name'],
'{{orderid}}' => $order['order_id'],
'{{deliverystatus}}' => $order['delivery_status'],
];
配列のキーに埋め込むタグ、値に変数をおきます。
すると、以下のコードで、全てのタグへの埋め込みができます。
$message_body = str_replace(array_keys($replacement), array_values($replacement), $mail_template);
埋め込みタグの配列の値を、置換後の変数の配列の値に置き換えています。
いくつかの組み込み関数を用いていますので簡単に解説します。
str_replace($search, $replace, $subject)
文字列置換を行う関数です。
PHP: str_replace
subject
の中に含まれるsearch
をreplace
に置換します。
置換に配列を用いることもできます。
<?php
$str = "カレーは飲み物です";
echo str_replace('カレー', 'とんかつ', $str); //とんかつは飲み物です
echo str_replace(['カレー', '飲み物'], ['バナナ', '主食'], $str); //バナナは主食です
この関数を用いれば、埋め込みタグを特定の文字列や変数に置き換えることが出来そうです。
配列を用いて複数の埋め込みタグを一括で処理するために、埋め込みタグだけを並べた配列と、
埋め込み後の変数だけの配列を用意しておきます。それが以下です。
array_keys($array)
配列のキーだけを集めた配列を返します。
PHP: array_keys
<?php
$arr = [
'akb' => '秋葉原',
'nmb' => '難波',
'ske' => '栄'
];
print_r(array_keys($arr)); //Array ( [0] => akb [1] => nmb [2] => ske )
array_values($array)
配列の値だけを集めた配列を返します。
PHP: array_values
<?php
$arr = [
'akb' => '秋葉原',
'nmb' => '難波',
'ske' => '栄'
];
print_r(array_values($arr)); //Array ( [0] => 秋葉原 [1] => 難波 [2] => 栄 )
埋め込む文字列の順番が決まっている場合
キーが不要で、埋め込む文字列の順番が決まっている場合は、vsprintf()が使えます。
よりシンプルに書くことができます。
vsprintf($format, $array)
$mail_template2 = <<< EOF
%s様
この度はネコネコ配送サービスをご利用いただき、ありがとうございます。
本日、ご注文の商品を発送いたしました。
注文番号: %d
また、配送状況につきましては、以下のURLからご検索ください。
%s
またのご利用をお待ちしております。
EOF;
以下のような配列を用いて置き換えます。
$replacement = [$order['user_name'], $order['order_id'], $order['delivery_status']]
vsprintf($mail_template2, $replacement);
vsprintf()を用いると、%s(フォーマット文字列、%sは文字列)の数が足りなければエラーになるので、
テンプレート修正の際は気を付ける必要があります。
(PHPの場合、%sに数値を投げても型キャストして文字列を置換してくれます)