自分用メール送信クラスを作った。

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();

イイ感じ。

One Comment

  1. […] 以前の記事←で作成したメール送信クラスに添付ファイル送信機能をつけてみた。 […]

Comments are closed.