• Ubuntuに関連したハード、ソフトの備忘録サイトです

「CodeIgniter徹底入門」の2.x系への対応(2)ーメールの送信方法


Webアプリケーションで必須なのは、メールの送信です。残念ながらサイト管理者の環境では、PHPのデフォルトのmail関数および/usr/sbin/sendmailが効きません。そういう場合には、smtpサーバーを使って送信することができます。

ここでは、サイト管理者が構築した簡易メールサーバーによるコンタクト・システム、簡易ショッピングサイトでのメールの送信の仕方を記してみます。

まずは、system/libraries/Email.phpをapplcation/librariesにコピーし、メール送信の設定を行います。Emailクラスの暴騰の設定を次のように変更すれば、smtpでの送信が可能になります。

class CI_Email {

	var	$useragent		= "CodeIgniter";
	var	$mailpath		= "/usr/sbin/sendmail";	// Sendmail path
	var	$protocol		= "smtp";	// mail/sendmail/smtp
	var	$smtp_host		= "mail.it-ishin.com";		// SMTP Server.  Example: mail.earthlink.net
	var	$smtp_user		= "nomura";		// SMTP Username
	var	$smtp_pass		= "password";		// SMTP 出来るだけ複雑なものにする
	var	$smtp_port		= "587";		// SMTP Port
	var	$smtp_timeout	= 5;		        // SMTP Timeout in seconds
	var	$wordwrap		= TRUE;		// TRUE/FALSE  Turns word-wrap on/off
	var	$wrapchars		= "76";		// Number of characters to wrap at.
	var	$mailtype		= "text";	// text/html  Defines email formatting
	var	$charset		= "utf-8";	// Default char set: iso-8859-1 or us-ascii
	var	$multipart		= "mixed";	// "mixed" (in the body) or "related" (separate)
	var $alt_message	= '';		// Alternative message for HTML emails
	var	$validate		= FALSE;	// TRUE/FALSE.  Enables email validation
	var	$priority		= "3";		// Default priority (1 - 5)
	var	$newline		= "\n";		// Default newline. "\r\n" or "\n" (Use "\r\n" to comply with RFC 822)
	var $crlf			= "\n";		// The RFC 2045 compliant CRLF for quoted-printable is "\r\n".  Apparently some servers,
									// even on the receiving end think they need to muck with CRLFs, so using "\n", while
									// distasteful, is the only thing that seems to work for all environments.
	var $send_multipart	= TRUE;		// TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override.  Set to FALSE for Yahoo.
	var	$bcc_batch_mode	= FALSE;	// TRUE/FALSE  Turns on/off Bcc batch feature
	var	$bcc_batch_size	= 200;		// If bcc_batch_mode = TRUE, sets max number of Bccs in each batch
	var     $_safe_mode	= FALSE;
	var	$_subject	= "";
	var	$_body		= "";
	var	$_finalbody	= "";
	var	$_alt_boundary	= "";
	var	$_atc_boundary	= "";
	var	$_header_str	= "";
	var	$_smtp_connect	= "";
	var	$_encoding	= "8bit";
	var     $_IP		= FALSE;
	var	$_smtp_auth	= FALSE;
	var     $_replyto_flag	= FALSE;
	var	$_debug_msg	= array();
	var	$_recipients	= array();
	var	$_cc_array	= array();
	var	$_bcc_array	= array();
	var	$_headers	= array();
	var	$_attach_name	= array();
	var	$_attach_type	= array();
	var	$_attach_disp	= array();
	var	$_protocols	= array('mail', 'sendmail', 'smtp');
	var	$_base_charsets	= array('us-ascii', 'iso-2022-'); // 7-bit charsets (excluding language suffix)
	var	$_bit_depths	= array('7bit', '8bit');
	var	$_priorities	= array('1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)');

こうしておいて、shop_model.phpのsendmail関数を次のように書き換えました。

	// メール送信処理
	function sendmail($mail)
	{
               # Emailクラスをロードし、初期化します。
		$this->load->library('email');
		//$config['protocol'] = 'mail';
		$config['protocol'] = 'smtp'; //プロトコルをsmtpに変更
		$config['charset'] = 'ISO-2022-JP';
		$config['wordwrap'] = FALSE;
		$this->email->initialize($config);

# メールの内容を変数に代入します。
		$from_name = $mail['from_name'];
		$from      = $mail['from'];
		$to        = $mail['to'];
		$bcc       = $mail['bcc'];
		$subject   = $mail['subject'];
		$body      = $mail['body'];

# メールヘッダのMIMEエンコードおよび文字エンコードの変換をします。
		$from_name = mb_encode_mimeheader($from_name, $config['charset']);
		//$subject   = mb_encode_mimeheader($subject,   $config['charset']); //文字化けしました。
		$subject = mb_convert_encoding($subject, $config['charset'], $this->config->item('charset'));

# 本文の文字エンコードを変換します。
		$body = mb_convert_encoding($body, $config['charset'], $this->config->item('charset'));

# 差出人、あて先、Bcc、件名、本文を設定します。
		$this->email->from($from, $from_name);
		$this->email->to($to);
		$this->email->bcc($bcc);
		$this->email->subject($subject);
		$this->email->message($body);

# send()メソッドで実際にメールを送信します。
		if ($this->email->send())
		{
			return TRUE;	
		}
		else
		{
			return FALSE;	
		}
	}

ということですが、メールが送信できませんと、ブラウザの画面は「システムエラー」だけの冷たい表示になります。メールサーバーを借りているのならば、その設定を利用すると良いでしょう。また、レンタル・サーバーでは、mail関数が機能するかも知れません。

さて、CodeIgniterを学んでフレームワークについて感じたことを暫定的にまとめてみます。

  1. フレームワークとはMVCモデルを使って一定の規則でWebアプリケーションを作成できるようにしたものだが、MVCモデルによる作成を可能にするものが、Core Libraries。CodeIgniterでは、root/system/coreの中のクラスライブラリ群がそれと思われる。
  2. Core Librariesに加えて、Webアプリケーションで使うメール送信クラスやPaginationクラスなどの応用クラスLibrariesを提供している。CodeIgniterでは、root/system/librariestがそれ。
  3. CodeIgniterでは、クラスLibrariesの他に、開発に役立つ独自関数をまとめたヘルパー関数が提供されている。root/system/helpersがそれ。
  4. クラスライブラリやヘルパー関数の使い方については、CodeIgniter2.0.3までが、翻訳されている。翻訳サイトは、http://codeigniter.jp/user_guide_jaだが、CodeIgniter2.0.3にも含まれている。
  5. CodeIgniterは兎に角、学習コストが非常に低く、覚えることも少ないので、PHPを学びそれなりのシステムを作れるようになれば、フレームワークとしては、CodeIgniterを使ったら良いと思われます。
  6. FuelPHPはCodeIgniterよりも多機能、高機能ですがその分、動作スピードに制約がでてしまう。

今後の計画としては、①CodeIgniter2.☓では削除されたCRUD機能の代わりになるサードパーティのCRUDシステムを利用して、認証機能付きのバックエンドを作ってみる②「CodeIgniter徹底入門」の第10章レシピ集は既に古くなっており、ライブラリーダウンロードのために記載されているサイト自体が存在しないので、何とかする。これについては、https://ellislab.com/blog/entry/codeigniter-wiki-moved に記載されている内容が頼りになるかもしれないが、必ずしもハッピーになれるわけではないーなどが挙げられます。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA