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();
イイ感じ。
[…] 以前の記事←で作成したメール送信クラスに添付ファイル送信機能をつけてみた。 […]