Changeset 68195 in spip-zone for _plugins_/facteur


Ignore:
Timestamp:
Dec 6, 2012, 5:27:27 PM (7 years ago)
Author:
cedric@…
Message:

bugfix : reconnaitre et embarquer les images meme si elles ont une ancre ou une url absolue du site
evolution : permettre de passer un tableau d'option en 4e arg de Facteur. Les options non fournies sont piochees dans la config du plugin, mais cela permet d'utiliser la classe avec ses propres reglages sans devoir hacker les meta
Passage en 2.3.0

Location:
_plugins_/facteur/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/facteur/trunk/classes/facteur.php

    r62827 r68195  
    2222class Facteur extends PHPMailer {
    2323
    24         function Facteur($email, $objet, $message_html, $message_texte) {
     24        /**
     25         * @param $email
     26         * @param $objet
     27         * @param $message_html
     28         * @param $message_texte
     29         * @param array $options
     30         *
     31         */
     32        function Facteur($email, $objet, $message_html, $message_texte, $options = array()) {
     33                $defaut = array(
     34                        'adresse_envoi' => $GLOBALS['meta']['facteur_adresse_envoi'],
     35                        'adresse_envoi_email' => $GLOBALS['meta']['facteur_adresse_envoi_email'],
     36                        'adresse_envoi_nom' => $GLOBALS['meta']['facteur_adresse_envoi_nom'],
     37                        'smtp_sender' => $GLOBALS['meta']['facteur_smtp_sender'],
     38                        'cc' => $GLOBALS['meta']['facteur_cc'],
     39                        'bcc' => $GLOBALS['meta']['facteur_bcc'],
     40                        'smtp' => $GLOBALS['meta']['facteur_smtp'],
     41                        'smtp_host' => $GLOBALS['meta']['facteur_smtp_host'],
     42                        'smtp_port' => $GLOBALS['meta']['facteur_smtp_port'],
     43                        'smtp_auth' => $GLOBALS['meta']['facteur_smtp_auth'],
     44                        'smtp_username' => $GLOBALS['meta']['facteur_smtp_username'],
     45                        'smtp_password' => $GLOBALS['meta']['facteur_smtp_password'],
     46                        'smtp_secure' => $GLOBALS['meta']['facteur_smtp_secure'],
     47                        'filtre_images' => $GLOBALS['meta']['facteur_filtre_images'],
     48                        'filtre_iso_8859' => $GLOBALS['meta']['facteur_filtre_iso_8859'],
     49                );
     50                $options = array_merge($defaut, $options);
    2551
    2652                if (defined('_FACTEUR_DEBUG_SMTP')) {
    2753                        $this->SMTPDebug = _FACTEUR_DEBUG_SMTP ;
    2854                }
    29                 if ($GLOBALS['meta']['facteur_adresse_envoi'] == 'oui'
    30                   AND $GLOBALS['meta']['facteur_adresse_envoi_email'])
    31                         $this->From = $GLOBALS['meta']['facteur_adresse_envoi_email'];
     55                if ($options['adresse_envoi'] == 'oui'
     56                  AND $options['adresse_envoi_email'])
     57                        $this->From = $options['adresse_envoi_email'];
    3258                else
    3359                        $this->From = (isset($GLOBALS['meta']["email_envoi"]) AND $GLOBALS['meta']["email_envoi"])?
     
    3763                // Si plusieurs emails dans le from, pas de Name !
    3864                if (strpos($this->From,",")===false){
    39                         if ($GLOBALS['meta']['facteur_adresse_envoi'] == 'oui'
    40                           AND $GLOBALS['meta']['facteur_adresse_envoi_nom'])
    41                                 $this->FromName = $GLOBALS['meta']['facteur_adresse_envoi_nom'];
     65                        if ($options['adresse_envoi'] == 'oui'
     66                          AND $options['adresse_envoi_nom'])
     67                                $this->FromName = $options['adresse_envoi_nom'];
    4268                        else
    4369                                $this->FromName = strip_tags(extraire_multi($GLOBALS['meta']['nom_site']));
     
    5985                                spip_log("Erreur AddAddress $email : ".print_r($this->ErrorInfo,true),'facteur');
    6086
    61                 if (!empty($GLOBALS['meta']['facteur_smtp_sender'])) {
    62                         $this->Sender = $GLOBALS['meta']['facteur_smtp_sender'];
     87                if (!empty($options['smtp_sender'])) {
     88                        $this->Sender = $options['smtp_sender'];
    6389                        $this->AddCustomHeader("Errors-To: ".$this->Sender);
    6490                }
    6591
    66                 if (!empty($GLOBALS['meta']['facteur_cc'])) {
    67                         $this->AddCC( $GLOBALS['meta']['facteur_cc'] );
    68                 }
    69                 if (!empty($GLOBALS['meta']['facteur_bcc'])) {
    70                         $this->AddBCC( $GLOBALS['meta']['facteur_bcc'] );
     92                if (!empty($options['cc'])) {
     93                        $this->AddCC( $options['cc'] );
     94                }
     95                if (!empty($options['bcc'])) {
     96                        $this->AddBCC( $options['bcc'] );
    7197                }
    7298               
    73                 if (isset($GLOBALS['meta']['facteur_smtp']) AND $GLOBALS['meta']['facteur_smtp'] == 'oui') {
     99                if (isset($options['smtp']) AND $options['smtp'] == 'oui') {
    74100                        $this->Mailer   = 'smtp';
    75                         $this->Host     = $GLOBALS['meta']['facteur_smtp_host'];
    76                         $this->Port     = $GLOBALS['meta']['facteur_smtp_port'];
    77                         if ($GLOBALS['meta']['facteur_smtp_auth'] == 'oui') {
     101                        $this->Host     = $options['smtp_host'];
     102                        $this->Port     = $options['smtp_port'];
     103                        if ($options['smtp_auth'] == 'oui') {
    78104                                $this->SMTPAuth = true;
    79                                 $this->Username = $GLOBALS['meta']['facteur_smtp_username'];
    80                                 $this->Password = $GLOBALS['meta']['facteur_smtp_password'];
     105                                $this->Username = $options['smtp_username'];
     106                                $this->Password = $options['smtp_password'];
    81107                        }
    82108                        else {
     
    84110                        }
    85111                        if (intval(phpversion()) == 5) {
    86                         if ($GLOBALS['meta']['facteur_smtp_secure'] == 'ssl')
     112                        if ($options['smtp_secure'] == 'ssl')
    87113                                $this->SMTPSecure = 'ssl';
    88                         if ($GLOBALS['meta']['facteur_smtp_secure'] == 'tls')
     114                        if ($options['smtp_secure'] == 'tls')
    89115                                $this->SMTPSecure = 'tls';
    90116                        }
     
    95121                        $this->Body = $message_html;
    96122                        $this->IsHTML(true);
    97                         if ($GLOBALS['meta']['facteur_filtre_images'])
     123                        if ($options['filtre_images'])
    98124                                $this->JoindreImagesHTML();
    99125                        $this->UrlsAbsolues();
     
    110136                }
    111137
    112                 if ($GLOBALS['meta']['facteur_filtre_iso_8859'])
     138                if ($options['filtre_iso_8859'])
    113139                        $this->ConvertirUtf8VersIso8859();
    114140
     
    210236         * sans toucher aux images embarquees de la forme "cid:..."
    211237         */
    212         function UrlsAbsolues(){
     238        function UrlsAbsolues($base=null){
    213239                include_spip('inc/filtres_mini');
    214240                if (preg_match_all(',(<(a|link)[[:space:]]+[^<>]*href=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
    215                 $this->Body, $liens, PREG_SET_ORDER)) {
     241                  $this->Body, $liens, PREG_SET_ORDER)) {
    216242                        foreach ($liens as $lien) {
    217243                                if (strncmp($lien[3],"cid:",4)!==0){
     
    223249                }
    224250                if (preg_match_all(',(<(img|script)[[:space:]]+[^<>]*src=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
    225                 $this->Body, $liens, PREG_SET_ORDER)) {
     251                  $this->Body, $liens, PREG_SET_ORDER)) {
    226252                        foreach ($liens as $lien) {
    227253                                if (strncmp($lien[3],"cid:",4)!==0){
     
    246272                                                        'swf'   => 'application/x-shockwave-flash'
    247273                                                );
    248                 while (list($key,) = each($image_types))
    249                         $extensions[] = $key;
    250 
    251                 preg_match_all('/["\'](([^"\']+)\.('.implode('|', $extensions).'))([?][^"\']+)?["\']/Ui', $this->Body, $images, PREG_SET_ORDER);
    252 
    253                 $html_images = array();
    254                 foreach($images as $im){
    255                         if (!preg_match(",^[a-z0-9]+://,i",$im[1])
    256                          AND ($src = $im[1].$im[4])
    257                          AND (
    258                               file_exists($f=$im[1]) // l'image a ete generee depuis le meme cote que l'envoi
    259                               OR (_DIR_RACINE AND file_exists($f=_DIR_RACINE.$im[1])) // l'image a ete generee dans le public et on est dans le prive
    260                               OR (!_DIR_RACINE AND strncmp($im[1],"../",3)==0 AND file_exists($f=substr($im[1],3))) // l'image a ete generee dans le prive et on est dans le public
    261                              )
    262                          AND !isset($html_images[$src])){
    263 
    264                                 $extension = strtolower($im[3]);
    265                                 $header_extension = $image_types[$extension];
    266                                 $cid = md5($f); // un id unique pour un meme fichier
    267                                 // l'ajouter si pas deja present (avec un autre ?...)
    268                                 if (!in_array($cid,$html_images))
    269                                         $this->AddEmbeddedImage($f, $cid, basename($f),'base64',$header_extension);
    270                                 $this->Body = str_replace($src, "cid:$cid", $this->Body);
    271                                 $html_images[$src] = $cid; // marquer l'image comme traitee, inutile d'y revenir
     274                $src_found = array();
     275                $images_embeded = array();
     276                if (preg_match_all(
     277                        '/["\'](([^"\']+)\.('.implode('|', array_keys($image_types)).'))([?][^"\']+)?([#][^"\']+)?["\']/Uims',
     278                        $this->Body, $images, PREG_SET_ORDER)) {
     279
     280                        $adresse_site = $GLOBALS['meta']['adresse_site'].'/';
     281                        foreach($images as $im){
     282                                $src_orig = $im[1].$im[4].$im[5];
     283                                if (!isset($src_found[$src_orig])){ // deja remplace ? rien a faire (ie la meme image presente plusieurs fois)
     284                                        // examiner le src et voir si embedable
     285                                        $src = $im[1];
     286                                        if ($src AND strncmp($src,$adresse_site,strlen($adresse_site))==0)
     287                                                $src = _DIR_RACINE . substr($src,strlen($adresse_site));
     288                                        if ($src
     289                                          AND !preg_match(",^[a-z0-9]+://,i",$src)
     290                                          AND (
     291                                              file_exists($f=$src) // l'image a ete generee depuis le meme cote que l'envoi
     292                                              OR (_DIR_RACINE AND file_exists($f=_DIR_RACINE.$src)) // l'image a ete generee dans le public et on est dans le prive
     293                                              OR (!_DIR_RACINE AND file_exists($f=_DIR_RESTREINT.$src)) // l'image a ete generee dans le prive et on est dans le public
     294                                             )
     295                                          ){
     296                                                if (!isset($images_embeded[$f])){
     297                                                        $extension = strtolower($im[3]);
     298                                                        $header_extension = $image_types[$extension];
     299                                                        $cid = md5($f); // un id unique pour un meme fichier
     300                                                        $images_embeded[$f] = $cid; // marquer l'image comme traitee, inutile d'y revenir
     301                                                        $this->AddEmbeddedImage($f, $cid, basename($f),'base64',$header_extension);
     302                                                }
     303
     304                                                $this->Body = str_replace($src_orig, "cid:".$images_embeded[$f], $this->Body);
     305                                                $src_found[$src_orig] = $f;
     306                                        }
     307                                }
    272308                        }
    273309                }
  • _plugins_/facteur/trunk/paquet.xml

    r65829 r68195  
    22        prefix="facteur"
    33        categorie="communication"
    4         version="2.2.6"
     4        version="2.3.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.0.*]"
Note: See TracChangeset for help on using the changeset viewer.