アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

CakePHPのShellからメール送信

こんにちは、中川です。
最近CakePHPはあまりさわってなかったのですが、久々にCakeからメール送信するバッチ処理を書くことがありまして、簡単に紹介したいと思います。

CakePHPでメール送信ですが、EmailComponent使いたいと思います。

テンプレートを使って送信する場合(テキストメールだと)、

/path/to/myproj/app/views/elements/email/text/hoge.ctp


<?php echo $user_name ?> さん

メールテストです!


メールテンプレートを作成し、アクションからは、

hoge_controller.php


<?php
・
・
var $components = array('Email'); 
・
・
function _sendMail() {
	$this->Email->from = 'Somebody <somebody@example.com>';
	$this->Email->to = 'Somebody Else <somebody.else@example.com>';
	$this->Email->subject = 'Test';
	// テンプレートはhoge.ctpを使用
	$this->Email->template = "hoge";
	// 'html'(HTML)、'text'(テキスト)、または'both'(両方)で送信。(デフォルトは 'text')。
	$this->Email->sendAs = 'text';
	// ビュー変数を普通に渡す。
	$this->set('foo', $foo);
	$this->Email->send();
}
・
・
?>


とこんな感じで簡単に送信できます。
しかし、今回は、バッチ処理で送りたいので、CakePHPのシェルとしてスクリプトを作成します。

Shellとして、作った場合、



var $components = array('Email'); 


このような使い方ができないようなので、startupメソッドでimportしたEmailコンポーネントインスタンス化しています。また、メールテンプレートに変数を渡すために、インスタンス化したEmailコンポーネントにControllerのオブジェクトを渡してやり、Controllerに対して変数をの set を行っています。

以下、完成版です。

/path/to/myproj/app/vendors/shells/hoge.php



<?php
App::import('Core', 'Controller');
App::import('Component', 'Email');

class hogeShell extends Shell {

  function startup(){
    $this->controller = new Controller();
    $this->Email = new EmailComponent($this);
    $this->Email->startup($this->controller);
  }
  
  function main(){
    $this->out("start!!");
    $this->controller->set("user_name", "てすとゆーざー");
    $this->_sendmail();
    $this->out("complete!!");
  }
  
  function _sendmail(){
    $this->Email->to = '#送信先メールアドレス#';
    $this->Email->from = '#送信元メールアドレス#';
    $this->Email->subject = 'TEST SUBJECT!';
    $this->Email->sendAs = "text";
    $this->Email->template = "hoge"; ## /path/to/myproj/app/views/elements/email/text/hoge.ctp 
    $this->Email->send();
    $this->Email->reset();
  }
  
}
?>


まだまだアシアルの開発では、symfonyが多いですが、
CakePHPも1.2正式版が出たらもっと使っていけたらいいかもと思います。