如何调用外壳函数到另一个控制器-Cakephp

时间:2018-07-02 03:55:56

标签: shell email cakephp controller

我正在外壳中使用此功能发送电子邮件

编辑: UsersShell

<?php
namespace App\Shell;

use Cake\Console\Shell;
use Cake\Log\Log;
use Cake\Controller\Component;
use Cake\Controller\ComponentRegistry;
use App\Controller\Component\EmailComponent;

class UsersShell extends Shell
{
public function initialize()
{
    parent::initialize();
    $this->loadModel('Users');
    //Load Component 
    $this->Email = new EmailComponent(new ComponentRegistry());
}
public function mail()
{
    $to = 'exemple@gmail.com';
    $subject = 'Hi buddy, i got a message for you.';
    $message = 'User created new event';

    try {
        $mail = $this->Email->send_mail($to, $subject, $message);
        print_r($mail);
    } catch (Exception $e) {
        echo 'Message could not be sent. Mailer Error: ', $mail- 
 >ErrorInfo;
    }
    exit;   

}

我想知道如何在控制器中调用它?此处

编辑:事件位于plugins文件夹中

EventsController

<?php

namespace FullCalendar\Controller;

use FullCalendar\Controller\FullCalendarAppController;
use Cake\Routing\Router;
use Cake\Event\Event;
use Cake\Console\ShellDispatcher;

class EventsController extends FullCalendarAppController
{
public $name = 'Events';

public function add()
{
    $event = $this->Events->newEntity();
    if ($this->request->is('post')) {
        $event = $this->Events->patchEntity($event, $this->request->data);
        if ($this->Events->save($event)) {

           /* $shell = new ShellDispatcher();
            $output = $shell->run(['cake', 'users'], ['plugin' => 
           'Events']);

            if (0 === $output) {
            $this->Flash->success('Success from shell command.');
            } else {
            $this->Flash->error('Failure from shell command.'); */

            $this->Flash->success(__('The event has been saved.'));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__('The event could not be saved. Please, 
    try again.'));
        }
    }
    $this->set('eventTypes', $this->Events->EventTypes->find('list'));
    $this->set(compact('event'));
    $this->set('_serialize', ['event']);
    $this->set('user_session', $this->request->session()- 
 >read('Auth.User'));
    $this->viewBuilder()->setLayout('user');
}

如您所见,我使用了已分派的外壳,我不确定它是否正确 但我失败了 谢谢!

编辑:

EmailComponent

<?php
namespace App\Controller\Component;

use Cake\Controller\Component;
use Cake\Core\App;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require ROOT. '/vendor/phpmailer/phpmailer/src/Exception.php';
require ROOT. '/vendor/phpmailer/phpmailer/src/PHPMailer.php';
require ROOT. '/vendor/phpmailer/phpmailer/src/SMTP.php';

class EmailComponent extends Component {

public function send_mail($to, $subject, $message)
{
    // date_default_timezone_set('Asia/Calcutta');

    $sender = "exemple@gmail.com"; // this will be overwritten by GMail

    $header = "X-Mailer: PHP/".phpversion() . "Return-Path: $sender";

    $mail = new PHPMailer();

    $mail->SMTPDebug  = 2; // turn it off in production
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com'; 
    $mail->SMTPAuth = true;
    $mail->Username   = "exemple@gmail.com";  
    $mail->Password   = "xxxx";
    $mail->SMTPSecure = "tls"; // ssl and tls
    $mail->Port = 587; // 465 and 587

    $mail->SMTPOptions = array (
        'tls' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        ),
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        )
    );

    $mail->From = $sender;
    $mail->FromName = "From Me";

    $mail->AddAddress($to);

    $mail->isHTML(true);
    $mail->CreateHeader($header);

    $mail->Subject = $subject;
    $mail->Body    = nl2br($message);
    $mail->AltBody = nl2br($message);

    // return an array with two keys: error & message
    if(!$mail->Send()) {
        return array('error' => true, 'message' => 'Mailer Error: ' . $mail->ErrorInfo);
    } else {
        return array('error' => false, 'message' =>  "Message sent!");
    }
}

}

2 个答案:

答案 0 :(得分:0)

如果我错了,请纠正我。首先,必须启动类似这样的外壳程序。

class UsersShell extends AppShell { 

      public function main(){ //change name here to main
         $to = 'exemple@gmail.com';
         $subject = 'Hi buddy, i got a message for you.';
         $message = 'User created new event';

         try {
             $mail = $this->Email->send_mail($to, $subject, $message);
             print_r($mail);
         } catch (Exception $e) {
             echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
         }
         exit;   
     }       

}

顺便说一句,如果要检查输出,则必须返回类似truefalse的内容。否则,执行外壳程序后就没有必要检查输出了。

答案 1 :(得分:0)

  

首先在CakePHP-CLI中运行Shell命令。像这样

bin/cake users mail

如果shell命令成功运行。 Shell类很好。

  

下一步在Controller中使用Shell

<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Console\ShellDispatcher;

class PagesController extends AppController
{
    /**
     * Run shell command
     */
    public function run()
    {
        $shell = new ShellDispatcher();
        $output = $shell->run(['cake', 'users', 'mail']);
        // $output = $shell->run(['cake', 'users', 'mail', 'email']); // [pass arguments]
        // debug($output);

        if ($output === 0) {
            echo "Shell Command execute";
        } else {
            echo "Failure form shell command";
        }

        exit;
    }
}

更改Shell功能:如果未发送的邮件运行$this->abort()函数并返回(int) 1,并且发送成功的邮件运行$this->out()函数并返回(int) 0

/**
 * Send Mail with shell command
 */
public function mail()
{
    $to = 'mail@gmail.com';
    $subject = 'Hi buddy, i got a message for you.';
    $message = 'Nothing much. Just test out my Email Component using PHPMailer.';

    $mail = $this->Email->send_mail($to, $subject, $message);
    // debug($mail);
    if ($mail['error'] === false) {
        $this->out("Mail Successfully Sent For :: ". $to);
    } else {
        $this->abort("Mail Error.");
    }
}