CakePHP1.3で作る会員管理システム(15) メール送信
メール送信
ここで会員登録時のメール送信を作ります。 Emailコンポーネントの使い方は本家サイトのドキュメントの通りです。
/app 直下の app_controller.php を開いて、
class AppController extends Controller { }となっている中に、
var $components = array('Session', 'Email');と入れます。
そして、以下のようなファンクションを入れます。
function _sendEmail($template, $subject, $to, $attachments, $from, $replyto, $fromName, $sendAs, $bcc) { if (!$from) {$from = 'your@email';} if (!$replyto) {$replyto = 'your@email';} if ($fromName) {$from = $fromName . " <$from>";} $this->Email->to = $to; $this->Email->bcc = $bcc; $this->Email->subject = $subject; $this->Email->replyTo = $replyto; $this->Email->from = $from; $this->Email->template = $template; if ($attachments) {$this->Email->attachments = $attachments;} $this->Email->sendAs = $sendAs; $this->Email->send(); }
smtp で送信する場合は、$this->Email->send() の部分を以下に書き換えます。
$this->Email->smtpOptions = array( 'port'=>'587', 'timeout'=>'30', 'host' => 'your.host.name', 'username'=>'username', 'password'=>'password' ); $this->Email->delivery = 'smtp'; $this->Email->send(); $this->set('smtp-errors', $this->Email->smtpError);
gmailで送る場合は、smtpOptions のところを以下のようにします。
$this->Email->smtpOptions = array( 'port'=>'465', 'timeout'=>'30', 'host' => 'ssl://smtp.gmail.com', 'username'=>'your@email', 'password'=>'yourpassword' );
メールの文字コードは、デフォルトだとUTF-8で送られます。 charsetは以下で設定できますが、ISO-2022-JP にすると subject が文字化けするようです。
$this->Email->charset = "ISO-2022-JP";
from のメールアドレスは固定だし、text形式のメールしか送らない、というのであれば、 最初に設定した app_controller.php で、
var $components = array( 'Session', 'Email' => array( 'from' => 'your@email', 'sendAs' => 'text', ), );というように書くこともできます。
こうすると、function _sendEmail() の中では指定する必要がありません。
// $this->Email->sendAs = $sendAs;
つまり、var $components の方にどんどん指定していってしまうと、function _sendEmail() の方に書くことがなくなり、どんどん減っていきます。
自分の使いやすいと思うあたりに調節すればよいと思います。
メール文面のテンプレートは、まずレイアウトを
- /app/views/layouts/email/html/default.ctp
- /app/views/layouts/email/text/default.ctp
テキストメールの場合は、とりあえず、default.ctp に
<?php echo $content_for_layout; ?>とだけ書いて保存します。
文面は
- /app/elements/email/html/default.ctp
- /app/elements/email/text/default.ctp
文面は普通に、確認画面の view.ctp と同じように作ればいいと思います。
以下の会員登録がありました。 ----------------------------------------------------- メールアドレス: <?php echo $member['Member']['email'] ."\n"; ?> 会員種別:<?php echo $types[$member['Member']['type_id']] ."\n"; ?> 誕生日:<?php echo $member['Member']['birthday']['year']; ?>年<?php echo $member['Member']['birthday']['month']; ?>月<?php echo $member['Member']['birthday']['day']; ?>日 好きな物: <?php if (!empty($member['Favorite'])) { foreach ($member['Favorite']['Favorite'] as $favorite) { echo "\t".$favorites[$favorite['id']]."\n"; } } ?>
こんな感じです。
こちらの elements の中の方のファイル名を上記 $this->Email->template に指定します。
ここではとりあえず、
/app/elements/email/text/member_add.ctpとしました。
で、コントローラ members_cntroller.php のアクション add のsaveしてる部分の下に
} else { $this->Member->create(); if ($this->Member->save($this->data)) { $this->set('member', $this->data); $attachments = array(); $this->_sendEmail('member_add', 'ユーザー登録のお知らせ', 'your@email', $attachments,'','','','text',array()); $this->Session->setFlash(__('The member has been saved', true)); $this->redirect(array('action' => 'complete')); } else { $this->Session->setFlash(__('The member could not be saved. Please, try again.', true)); } }を入れます。
メールを受信して確認します。