PHP でのテンプレート機能に対応した簡単なメール送信クラスのサンプル
Smarty や Ethna などのアプリケーションフレームワークを使うレベルではないけど、ちょっとしたテンプレート対応させたメール送信を実装したいときのサンプル。
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によるテンプレートクラス例