phplist e le immagini incluse nei messaggi


phplist

Dalla versione 2.10.8 di phplist (o forse qualcuna prima), vi è la possibilità di inserire immagini all’interno delle nostre mailing, senza dover ricorrere al link esterno (che l’odioso outlook e altri MUA) visualizzano come se si trattasse di errori (per l’utente di medio-basso livello). Basta aggiungere al file di configurazione

# Aggiunta di Gabo per permettere di inserire le immagini nel corpo del messaggio
define("EMBEDUPLOADIMAGES",1);

Il problema è che non mi funzionava. Non c’era verso. Allora, armato di santa pazienza, ho messo mano al codice ed ho cercato di capire il motivo. Il problema sta nel fatto che uploadando le immagini, mediante l’FCKEditor, non si possono usare sottodirectory a quella specificata mediante

# If you want to upload images to the FCKeditor, you need to specify the location
# of the directory where the images go. This needs to be writable by the webserver,
# and it needs to be in your public document (website) area
# the directory is relative to the root of PHPlist as set above
# This is a potential security risk, so read README.security for more information
define("FCKIMAGES_DIR","uploadimages")

Dato che io amo le sottodirectory, ma soprattutto perchè gli utenti non avrebbero mai capito il motivo di non poter usare le suddette, ho messo mano al codice ed ho modificato le due funzioni preposte all’arduo compito: filesystem_image_exists e get_filesystem_image, entrambe presenti nel file admin/class.phplistmailer.php

Come prima cosa, però, ho aggiunto anche questa riga al file di configurazione, in modo da poter includere le immagini anche quando si spedisce tramite cronjob e PHP-cli:

//ADDED BY GABO
$phplistRoot = '/home/mysite/public_html';
//END ADDED BY GABO

Ecco le funzioni modificate:

    ## addition for filesystem images - MODIFYED BY GABO
    function filesystem_image_exists($filename) {
      ##  find the image referenced and see if it's on the server

      $elements = parse_url($filename);
      $localfile = basename($elements['path']);

      // search for subdirectory
      $basePath = $GLOBALS['phplistRoot'].$GLOBALS['pageroot'].'/'.FCKIMAGES_DIR;
      $dir = substr($elements['path'],
                    strpos($elements['path'],FCKIMAGES_DIR)+strlen(FCKIMAGES_DIR),
                    strlen($elements['path']) -
                       strpos($elements['path'],FCKIMAGES_DIR) -
                       strlen(FCKIMAGES_DIR)-strlen($localfile));

      return is_file($basePath.$dir.$localfile);
    }

    function get_filesystem_image($filename) {
      ## get the image contents
      $elements = parse_url($filename);
      $localfile = basename($elements['path']);

      $basePath = $GLOBALS['phplistRoot'].$GLOBALS['pageroot'].'/'.FCKIMAGES_DIR;
      $dir = substr($elements['path'],
                    strpos($elements['path'],FCKIMAGES_DIR)+strlen(FCKIMAGES_DIR),
                    strlen($elements['path']) -
                       strpos($elements['path'],FCKIMAGES_DIR) -
                       strlen(FCKIMAGES_DIR)-strlen($localfile));

      if (is_file($basePath.$dir.$localfile)) {
        return base64_encode( file_get_contents($basePath.$dir.$localfile) );
      }
      return 0;
    }
    ## end addition - MODIFYED BY GABO

Et voilà, le immagini sono servite. Che poi mandare 6000 email che pesano 500kb sia decisamente peggio di mandarne 6000 che pesano 20Kb è un altro discorso, ma con il management non si discute :)