PHP でのテンプレート機能に対応した簡単なメール送信クラスのサンプル

SmartyEthna などのアプリケーションフレームワークを使うレベルではないけど、ちょっとしたテンプレート対応させたメール送信を実装したいときのサンプル。
mb_send_mail を使っている。

sendmail.php

<?php
mb_internal_encoding("UTF-8");

/**
 * テンプレートに対応したメール送信クラス
 */
class SendMail {
  protected $content;
  protected $lang;
  protected $subject;
  protected $options;
  
  /**
  * コンストラクタ
   * @access    public
   * @param     String    $tplfile    テンプレートファイルのパス
   * @param     String    $lang       メール送信時の言語指定
   */
  public function __construct($tplfile, $lang = "ja") {
  	$this->content = file_get_contents($tplfile);
  	$this->lang = $lang;
  }
  
  protected function replace_options($matches) {
  	if (array_key_exists($matches[1], $this->options)) {
      return $this->options[$matches[1]];
    } else {
      return "";
    }
  }
  
  protected function extract_subject($matches) {
  	$this->subject = trim($matches[1]);
  	return "";
  }
  
  /**
  * テンプレートにマップの値をセットしてメールを指定された先に送信します。
   * @access    public
   * @param     String    $to    メール送信先
   * @param     Array     $opts  テンプレートに当てはまるマップ
   * @return    bool      送信結果
   */
  public function send($to, $opts) {
    $this->options = $opts;
    
    // テンプレートにマップの値をセット
    $content = preg_replace_callback('/\{\$([a-z0-9]+)\}/',
                 array($this, "replace_options"), $this->content);
    
    // メールのヘッダとボディを切り分ける
    list($headers, $body) = preg_split("/\n\n/", $content, 2);
    
    // ヘッダから件名を抜き取る
    $headers = preg_replace_callback('/Subject\:(.*)/',
                 array($this, "extract_subject"), $headers);
    
    mb_language($this->lang);
    $result = mb_send_mail($to, $this->subject, $body, $headers);
    
    $this->options = NULL;
    $this->subject = NULL;
    
    return $result;
  }
}
?>

テンプレートファイルの例 (mail.tpl)

send_mail() の仕様により、改行コードは LF である。ヘッダと本文の間は二回連続で改行する。

From: noreply@localhost
Subject: テンプレートファイルの例

{$user} 様

{$message}

--------------------------------------
PHPによるテンプレートクラス例

使用例

SendMail クラスのコンストラクタでテンプレートファイルのパスを渡す。
send() には宛先(to:) とテンプレート上の {$xxxx} の xxxx をキーとして置き換える値を連想配列化して渡す。

<?php
require "sendmail.php";

$smail = new SendMail("mail.tpl");
$smail->send("test@localhost", array(
    "user" => "はて はてな"
    "message" => "さんぷるのメッセージ",
  ));
?>