CodeIgniter > Qdmail
PHP製のメール送信ライブラリ「Qdmail」
Qdmailとは、PHPのマルチバイト環境(特に日本語)にて、「文字化けしない」「簡単に"デコメ(デコメール)"やHTMLメール等の電子メールを送信することができる」メールクラスライブラリです。文字化け完全制覇を目指しています。
メール送信の文字化けで困ったら、Qdmailと。
ありがたく使わせていただきます。m(__)m
公式サイトにあった説明。
CIことCodeIgniterでもQdmailを利用して簡単に日本語メールを送信することができます。(CodeIgniter1.6.3にて動作確認)
携帯デコメもOK
#code(php){{
include('qdmail.php');
class Mail extends Controller {
function sendmail(){ $data = array('hello'=>'こんにちは'); $content=$this->load->view('mailview',$data,true); qd_send_mail('html','address@example.com','件名',$content,'from@example.com'); }
}
}}
$this->load->view メソッドの第3引数をtrueにするのがポイントです。
これで、$this->load->viewは画面に返すのでなく、画面に書くべき内容を返り値として渡してくれます。
このやり方だと、qdmail.phpをコントローラーと同じディレクトリ
/application/controllers/
に置かなきゃいけないので、管理しづらい。
やはり、ライブラリのファイルは、
/application/libraries/
に置いて使った方が、管理上は分かりやすいだろう。
QdmailをCodeIgniterのライブラリとして使ってみよう。
(参考)CodeIgniter ライブラリの作成
http://codeigniter.jp/user_guide_ja/general/creating_libraries.html
qdmail.phpを
/application/libraries/qdmail.php
に置く。
CodeIgniterのユーザー作成ライブラリのファイル「Mailer.php」を、
/application/libraries/Mailer.php
に作成する。
Mailer.phpの中身は以下のようにする。
#code(php){{
?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*** Library with Qdmail for CodeIgniter 2.0 * http://hal456.net/qdmail/ */require_once 'qdmail.php';
class Mailer extends Qdmail
{
public function __construct($option = array()) { parent::__construct($option); }
}
/* End of file welcome.php */
/* Location: ./application/libraries/Mailer.php */
}}
コントローラーからライブラリを呼び出して使う。
以下のようなメソッドを用意して、Qdmailを利用する。
#code(php){{
?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Form extends CI_Controller
{
public function index() { echo 'メールフォームのトップページです。'; }
public function send() { $mail['from_name'] = 'Kenshiro Kasumi'; $mail['from'] = 'ken@hokutoshinken.jp'; $mail['to'] = 'raoh@kenoh-gun.com'; $mail['subject'] = '北斗同窓会のご案内'; $mail['body'] = '来週の金曜日の予定です。'; // sendmail if ($this->_sendmail($mail)) { echo 'メール送信OK'; } else { echo 'メール送信エラー'; } }
private function _sendmail($mail = array()) { // Qdmail $this->load->library('mailer'); $this->mailer->from($mail['from'], $mail['from_name']); $this->mailer->to($mail['to']); $this->mailer->subject($mail['subject']); $this->mailer->text($mail['body']); // テキストメール return $this->mailer->send(); }
}
?>
}}
$this->mailer->の後ろのメソッドは、Qdmailのメソッドを同じになります。
Qdmailを拡張して、メソッドチェーン(メソッドを連続して使用)ができるようにしたライブラリが紹介されていました。
国産高機能メールライブラリのPHP高機能日本語メール送信ライブラリ・文字化けフリー - Qdmail - PHP::Mail Library , Quick and Detailed for MultibyteをCodeIgniter(以下CI)で使いやすいようにライブラリ化してみた。CI既存ののEmailライブラリとインターフェースは合わせてるので、使いやすいのではないかと。あと例によってメソッドチェーンできるようにしてます。
#code(php){{
?php
class Home extends CI_Controller {
public function __construct() { parent::__construct(); }
public function index() { $this->load->library('mailer'); $ret = $this->mailer->to('test@test.org', 'なまえ') ->subject('テスト送信') ->message('テストメッセージ') ->from('hoge@hoge.com', 'テストほげ') ->cc('test@test.com', 'テスト') ->bcc('test@test.jp') ->send(); $this->load->view('home'); }
}
}}
$this->mailerの後に続けて、メソッドを連続して使用できるんですね!
記述が簡便になって、便利そうです。
#code(php){{
?php
require_once 'qdmail.php';
require_once 'qdsmtp.php';
/**
* Mail Library * * @author localdisk */
class Mailer {
/** * mailer * * @var Qdmail */ private $_mailer;
public function __construct($option = array()) { $this->_mailer = new Qdmail(); $this->initialize($option); }
/** * initialize * * @param array $config */ public function initialize($config = array()) { if (strtolower($config['protocol']) === 'smtp') { $this->_mailer->smtp(TRUE); $param = array(); if ($config['smtp_user'] === '' && $config['smtp_pass'] === '') { $param['protocol'] = 'SMTP'; } else { $param['protocol'] = 'SMTP_AUTH'; $param['user'] = $config['smtp_user']; $param['pass'] = $config['smtp_pass']; } $param['host'] = $config['smtp_host']; $param['port'] = (isset($config['smtp_port']) === FALSE) ? 25 : $config['smtp_port']; $this->_mailer->smtpServer($param); } }
/** * to * * @param mixed $addr * @param mixed $name * @param boolean $add * @return Mailer */ public function to($addr = null, $name = null, $add = FALSE) { $this->_mailer->to($addr, $name, $add); return $this; }
/** * subject * * @param string $subj * @return Mailer */ public function subject($subj = null) { $this->_mailer->subject($subj); return $this; }
/** * text * * @param string $cont * @param string $length * @param string $charset * @param string $enc * @param string $org_charset * @return Mailer */ public function text($cont, $length = null, $charset = null, $enc = null, $org_charset = null) { $this->_mailer->text($cont, $length, $charset, $enc, $org_charset); return $this; }
/** * message * Email Libarary の互換メソッド * * @param string $body * @return Mailer */ public function message($body) { $this->text($body); return $this; }
/** * from * * @param string $addr * @param string $name * @return Mailer */ public function from($addr = null, $name = null) { $this->_mailer->from($addr, $name); return $this; }
/** * send * * @param mixed $option */ public function send($option = null) { $this->_mailer->send($option); }
/** * cc * * @param mixed $addr * @param mixed $name * @param boolean $add * @return Mailer */ public function cc($addr = null, $name = null, $add = false) { $this->_mailer->cc($addr, $name, $add); return $this; }
/** * bcc * * @param mixed $addr * @param mixed $name * @param boolean $add * @return Mailer */ public function bcc($addr = null, $name = null, $add = false) { $this->_mailer->bcc($addr, $name, $add); return $this; }
/** * reply_to * * @param mixed $addr * @param mixed $name * @return Mailer */ public function reply_to($addr = null, $name = null) { $this->_mailer->replyto($addr, $name); return $this; }
/** * clear * * @return Mailer */ public function clear() { $this->_mailer->reset(); return $this; }
/** * attach * * @param string $param * @param boolean $add * @return Mailer */ public function attach($param, $add = false) { $this->_mailer->attach($param, $add); return $this; }
/** * print_debugger * * @return string */ public function print_debugger() { $msg = '<pre>'; $msg = 'to: ' . print_r($this->_mailer->to, TRUE) . "\n"; $msg .= 'cc:' . print_r($this->_mailer->cc, TRUE) . "\n"; $msg .= 'bcc:' . print_r($this->_mailer->bcc, TRUE) . "\n"; $msg .= 'from:' . print_r($this->_mailer->from, TRUE) . "\n"; $msg .= 'replyto:' . print_r($this->_mailer->replyto, TRUE) . "\n"; $msg .= 'otherheader:' . print_r($this->_mailer->other_header, TRUE) . "\n"; $msg .= 'subject:' . print_r($this->_mailer->subject, TRUE) . "\n"; $msg .= 'subject:' . print_r($this->_mailer->subject, TRUE) . "\n"; $msg .= 'body:' . print_r($this->_mailer->content, TRUE) . "\n"; $msg .= '</pre>'; return $msg; }
/** * __call * * @param mixed $name * @param mixed $arguments * @return mixed */ public function __call($name, $arguments) { if (!method_exists($this->_mailer, $name)) { return FALSE; } if (!is_callable(array($this->_mailer, $name), TRUE)) { return FALSE; } return call_user_func_array(array($this->_mailer, $name), $arguments); }
}
}}
qdmail.phpと共に、qdsmtp.phpも利用されていました。
PHPでメール送信をするときに文字化けに悩まされたら、Qdmailを使うと大概解決します。
Qdmailは、MITライセンスで配布されていました。(=とても自由に使えます)
CodeIgniterでもQdmailを使わせていただければと存じます。