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é :
EventsController.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $this->set('user_session', $this->request->session()->read('Auth.User'));
UsersShell
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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'); } }
EmailComponent
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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."); } } }
Et comment l'appeler dans ma vue ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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!"); }}}
index.ctp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>
Partager