novembre 20th, 2008Courriel en CC et BCC avec le Helper Email de Kohana
Dernièrement, j’ai eu a programmer l’envoi de courriels en BCC et CC. Comme le site a été fait avec Kohana, j’avais à utiliser le helper Email vue que tous mes courriels envoyés était avec ce dit helper. Après avoir fouillé quelque peu je me suis rendu compte que rien n’était prévu pour faire envoyer un courriel comme je le voulais.
Le helper de Kohana utilise Swift Mailer qui est une application PHP5 pour envoyer un courriel à l’aide en autre d’un serveur SMTP. Je devais donc modifier le helper de Kohana pour mon problème. Alors, voici comment j’ai procédé.
1. Copier le fichier Email du dossier System/Helper vers Applcation/Helper.
L’ordre de chargement des fichiers dans Kohana est Modules/Application/System. En plaçant le fichier dans le dossier application, on évite de modifier le fichier de base au cas ou un problème survient.
2. Reprogrammer la fonction send
La fonction send de base ressemble à ceci :
public static function send($to, $from, $subject, $message, $html = FALSE)
{
// Connect to SwiftMailer
(self::$mail === NULL) and email::connect();// Determine the message type
$html = ($html === TRUE) ? 'text/html' : 'text/plain';
// Create the message
$message = new Swift_Message($subject, $message, $html, '8bit', 'utf-8')
// Make a personalized To: address
$to = is_array($to) ? new Swift_Address($to[0], $to[1]) : new Swift_Address($to);
// Make a personalized From: address
$from = is_array($from) ? new Swift_Address($from[0], $from[1]) : new Swift_Address($from);
return self::$mail->send($message, $to, $from);
}
Pour commencer, on doit déclarer un objet Switf_RecipientList qui va contenir toutes les adresses courriel et nom de nos destinataires. Ensuite, on doit modifier la manière de gérer la variable $to. J’ai commencé par modifier le nom d’argument pour qu’il soit plus significatif. Donc $to devient $addresslist. Avec Kohana la variable du courriel de destination peut-être une chaine de texte ou un tableau :
Email::send('test@courriel.com');
//ou
Email::send(array('test@courriel.com','Le nom du destinataire'))
Cette technique sera encore valide. Par contre, nous allons ajouter la possibilité d’envoyer le courriel comme ceci :
$addresslist = array();
$addresslist['to'][] = 'test@courriel.com';
$addresslist['cc'][] = array('test2@courriel.com','Nom du destinataire en cc');
$addresslist['bcc'][] = array('test3@courriel.com','Nom du destinataire en bcc 1');
$addresslist['bcc'][] = array('test4@courriel.com','Nom du destinataire en bcc 2');
Email::send($addresslist);
Tout d’abord, on doit vérifier si la variable est sous la vieille forme ou la nouvelle
// Make a personalized To: address
$keys = array_keys($addresslist);
$isnumeric=false;
foreach($keys as $key){
if(is_numeric($key)){
$isnumeric=true;
}
}
//la variable $isnumeric sera true si c'est la vieille version sinon c'est la nouvelle version
Ensuite on parcourt le tableau. La première alternative nous amène dans le code pour la vieille ou la nouvelle version de la variable. Pour la vieille version c’est la même chose que le helper de base de Kohana.
Le deuxième foreach sert à parcourir les nombreux courriels de type to,cc ou bcc. Ensuite on utilise le même code que Kohana pour obtenir un objet Swift_Address selon si c’est une chaine de texte ou un tableau. Pour finir, on ajoute l’objet retourné à l’objet Swift. Voici la fonciton send dans son entièreté :
public static function send($addresslist, $from, $subject, $message, $html = FALSE)
{
// Connect to SwiftMailer
(self::$mail === NULL) and email::connect();
// Determine the message type
$html = ($html === TRUE) ? 'text/html' : 'text/plain';
// Create the message
$message = new Swift_Message($subject, $message, $html, '8bit', 'utf-8');
$recipient = new Swift_RecipientList();
// Make a personalized To: address
$keys = array_keys($addresslist);
$isnumeric=false;
foreach($keys as $key){
if(is_numeric($key)){
$isnumeric=true;
}
}
if(is_array($addresslist) && !$isnumeric){
foreach($addresslist as $key=>$listofelement){
foreach($listofelement as $element){
$address = is_array($element) ? new Swift_Address($element[0], $element[1]) : new Swift_Address($element);
$recipient->add($address,false,$key);
}
}
}else{
$address = is_array($addresslist) ? new Swift_Address($addresslist[0], $addresslist[1]) : new Swift_Address($addresslist);
$recipient->add($address,false,'to');
}
// Make a personalized From: address
$from = is_array($from) ? new Swift_Address($from[0], $from[1]) : new Swift_Address($from);
return self::$mail->send($message, $recipient, $from);
}










novembre 20th, 2008 at 19:55
Petite question têteuse : as-tu modifié directement le fichier du helper dans Kohana ou tu as “extendé” la classe du helper, comme le permet Kohana?
novembre 21st, 2008 at 16:06
J’ai modifié le fichier directement. Est-ce que j’aurais du créer un nouveau fichier avec une classe My_Helper extends Helper et y insérer ma fonction send dedans? Si c’est le cas, j’avoue que ça serait plus propre et ça exploiterait beaucoup mieux la POO de PHP5.
janvier 3rd, 2009 at 9:30
En effet tu aurais du procédé ainsi.
Le but est de pouvoir utiliser le dossier system pour plusieurs applications, par exemple 1 site web avec 3-4 sous domaine et le tout avec un seul dossier system.
Puis si tu modifie le helper dans le systeme ce sera affecté partout, peut etre que dans tes besoins c’était pas un souci, mais dans certains cas sa peut poser souci puis lors d’une mise à jour, tu t’embêtes pas à refaire la modif.
Mikaweb
janvier 3rd, 2009 at 11:08
J’en prend note. Par contre j’ai spécifié dans le point 1 de copier le fichier du dossier system vers le dossier applications.