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);
}
Partagez cette article: Ces icônes sont des liens vers des sites de partage de signet sociaux où les lecteurs peuvent partager et découvrir de nouveaux liens.
  • Digg
  • Facebook
  • del.icio.us
  • Google
  • Live
  • Pownce
  • Wikio FR
  • Mixx
  • Sphinn
  • StumbleUpon

Ajouter mon fil RSS à votre agrégateur de contenu préféré.