Alex Rivera | Logout

CakePHP using Email component from Shell cronjob

Asked 2011-06-20T13:32:58.990
12

I'm trying to send an email from a CakePHP shell just as you would from the Controller.

Most of the code below was adapted from this dated article on the Bakery and it's comments. The email is sending, however the line $controller->set('result', $results[$i]); throws the following notices:

Notice: Undefined property: View::$webroot in /home/jmccreary/www/intranet.sazerac.com/cakephp/cake/libs/view/view.php on line 813

PHP Notice: Undefined variable: result in /home/jmccreary/www/intranet.sazerac.com/cakephp/app/views/elements/email/text/nea/task_reminder_it.ctp on line 2

So I'm not getting any of the variables passed to my email view.

How can I do this, ideally following the Cake conventions?

class NotificationShell extends Shell {
    var $uses = array('Employee', 'Task');

    function main() {
        // run if no action is passed
    }

    function nea_task_reminder() {
        // build Task to Employee relationship
        $this->Task->bindModel(array('belongsTo' => array('Employee' => array('className' => 'Employee', 'foreignKey' => 'object_id'))));
        $results = $this->Task->find('all', array('conditions' => array('application_id' => 1, 'completed_by_id' => 0), 'contain' => array('Employee' => array('Contact', 'Position'))));

        $count = count($results);
        if ($count) {
            App::import('Core', 'Controller');
            App::import('Component', 'Email');
            $controller =& new Controller();
            $email =& new EmailComponent();
            $email->startup($controller);

            // send email
            $email->from = Configure::read('Email.from');
            $email->to = 'jmccreary@whatever.com';
            $email->replyTo 
Edit
Report

1 Answer

13

If you're using CakePHP 2.x, you can ditch the EmailComponent entirely and use the CakeEmail class instead.

App::uses('CakeEmail', 'Network/Email');

class NotificationShell extends Shell {
    public function send() {
        $email = new CakeEmail();
    }
}

That entirely avoids all the thorny issues of loading components inside a shell. For email at least.

answered 2012-08-18T15:14:14.233

Your Answer