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正式版が出たらもっと使っていけたらいいかもと思います。