PHPからHTMLメールを送る時に、HTMLテンプレート内でPHPの変数を使う方法がわからなかったので、手順をまとめました。
やりたいこと
- HTMLはファイルとして外部からインポートして使いたい(
echo <body>テキスト</body>
みたいなことをしたくない) - HTML内で外部から渡したPHPの変数を使って動的に内容を出力したい
PHPの変数を使うには、拡張子は.php
- 最初は
template.html
のようにhtml拡張子のファイルを読み込むようにしていましたが、これだとPHPとして認識されず、ファイル内でPHPの変数が利用出来ないのでファイルの拡張子を.php
に変更します
file_get_contentsではなく、include
- 外部ファイルのインポートには、
file_get_contents
を使う方法がメジャーですが、これだとHTMLが全て文字列として読み込まれてしまいます。 - PHPとして、ファイルを読み込むには
include
を利用します。
require
でも結果は同じですが対象ファイルが存在しない時に、fatal error
になってしまうのでinclude
を利用します。
直接、includeの値を返すと嵌る
ただし、includeは、正常に値を読み込めた場合はintの1を返すという仕様で最初ハマりました。
これを回避するには、includeをラップする関数を作り、結果をバッファに取得してその値を返すという風にします。
function get_include_contents($filename) {
// ファイルが存在する場合
if (is_file($filename)) {
// バッファに結果を取得する
ob_start();
include $filename;
// 取得した内容を返し、バッファを空にする
return ob_get_clean();
}
return false;
}
HTMLテンプレート内で利用する変数をセットする
最後に先ほど作成した関数でテンプレート内で利用する変数をセットします。
function get_include_contents($filename, $variablesToMakeLocal) {
extract($variablesToMakeLocal); // ← ここを追記
// ファイルが存在する場合
if (is_file($filename)) {
// バッファに結果を取得する
ob_start();
include $filename;
// 取得した内容を返し、バッファを空にする
return ob_get_clean();
}
return false;
}
上記のコードを呼び出す場合は以下のようにします。
$data['language'] = 'ja';
$data['name'] = 'テスト太郎';
$html = get_include_contents('html_template.php', $data);
$ses->send(array('test@gmail.com'), 'test', $html);
第二引数で指定した配列をextract
で変数に格納しテンプレート内で利用できるようにしています。
最後に
今回の方法でPHPでHTMLメールを送る際に外部ファイル内でPHPの変数を自由に使うことが出来るようになりました。
よくある用途だと思うので、ぜひ参考にしてください。
参考サイト
-
php mailer and html includes with php variables
Stack Overflow http://stackoverflow.com/questions/6688343/php-mailer-and-html-includes-with-php-variables -
PHP: include
Manual http://php.net/manual/ja/function.include.php