Comment exécuter une tache Cron dans mon Controller Cakephp et envoyer mail
Bonjour,
Je ne sais pas si vous vous connaissez en Anglais ou c'est permis de poster ici
mais honnêtement je galère alors voila pour ne pas tout reprendre j'ai tout détaillé ici
https://stackoverflow.com/questions/...-event-cakephp
En gros je veux exécuter une tache Cron qui envoi des emails, mon problème c'est que je voudrais l'appeler dans mon controller mais je cherche aussi a ce que mon email s’exécute quand par exemple un utilisateur a créer un nouvel événement,
Donc si cette utilisateur a créer un événement -> lui envoyer un email et démarrer la tache cron !
Je dois dabord recevoir l'email de l'utilisateur actuellement connecté dans mon index
Au passage j’exécute cette library PHPMailer pour les mail https://github.com/PHPMailer/PHPMailer
j'utilise cakephp 3.6 sous windows
Exemple utilisateur connecté :
Code:
1 2
|
$this->set('user_session', $this->request->session()->read('Auth.User')); |
EventsController.php
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Console\ShellDispatcher;
use Cake\Routing\Router;
use Cake\Event\Event;
class EventsController extends AppController
{
public $components = array("Email");
public function index()
{
//$to = $user_session['email'];
$to = 'exemple@gmail.com';
$subject = 'Hi buddy, i got a message for you.';
$message = 'Nothing much. Just test out my Email Component using PHPMailer.';
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;
}
public function run($username = null){
$shell = new ShellDispatcher();
$output = $shell->run(['cake', 'users', $username]);
debug($output);
if ($output === 0){
echo "Shell Command execute";
}else{
echo "Fail Command execute";
}
exit;
}
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)) {
//function send_mail to user who crated Event
$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');
}
} |
UsersShell
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
<?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 main()
{
if (empty($this->args[0])) {
Log::write('debug', "Please enter a username.");
return $this->abort('Please enter a username.');
return false;
}
$user = $this->Users->findByUsername($this->args[0])->first();
if ($user)
{
Log::write('debug', "Welcome to ". $user->username);
$this->out("Welcome to ". $user->username);
return true;
} else
{
Log::write('debug', 'User cannot be found');
$this->abort('User cannot be found', 128);
return false;
}
}
public function mail()
{
if (empty($this->args[0])) {
return $this->abort('Please enter a email address.');
}
$to = $this->args[0];
$subject = 'Hi buddy, i got a message for you.';
$message = 'Just test out my Email Component using PHPMailer.';
$mail = $this->Email->send_mail($to, $subject, $message);
if ($mail) {
$this->out("Mail Successfully Sent For :: ". $to);
} else {
$this->out("Mail Error.");
}
}
} |
EmailComponent
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
<?php namespaceApp\Controller\Component;
useCake\Controller\Component;
useCake\Core\App;usePHPMailer\PHPMailer\PHPMailer;
usePHPMailer\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';
classEmailComponentextendsComponent{publicfunction send_mail($to, $subject, $message){ $sender ="xxx@gmail.com";// this will be overwritten by GMail
$header ="X-Mailer: PHP/".phpversion()."Return-Path:
$sender"; $mail =newPHPMailer(); $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="xxxxxx";
$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!");
}}} |
Et comment l'appeler dans ma vue ?
index.ctp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
<li role="presentation" class="dropdown">
<a href="javascript:;" class="dropdown-toggle info-number" data-toggle="dropdown" aria-expanded="false">
<i class="fa fa-envelope-o"></i>
<span class="badge bg-green">6</span>
</a>
<ul id="menu1" class="dropdown-menu list-unstyled msg_list" role="menu">
<li>
<a>r
<span class="image"><?php echo $this->Html->image($user_session['photo']); ?></span>
<span>
<span>Zak</span>
<span class="time">3 mins ago</span>
</span>
<span class="message">
Film festivals used to be do-or-die moments for movie makers. They were where...
</span>
</a>
</li> |