Подтвердить что ты не робот

CakePHP с использованием компонента электронной почты из Shell cronjob

Я пытаюсь отправить электронное письмо из оболочки CakePHP так же, как и с контроллера.

Большая часть приведенного ниже кода была адаптирована из этой датированной статьи о хлебопечении, и она комментирует. Электронная почта отправляется, однако строка $controller->set('result', $results[$i]); выдает следующие уведомления:

Примечание: Undefined свойство: Просмотр:: $webroot в /home/jmccreary/www/intranet.sazerac.com/cakephp/cake/libs/view/view.php on line 813

Примечание PHP: Undefinedпеременная: результат /home/jmccreary/www/intranet.sazerac.com/cakephp/app/views/elements/email/text/nea/task_reminder_it.ctp в строке 2

Таким образом, я не получаю никаких переменных, переданных в мой адрес электронной почты.

Как я могу это сделать, в идеале следуя соглашениям Cake?

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 = '[email protected]';
            $email->replyTo = '[email protected]';
            $email->template = 'nea/task_reminder_it';
            $email->sendAs = 'text';

            for ($i = 0; $i < $count; ++$i) {
                $email->subject = 'NEA Notification: Task Reminder for ' . $results[$i]['Employee']['Contact']['full_name'];
                $controller->set('result', $results[$i]);
                $email->send();
            }
        }
    }
}
4b9b3361

Ответ 1

Проблема заключается в том, как вы инициализируете класс EmailComponent. Если вы посмотрите на исходный код, метод startup() фактически не имеет тела, поэтому он ничего не делает. Ваш контроллер на самом деле не назначен EmailComponent. Проблема не в $controller->set('results', ...);. Вам нужно использовать EmailComponent::initialize() вместо EmailComponent::startup().

$controller =& new Controller();
$email =& new EmailComponent(null);
$email->initialize($controller);

Источники:

Ответ 2

Если вы используете CakePHP 2.x, вы можете полностью отключить EmailComponent и использовать CakeEmail класс.

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

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

Это полностью устраняет все тернистые проблемы загрузки компонентов внутри оболочки. Для электронной почты как минимум.

Ответ 3

Если вы используете CakePHP 2.x, попробуйте вместо этого использовать CakeEmail.

CakeEmail#viewVars() предоставляет параметры для шаблона.

Вот пример использования CakeEmail из Shell. https://gist.github.com/tsmsogn/cee9cef2e851e7684021

Ответ 4

Попробуйте это.

App::import('Core', 'Controller');
App::import('Component', 'Email');
$this->Controller =& new Controller();
$this->Email =& new EmailComponent(null);
$this->Email->initialize($this->Controller);    

//use set function as below  
$this->controller->set('result', $results[$i]);

для получения дополнительной информации нажмите ссылку ниже:

http://ask.cakephp.org/info/view/cron_shell_-_mail