LoginSignup
13
15

More than 5 years have passed since last update.

PHPのHTMLメール送信する際にテンプレートファイル内でPHPの変数を利用する方法

Posted at

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の変数を自由に使うことが出来るようになりました。
よくある用途だと思うので、ぜひ参考にしてください。

参考サイト

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15