Un plugin pour faciliter l’envoi d’emails
Ce plugin fournit un composant Mailer qui étend le composant Email du cœur de CakePHP. Ce composant Mailer peut alors être étendu pour définir des mailers propres à l’application dans lesquels des méthodes se chargent de paramétrer les emails. Cela évite de surcharger les contrôleurs avec de nombreuses méthodes dans AppController et permet de facilement envoyer des emails en une ligne de code : $this->UserMailer->sendSignup($user).
Il remplace également le mode de debug en écrivant les emails dans le fichier tmp/log/error.log. Cela permet de débugguer facilement avec tail -f ou un utilitaire comme Console.
Note : ce plugin requiert PHP5 à cause de __call. Les composants étendent Object directement, je n’ai donc pas pu utiliser les fonctionnalités offertes par Overloadable.
Installation
- Cloner depuis github : dans le répertoire plugins taper
git clone git://github.com/msadouni/cakephp-mailer-plugin.git mailer
- Ajouter en sous-module git : dans le répertoire app taper
git submodule add git://github.com/msadouni/cakephp-mailer-plugin.git plugins/mailer
- Télécharger une archive depuis github et l’extraire dans
/plugins/mailer
Utilisation
Nous créons un mailer dans le répertoire controller/components :
<?php // controllers/components/user_mailer.php App::import('Plugin', 'Mailer.Mailer'); class UserMailerComponent extends MailerComponent { /** * Définit les paramètres d'un email d'inscription */ function signup($user) { if (empty($user['User']['email'])) { return false; } $this->from = 'do-not-reply@example.com'; $this->to = $user['User']['email']; $this->subject = "Welcome !"; $this->Controller->set('user', $user); } /** * Définit les paramètres communs pour les emails UserMailer */ function _prepare() { parent::_prepare(); $this->sendAs = 'text'; } } ?>
Nous utilisons ensuite le mailer dans le contrôleur :
<?php // controllers/users_controller.php class UsersController extends AppController { var $components = array('UserMailer'); function signup() { $user = $this->User->signup($this->data); if (!empty($user)) { $this->UserMailer->sendSignup($user); } } } ?>
Le mailer cherche « automagiquement » une vue dans views/elements/email/<format>/<mailer>/<methode>.ctp. Pour cette exemple il utiliserait views/elements/email/text/user_mailer/signup.ctp.
La méthode « magique » sendMethode commence par appeler _prepare, soit celle de base dans MailerComponent, soit la version surchargée du composant mailer personnalisé. Elle appelle ensuite methode dans le mailer qui initialise l’email, et finalement appelle send.
Tout ce fonctionnement « magique » est bien sympathique, mais parfois nous avons besoin de spécifier nos propres paramètres. Pas de problème, cela est possible. Une méthode de MailerComponent peut appeler _setTemplate('autre_dossier/autre_vue) :
// controllers/components/user_mailer.php function signup($user) { if (empty($user['User']['email'])) { return false; } $this->_setTemplate('cookie_mailer/supprimer_compte'); // Oui c'est stupide, mais on peut le faire :) $this->from = 'do-not-reply@example.com'; $this->to = $user['User']['email']; $this->subject = "Welcome !"; $this->Controller->set('user', $user); }
Si pour une raison ou une autre nous souhaitons utiliser la vue automatique manuellement, nous pouvons aussi :
// controllers/components/user_mailer.php function signup($user) { if (empty($user['User']['email'])) { return false; } $this->_setTemplate(); // Pas nécessaire car l'envoi le fait automatiquement, mais cela fonctionne $this->from = 'do-not-reply@example.com'; $this->to = $user['User']['email']; $this->subject = "Welcome !"; $this->Controller->set('user', $user); }
Le code du plugin est disponible sur GitHub, n’hésitez pas à le forker et à proposer des améliorations !
Commentaires
17 novembre 2009 à 15:31
Testé et approuvé, merci Matthieu
18 janvier 2010 à 13:16
Je trouve que c’est un peu dur à appréhender pour un débutant, mais après un petit temps d’adaptation on comprend sa grandeur.
28 avril 2010 à 16:41
Merci
Je viens de le mettre à jour pour être compatible avec la version 1.3 de CakePHP : http://github.com/msadouni/cakephp-mailer-plugin
La version compatible avec la branche 1.2.x est ici : http://github.com/msadouni/cakephp-mailer-plugin/tree/1.2.x