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

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>