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

July 14, 2008

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

sendmail.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?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 である。ヘッダと本文の間は二回連続で改行する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
From: noreply@localhost
Subject: テンプレートファイルの例
{$user} 様
{$message}
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
PHPによるテンプレートクラス例

#### 使用例

[SendMail](http://d.hatena.ne.jp/keyword/SendMail) クラスのコンストラクタでテンプレートファイルのパスを渡す。
send() には宛先(to:) とテンプレート上の {$xxxx} の xxxx をキーとして置き換える値を[連想配列](http://d.hatena.ne.jp/keyword/%CF%A2%C1%DB%C7%DB%CE%F3)化して渡す。

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

tilfin freelance software engineer