Reply-Toとか細かい設定はないけど、よく使う(と思われる)部分をシンプルに実装。
<?php
/**
* sendmailを用いたシンプルなメール送信用クラス
* 単純に送信したい場合は以下の通り
* ※to, cc, bcc, のいずれか一つの指定は必須
*
* $mail = new simpleMailTransmission();
*
* $res = $mail
* ->to('to@local.host') // 必要に応じて
* ->cc('cc@local.host') // 必要に応じて
* ->Bcc('bcc@local.host') // 必要に応じて
* ->from('from@local.host') // 必須
* ->subject('タイトルを指定')
* ->send('本文を指定');
*
*/
class simpleMailTransmission {
// 送信先
protected $to = array();
// メールタイトル
protected $subject = '';
// メール本文
protected $message = '';
// ヘッダー情報
protected $header = '';
// 送信先一時格納変数(複数可)
protected $_to = array();
// 送信元設定
protected $_from = array();
// Cc格納変数
protected $_cc = array();
// Bcc格納変数
protected $_bcc = array();
// ヘッダー情報一時格納変数
protected $_header = '';
// テンプレートファイルパス
protected $_template = '';
// テンプレートに渡す変数
protected $_viewVars = array();
/**
* 送信先のセット
* @param unknown_type $email
* @param unknown_type $name
* @return multitype:|mailTerminal
*/
public function to($email = null, $name = null) {
if($email === null) {
return $this->_to;
}
return $this->_setEmail('_to', $email, $name);
}
/**
* 送信先の追加
* @param unknown_type $email
* @param unknown_type $name
* @return mailTerminal
*/
public function addTo($email, $name = null) {
return $this->_addEmail('_to', $email, $name);
}
/**
* Ccのセット
* @param unknown_type $email
* @param unknown_type $name
* @return multitype:|mailTerminal
*/
public function cc($email = null, $name = null) {
if($email === null) {
return $this->_cc;
}
return $this->_setEmail('_cc', $email, $name);
}
/**
* Ccの追加
* @param unknown_type $email
* @param unknown_type $name
* @return mailTerminal
*/
public function addCc($email, $name = null) {
return $this->_addEmail('_cc', $email, $name);
}
/**
* Bccのセット
* @param unknown_type $email
* @param unknown_type $name
* @return multitype:|mailTerminal
*/
public function bcc($email = null, $name = null) {
if($email === null) {
return $this->_bcc;
}
return $this->_setEmail('_bcc', $email, $name);
}
/**
* Bccの追加
* @param unknown_type $email
* @param unknown_type $name
* @return mailTerminal
*/
public function addBcc($email, $name = null) {
return $this->_addEmail('_bcc', $email, $name);
}
/**
* セット用メソッド
* @param unknown_type $varName
* @param unknown_type $email
* @param unknown_type $name
* @return mailTerminal
*/
protected function _setEmail($varName, $email, $name) {
if(self::email($email)) {
if($name === null) {
$name = $email;
}
$this->{$varName} = array($email => $name);
}
return $this;
}
/**
* 追加用メソッド
* @param unknown_type $varName
* @param unknown_type $email
* @param unknown_type $name
* @return mailTerminal
*/
protected function _addEmail($varName, $email, $name) {
if(self::email($email)) {
if($name === null) {
$name = $email;
}
$this->{$varName}[$email] = $name;
}
return $this;
}
/**
* 送信元の設定
* @param unknown_type $email
* @param unknown_type $name
* @return multitype:|mailTerminal
*/
public function from($email = null, $name = null) {
if($email === null) {
return $this->_from;
}
return $this->_setEmailSingle('_from', $email, $name);
}
/**
* 単一の値であることを保障するためのセット関数
* @param unknown_type $varName
* @param unknown_type $email
* @param unknown_type $name
* @return mailTerminal
*/
protected function _setEmailSingle($varName, $email, $name) {
$current = $this->{$varName};
$this->_setEmail($varName, $email, $name);
if(count($this->{$varName}) !== 1) {
$this->{$varName} = $current;
}
return $this;
}
/**
* メールタイトルのセット
* @param unknown_type $subject
* @return string|mailTerminal
*/
public function subject($subject = null) {
if($subject === null) {
return $this->subject;
}
$this->subject = (string)$subject;
return $this;
}
/**
* テンプレートファイルパスの指定
* @param unknown_type $template
* @return string|mailTerminal
*/
public function template($template = false) {
if($template === false) {
return $this->_template;
}
$this->_template = $template;
return $this;
}
/**
* テンプレートファイルに渡す変数を設定
* @param unknown_type $viewVars
* @return multitype:|mailTerminal
*/
public function viewVars($viewVars = null) {
if($viewVars === null) {
return $this->_viewVars;
}
$this->_viewVars = array_merge($this->_viewVars, (array)$viewVars);
return $this;
}
/**
* メールアドレスのバリデーション設定
* @param unknown_type $check
* @return boolean
*/
protected function email($check) {
$hostName = '(?:[_a-z0-9][-_a-z0-9]*\.)*(?:[a-z0-9][-a-z0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,})';
$regex = '/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@'.$hostName.'$/i';
return self::_check($check, $regex);
}
/**
* メールの送信開始トリガー
* @param unknown_type $plainMessage
* @return string|Ambigous <boolean, multitype:boolean >
*/
public function send($plainMessage = null) {
if(empty($this->_from)) {
return 'From is not specified.';
}
if(empty($this->_to) && empty($this->_cc) && empty($this->_bcc)) {
return 'You need to specify at least one destination for to, cc or bcc.';
}
$this->header = $this->createHeader();
$this->to = $this->createTo();
if(!file_exists($this->_template)) {
$this->message = self::mce($plainMessage);
} else {
$this->message = self::mce($this->createMessage());
}
return self::_send();
}
/**
* 送信処理
* @return boolean|multitype:boolean
*/
protected function _send() {
mb_language('ja');
mb_internal_encoding('UTF-8');
if(empty($this->to)) {
return mb_send_mail(null, $this->subject, $this->message, $this->header);
} else {
$_errors = array();
foreach($this->to as $to) {
if(!mb_send_mail($to, $this->subject, $this->message, $this->header)) $_errors[$to] = false;
}
if(empty($_errors)) return true;
return $_errors;
}
}
/**
* 追加ヘッダーの生成
* @return string
*/
protected function createHeader() {
foreach($this->_from as $email => $name) $this->_header .= 'From: '.self::mem($name).' <'.$email.'>'."\n";
if(!empty($this->_cc)) {
$this->_header .= 'Cc: ';
foreach($this->_cc as $email => $name) {
$this->_header .= self::mem($name).' <'.$email.'>'."\n,";
}
$this->_header = self::trimLastChar($this->_header);
}
if(!empty($this->_bcc)) {
$this->_header .= 'Bcc: ';
foreach($this->_bcc as $email => $name) {
$this->_header .= self::mem($name).' <'.$email.'>'."\n,";
}
$this->_header = self::trimLastChar($this->_header);
}
return $this->_header;
}
/**
* 送信先ヘッダーの生成
* @return multitype:string
*/
protected function createTo() {
$t = array();
if(!empty($this->_to)) {
foreach($this->_to as $email => $name) {
$t[] = self::mem($name).' <'.$email.'>';
}
}
return $t;
}
/**
* テンプレートより本文の生成
* @return Ambigous <string, mixed>
*/
protected function createMessage() {
$b = '';
$tmp = file_get_contents($this->_template);
if($tmp) {
$varArray = array();
if(!empty($this->_viewVars)) {
foreach($this->_viewVars as $varName => $value) {
$varArray['{%'.$varName.'%}'] = $value;
}
}
$b = str_replace(array_keys($varArray) , array_values($varArray) , $tmp);
}
return $b;
}
/**
* バリデーションの実行
* @param unknown_type $check
* @param unknown_type $regex
* @return boolean
*/
protected function _check($check, $regex) {
if(preg_match($regex, $check)) return true;
return false;
}
protected function mem($var) {
return mb_encode_mimeheader($var);
}
protected function mce($var) {
return mb_convert_encoding($var, 'ISO-2022-JP');
}
protected function trimLastChar($var) {
return substr($var, 0, -1);
}
}
基本的な使い方はクラス上部のコメントアウトを参照。
テンプレートファイルを用いる場合の使用例は以下の通り。
■テンプレートファイル
文字列で置換したい部分を「{%…%}」で囲い定義する。
※.txtファイルだろうが無拡張子だろうが読み込めれば何でもOK
{%name%} 様
テストメッセージテストメッセージテストメッセージ
テストメッセージテストメッセージテストメッセージ
テストメッセージテストメッセージテストメッセージ
担当 {%charge%}
{%url%}
{%footer%}
PHP側から以下のように変数とテンプレートをセットし、メールを送信する。
$params = array(
'name' => 'テスト太郎',
'charge' => 'テスト花子',
'url' => 'http://localhost.com',
'footer' => '株式会社テストテスト'
);
$mail = new simpleMailTransmission();
$res = $mail
->to('to@local.host')
->from('from@local.host')
->subject('テストメールなう。')
->viewVars($params)
->template('/path/to/template.txt')
->send();
イイ感じ。