| 2 | 
           ddelon | 
           1 | 
           <?php
  | 
        
        
           | 208 | 
           neiluj | 
           2 | 
           /*vim: set expandtab tabstop=4 shiftwidth=4: */
  | 
        
        
            | 
            | 
           3 | 
           // +------------------------------------------------------------------------------------------------------+
  | 
        
        
            | 
            | 
           4 | 
           // | PHP version 4.1                                                                                      |
  | 
        
        
            | 
            | 
           5 | 
           // +------------------------------------------------------------------------------------------------------+
  | 
        
        
            | 
            | 
           6 | 
           // | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org)                                         |
  | 
        
        
            | 
            | 
           7 | 
           // +------------------------------------------------------------------------------------------------------+
  | 
        
        
            | 
            | 
           8 | 
           // | This library is free software; you can redistribute it and/or                                        |
  | 
        
        
            | 
            | 
           9 | 
           // | modify it under the terms of the GNU General Public                                                  |
  | 
        
        
            | 
            | 
           10 | 
           // | License as published by the Free Software Foundation; either                                         |
  | 
        
        
            | 
            | 
           11 | 
           // | version 2.1 of the License, or (at your option) any later version.                                   |
  | 
        
        
            | 
            | 
           12 | 
           // |                                                                                                      |
  | 
        
        
            | 
            | 
           13 | 
           // | This library is distributed in the hope that it will be useful,                                      |
  | 
        
        
            | 
            | 
           14 | 
           // | but WITHOUT ANY WARRANTY; without even the implied warranty of                                       |
  | 
        
        
            | 
            | 
           15 | 
           // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                                    |
  | 
        
        
            | 
            | 
           16 | 
           // | General Public License for more details.                                                             |
  | 
        
        
            | 
            | 
           17 | 
           // |                                                                                                      |
  | 
        
        
            | 
            | 
           18 | 
           // | You should have received a copy of the GNU General Public                                            |
  | 
        
        
            | 
            | 
           19 | 
           // | License along with this library; if not, write to the Free Software                                  |
  | 
        
        
            | 
            | 
           20 | 
           // | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                            |
  | 
        
        
            | 
            | 
           21 | 
           // +------------------------------------------------------------------------------------------------------+
  | 
        
        
           | 431 | 
           mathias | 
           22 | 
           // CVS : $Id: ezmlm-parser.php,v 1.3 2007/04/19 15:34:35 neiluj Exp $
  | 
        
        
           | 208 | 
           neiluj | 
           23 | 
           /**
  | 
        
        
            | 
            | 
           24 | 
           * Application projet
  | 
        
        
            | 
            | 
           25 | 
           *
  | 
        
        
            | 
            | 
           26 | 
           * classe ezmlm_parser pour lire les fichiers d index de ezmlm-idx
  | 
        
        
            | 
            | 
           27 | 
           *
  | 
        
        
            | 
            | 
           28 | 
           *@package projet
  | 
        
        
            | 
            | 
           29 | 
           //Auteur original : ?? recupere dans ezmlm-php
  | 
        
        
            | 
            | 
           30 | 
           *@author        Alexandre Granier <alexandre@tela-botanica.org>
  | 
        
        
            | 
            | 
           31 | 
           *@copyright     Tela-Botanica 2000-2004
  | 
        
        
           | 431 | 
           mathias | 
           32 | 
           *@version       $Revision: 1.3 $
  | 
        
        
           | 208 | 
           neiluj | 
           33 | 
           // +------------------------------------------------------------------------------------------------------+
  | 
        
        
            | 
            | 
           34 | 
           */
  | 
        
        
            | 
            | 
           35 | 
              | 
        
        
            | 
            | 
           36 | 
              | 
        
        
            | 
            | 
           37 | 
           // +------------------------------------------------------------------------------------------------------+
  | 
        
        
            | 
            | 
           38 | 
           // |                                            ENTETE du PROGRAMME                                       |
  | 
        
        
            | 
            | 
           39 | 
           // +------------------------------------------------------------------------------------------------------+
  | 
        
        
            | 
            | 
           40 | 
              | 
        
        
           | 431 | 
           mathias | 
           41 | 
           // $Id: ezmlm-parser.php,v 1.3 2007/04/19 15:34:35 neiluj Exp $
  | 
        
        
           | 2 | 
           ddelon | 
           42 | 
           //
  | 
        
        
            | 
            | 
           43 | 
              | 
        
        
            | 
            | 
           44 | 
           require_once("ezmlm.php");
  | 
        
        
            | 
            | 
           45 | 
           require_once("Mail/mimeDecode.php") ;
  | 
        
        
            | 
            | 
           46 | 
           // CLASS: ezmlm-parser
  | 
        
        
            | 
            | 
           47 | 
           class ezmlm_parser extends ezmlm_php {
  | 
        
        
           | 208 | 
           neiluj | 
           48 | 
               var $headers;           // the full untouched headers of the message
  | 
        
        
            | 
            | 
           49 | 
               var $body;              // the full untouched (but decoded) body (this is not $this->parts[0]->body)
  | 
        
        
           | 2 | 
           ddelon | 
           50 | 
           	var $parts;		// all the parts, if it is a multipart message. each part is an ezmlm_parser object...
  | 
        
        
            | 
            | 
           51 | 
              | 
        
        
           | 208 | 
           neiluj | 
           52 | 
               // Here's the most accessed headers, everything else can be
  | 
        
        
            | 
            | 
           53 | 
               // accessed from the $this->headers array.
  | 
        
        
            | 
            | 
           54 | 
               var $to;                // To:
  | 
        
        
            | 
            | 
           55 | 
               var $from;              // From:
  | 
        
        
            | 
            | 
           56 | 
               var $date;              // Date:
  | 
        
        
            | 
            | 
           57 | 
               var $subject;           // Subject:
  | 
        
        
            | 
            | 
           58 | 
               var $replyto;           // Reply-To:
  | 
        
        
            | 
            | 
           59 | 
               var $contenttype;       // Content-Type:
  | 
        
        
           | 2 | 
           ddelon | 
           60 | 
              | 
        
        
            | 
            | 
           61 | 
           	var $multipart;		// TRUE if the message is a multipart message
  | 
        
        
            | 
            | 
           62 | 
              | 
        
        
            | 
            | 
           63 | 
           	var $msgfile;		// if parsed from a file, this is the filename...
  | 
        
        
            | 
            | 
           64 | 
              | 
        
        
            | 
            | 
           65 | 
           	// functions
  | 
        
        
            | 
            | 
           66 | 
              | 
        
        
           | 208 | 
           neiluj | 
           67 | 
           	/**
  | 
        
        
            | 
            | 
           68 | 
                * recent_msgs renvoie les derniers messages de la liste de discussion
  | 
        
        
            | 
            | 
           69 | 
                * ezmlm
  | 
        
        
            | 
            | 
           70 | 
                *
  | 
        
        
            | 
            | 
           71 | 
                * (
  | 
        
        
            | 
            | 
           72 | 
                * [0] => Array
  | 
        
        
            | 
            | 
           73 | 
                *   (
  | 
        
        
            | 
            | 
           74 | 
                *       [1] => sujet
  | 
        
        
            | 
            | 
           75 | 
                *       [2] => date en anglais
  | 
        
        
            | 
            | 
           76 | 
                *       [3] => le hash de l auteur
  | 
        
        
            | 
            | 
           77 | 
                *       [4] => l auteur
  | 
        
        
            | 
            | 
           78 | 
                *   )
  | 
        
        
            | 
            | 
           79 | 
                * [1] => ...
  | 
        
        
            | 
            | 
           80 | 
                * )
  | 
        
        
            | 
            | 
           81 | 
                * @param	int	le nombre de message a renvoye
  | 
        
        
            | 
            | 
           82 | 
                * @return array	un tableau contenant les messages
  | 
        
        
            | 
            | 
           83 | 
                * @access public
  | 
        
        
            | 
            | 
           84 | 
                */
  | 
        
        
           | 2 | 
           ddelon | 
           85 | 
           	function recent_msgs($show = 20, $month = "") {
  | 
        
        
           | 208 | 
           neiluj | 
           86 | 
              | 
        
        
            | 
            | 
           87 | 
           		$repertoire_archive = opendir($this->listdir . "/archive/");
  | 
        
        
           | 2 | 
           ddelon | 
           88 | 
              | 
        
        
           | 208 | 
           neiluj | 
           89 | 
           		$repertoire_message = array() ;
  | 
        
        
           | 431 | 
           mathias | 
           90 | 
           		$dernier_repertoire = 0 ;
  | 
        
        
            | 
            | 
           91 | 
           		while (false !== ($item = readdir($repertoire_archive))) {
  | 
        
        
            | 
            | 
           92 | 
           			// $item contient les noms des repertoires
  | 
        
        
            | 
            | 
           93 | 
           			// on ne garde que ceux qui sont des chiffres
  | 
        
        
           | 208 | 
           neiluj | 
           94 | 
              | 
        
        
           | 431 | 
           mathias | 
           95 | 
           			if (preg_match('/[0-9]+/', $item)) {
  | 
        
        
            | 
            | 
           96 | 
           				// on ouvre le fichier d index de chaque repertoire
  | 
        
        
            | 
            | 
           97 | 
           				if ((int) $item > $dernier_repertoire) $dernier_repertoire = (int) $item;
  | 
        
        
            | 
            | 
           98 | 
              | 
        
        
            | 
            | 
           99 | 
           			}
  | 
        
        
            | 
            | 
           100 | 
           		}
  | 
        
        
           | 208 | 
           neiluj | 
           101 | 
           		$tableau_message = array() ;
  | 
        
        
            | 
            | 
           102 | 
           		$compteur_message = 0 ;
  | 
        
        
            | 
            | 
           103 | 
           		$fichier_index = fopen ($this->listdir.'/archive/'.$dernier_repertoire.'/index', 'r') ;
  | 
        
        
            | 
            | 
           104 | 
           		while (!feof($fichier_index)) {
  | 
        
        
            | 
            | 
           105 | 
           				// Recuperation du numero de message, du hash du sujet et du sujet
  | 
        
        
            | 
            | 
           106 | 
           				$temp = fgets($fichier_index, 4096);
  | 
        
        
            | 
            | 
           107 | 
           				preg_match('/([0-9]+): ([a-z]+) (.*)/', $temp, $match) ;
  | 
        
        
            | 
            | 
           108 | 
              | 
        
        
            | 
            | 
           109 | 
           				// dans la seconde on recupere la date, hash auteur et auteur
  | 
        
        
            | 
            | 
           110 | 
           				$temp = fgets($fichier_index, 4096);
  | 
        
        
            | 
            | 
           111 | 
           				preg_match('/\t([0-9]+) ([a-zA-Z][a-zA-Z][a-zA-Z]) ([0-9][0-9][0-9][0-9]) ([^;]+);([^ ]*) (.*)/', $temp, $match_deuxieme_ligne) ;
  | 
        
        
            | 
            | 
           112 | 
           				if ($match[1] != '') {
  | 
        
        
            | 
            | 
           113 | 
           				$tableau_message[$match[1]] = array ($match[2], $match[3],
  | 
        
        
            | 
            | 
           114 | 
           									$match_deuxieme_ligne[1].' '.$match_deuxieme_ligne[2].' '.$match_deuxieme_ligne[3],
  | 
        
        
            | 
            | 
           115 | 
           									$match_deuxieme_ligne[5],
  | 
        
        
            | 
            | 
           116 | 
           									$match_deuxieme_ligne[6]);
  | 
        
        
            | 
            | 
           117 | 
           				}
  | 
        
        
            | 
            | 
           118 | 
           			}
  | 
        
        
            | 
            | 
           119 | 
           			fclose ($fichier_index);
  | 
        
        
            | 
            | 
           120 | 
           		// on renverse le tableau pour afficher les derniers messages en premier
  | 
        
        
            | 
            | 
           121 | 
           		$tableau_message = array_reverse($tableau_message, true);
  | 
        
        
           | 2 | 
           ddelon | 
           122 | 
              | 
        
        
           | 208 | 
           neiluj | 
           123 | 
           		// On compte le nombre de message, s il est inferieur $show et que l on est
  | 
        
        
            | 
            | 
           124 | 
           		// pas dans le premier index, on ouvre le fichier precedent et recupere
  | 
        
        
            | 
            | 
           125 | 
           		// le n dernier message
  | 
        
        
            | 
            | 
           126 | 
              | 
        
        
            | 
            | 
           127 | 
           		if (count ($tableau_message) < $show && $dernier_repertoire != '0') {
  | 
        
        
            | 
            | 
           128 | 
           			$avant_dernier_repertoire = $dernier_repertoire - 1 ;
  | 
        
        
            | 
            | 
           129 | 
           			// On utilise file_get_contents pour renverser le fichier
  | 
        
        
            | 
            | 
           130 | 
           			$fichier_index = array_reverse(
  | 
        
        
            | 
            | 
           131 | 
           									explode ("\n",
  | 
        
        
            | 
            | 
           132 | 
           										preg_replace ('/\n$/', '',
  | 
        
        
            | 
            | 
           133 | 
           											file_get_contents ($this->listdir.'/archive/'.$avant_dernier_repertoire.'/index')) ), true) ;
  | 
        
        
            | 
            | 
           134 | 
           			reset ($fichier_index);
  | 
        
        
            | 
            | 
           135 | 
           			//var_dump ($fichier_index);
  | 
        
        
            | 
            | 
           136 | 
              | 
        
        
            | 
            | 
           137 | 
           			for ($i = count ($tableau_message); $i <= $show; $i++) {
  | 
        
        
            | 
            | 
           138 | 
           				// Recuperation du numero de message, du hash du sujet et du sujet
  | 
        
        
            | 
            | 
           139 | 
           				// dans la seconde on recupere la date, hash auteur et auteur
  | 
        
        
            | 
            | 
           140 | 
              | 
        
        
            | 
            | 
           141 | 
           				preg_match('/\t([0-9]+) ([a-zA-Z][a-zA-Z][a-zA-Z]) ([0-9][0-9][0-9][0-9]) ([^;]+);([^ ]*) (.*)/',
  | 
        
        
            | 
            | 
           142 | 
           									current ($fichier_index), $match_deuxieme_ligne) ;
  | 
        
        
            | 
            | 
           143 | 
           				preg_match('/([0-9]+): ([a-z]+) (.*)/', next($fichier_index), $match) ;
  | 
        
        
            | 
            | 
           144 | 
           				next ($fichier_index);
  | 
        
        
            | 
            | 
           145 | 
              | 
        
        
            | 
            | 
           146 | 
           				if ($match[1] != '') {
  | 
        
        
            | 
            | 
           147 | 
           				$tableau_message[$match[1]] = array ($match[2], $match[3],
  | 
        
        
            | 
            | 
           148 | 
           									$match_deuxieme_ligne[1].' '.$match_deuxieme_ligne[2].' '.$match_deuxieme_ligne[3],
  | 
        
        
            | 
            | 
           149 | 
           									$match_deuxieme_ligne[5],
  | 
        
        
            | 
            | 
           150 | 
           									$match_deuxieme_ligne[6]);
  | 
        
        
            | 
            | 
           151 | 
           				}
  | 
        
        
           | 2 | 
           ddelon | 
           152 | 
           			}
  | 
        
        
           | 208 | 
           neiluj | 
           153 | 
           		} else {
  | 
        
        
            | 
            | 
           154 | 
           			// Si le nombre de message est > $show on limite le tableau de retour
  | 
        
        
            | 
            | 
           155 | 
           			$tableau_message = array_slice($tableau_message, 0, $show, true);
  | 
        
        
           | 2 | 
           ddelon | 
           156 | 
           		}
  | 
        
        
           | 208 | 
           neiluj | 
           157 | 
              | 
        
        
            | 
            | 
           158 | 
              | 
        
        
            | 
            | 
           159 | 
           		return $tableau_message ;
  | 
        
        
           | 2 | 
           ddelon | 
           160 | 
           	}
  | 
        
        
            | 
            | 
           161 | 
              | 
        
        
            | 
            | 
           162 | 
              | 
        
        
            | 
            | 
           163 | 
           	// parse_file - opens a file and feeds the data to parse, file can be relative to the listdir
  | 
        
        
            | 
            | 
           164 | 
           	function parse_file($file,$simple = FALSE) {
  | 
        
        
            | 
            | 
           165 | 
           		if (!is_file($file)) {
  | 
        
        
            | 
            | 
           166 | 
           			if (is_file($this->listdir . "/" . $file)) { $file = $this->listdir . "/" . $file; }
  | 
        
        
            | 
            | 
           167 | 
           			else if (is_file($this->listdir . "/archive/" . $file)) { $file = $this->listdir . "/archive/" . $file; }
  | 
        
        
            | 
            | 
           168 | 
           			else { return FALSE; }
  | 
        
        
            | 
            | 
           169 | 
           		}
  | 
        
        
            | 
            | 
           170 | 
              | 
        
        
            | 
            | 
           171 | 
           		$this->msgfile = $file;
  | 
        
        
            | 
            | 
           172 | 
                   $data = '' ;
  | 
        
        
            | 
            | 
           173 | 
           		$fd = fopen($file, "r");
  | 
        
        
            | 
            | 
           174 | 
           		while (!feof($fd)) { $data .= fgets($fd,4096); }
  | 
        
        
            | 
            | 
           175 | 
           		fclose($fd);
  | 
        
        
            | 
            | 
           176 | 
           		return $this->parse($data,$simple);
  | 
        
        
            | 
            | 
           177 | 
           	}
  | 
        
        
            | 
            | 
           178 | 
              | 
        
        
           | 431 | 
           mathias | 
           179 | 
               // parse_file_headers - ouvre un fichier et analyse les ent�tes
  | 
        
        
           | 2 | 
           ddelon | 
           180 | 
           	function parse_file_headers($file,$simple = FALSE) {
  | 
        
        
            | 
            | 
           181 | 
           		if (!is_file($file)) {
  | 
        
        
            | 
            | 
           182 | 
           			if (is_file($this->listdir . "/" . $file)) { $file = $this->listdir . "/" . $file; }
  | 
        
        
            | 
            | 
           183 | 
           			else if (is_file($this->listdir . "/archive/" . $file)) { $file = $this->listdir . "/archive/" . $file; }
  | 
        
        
            | 
            | 
           184 | 
           			else { return FALSE; }
  | 
        
        
            | 
            | 
           185 | 
           		}
  | 
        
        
            | 
            | 
           186 | 
              | 
        
        
            | 
            | 
           187 | 
           		$this->msgfile = $file;
  | 
        
        
            | 
            | 
           188 | 
                   $data = file_get_contents ($file) ;
  | 
        
        
            | 
            | 
           189 | 
                   $message = file_get_contents($file) ;
  | 
        
        
            | 
            | 
           190 | 
                   $mimeDecode = new Mail_mimeDecode($message) ;
  | 
        
        
            | 
            | 
           191 | 
                   $mailDecode = $mimeDecode->decode() ;
  | 
        
        
            | 
            | 
           192 | 
                   return $mailDecode ;
  | 
        
        
            | 
            | 
           193 | 
           	}
  | 
        
        
            | 
            | 
           194 | 
              | 
        
        
            | 
            | 
           195 | 
           	// this does all of the work (well it calls two functions that do all the work :)
  | 
        
        
            | 
            | 
           196 | 
           	// all the decoding a part breaking follows RFC2045 (http://www.faqs.org/rfcs/rfc2045.html)
  | 
        
        
            | 
            | 
           197 | 
           	function parse($data,$simple = FALSE) {
  | 
        
        
            | 
            | 
           198 | 
              | 
        
        
            | 
            | 
           199 | 
           		if (($this->_get_headers($data,$simple)) && $this->_get_body($data,$simple)) { return TRUE; }
  | 
        
        
            | 
            | 
           200 | 
           		return FALSE;
  | 
        
        
            | 
            | 
           201 | 
           	}
  | 
        
        
            | 
            | 
           202 | 
              | 
        
        
            | 
            | 
           203 | 
           	// all of these are internal functions, you shouldn't call them directly...
  | 
        
        
            | 
            | 
           204 | 
              | 
        
        
            | 
            | 
           205 | 
           	// _ct_parse: parse Content-Type headers -> $ct[0] = Full header, $ct[1] = Content-Type, $ct[2] ... $ct[n] = AP's
  | 
        
        
            | 
            | 
           206 | 
           	function _ct_parse() {
  | 
        
        
            | 
            | 
           207 | 
           		$instr = $this->headers['content-type'];
  | 
        
        
            | 
            | 
           208 | 
           		preg_replace('/\(.*\)/','',$instr); // strip rfc822 comments
  | 
        
        
            | 
            | 
           209 | 
           		if (preg_match('/: /', $instr)) {
  | 
        
        
            | 
            | 
           210 | 
           			$ct = preg_split('/:/',trim($instr),2);
  | 
        
        
            | 
            | 
           211 | 
           			$ct = preg_split('/;/',trim($ct[1]));
  | 
        
        
            | 
            | 
           212 | 
           		} else {
  | 
        
        
            | 
            | 
           213 | 
           			$ct = preg_split('/;/',trim($instr));
  | 
        
        
            | 
            | 
           214 | 
           		}
  | 
        
        
            | 
            | 
           215 | 
           		if (isset($ct[1])) $attrs = preg_split('/[\s\n]/',$ct[1]);
  | 
        
        
            | 
            | 
           216 | 
           		$i = 2;
  | 
        
        
            | 
            | 
           217 | 
           		$ct[1] = $ct[0];
  | 
        
        
            | 
            | 
           218 | 
           		$ct[0] = $this->headers['content-type'];
  | 
        
        
            | 
            | 
           219 | 
                   if (isset($attrs) && is_array($attrs)) {
  | 
        
        
            | 
            | 
           220 | 
                       while (list($key, $val) = each($attrs)) {
  | 
        
        
            | 
            | 
           221 | 
                           if ($val == '') continue;
  | 
        
        
            | 
            | 
           222 | 
                           $ap = preg_split('/=/',$val,2);
  | 
        
        
            | 
            | 
           223 | 
                           if (preg_match('/^"/',$ap[1])) { $ap[1] = substr($ap[1],1,strlen($ap[1])-2); }
  | 
        
        
            | 
            | 
           224 | 
                           $ct[$i] = $ap;
  | 
        
        
            | 
            | 
           225 | 
                           $i++;
  | 
        
        
            | 
            | 
           226 | 
                       }
  | 
        
        
            | 
            | 
           227 | 
                   }
  | 
        
        
            | 
            | 
           228 | 
           		// are we a multipart message?
  | 
        
        
            | 
            | 
           229 | 
           		if (preg_match('/^multipart/i', $ct[1])) { $this->multipart = TRUE; }
  | 
        
        
            | 
            | 
           230 | 
              | 
        
        
            | 
            | 
           231 | 
           		return $ct;
  | 
        
        
            | 
            | 
           232 | 
           	}
  | 
        
        
            | 
            | 
           233 | 
              | 
        
        
            | 
            | 
           234 | 
           	// _get_headers: pulls the headers out of the data and builds the $this->headers array
  | 
        
        
            | 
            | 
           235 | 
           	function _get_headers($data,$simple = FALSE) {
  | 
        
        
            | 
            | 
           236 | 
           		$lines = preg_split('/\n/', $data);
  | 
        
        
            | 
            | 
           237 | 
           		while (list($key, $val) = each($lines)) {
  | 
        
        
            | 
            | 
           238 | 
           			$val = trim($val);
  | 
        
        
            | 
            | 
           239 | 
           			if ($val == "") break;
  | 
        
        
            | 
            | 
           240 | 
           			if (preg_match('/^From[^:].*$/', $val)) continue;	/* strips out any From lines added by the MTA */
  | 
        
        
            | 
            | 
           241 | 
              | 
        
        
            | 
            | 
           242 | 
           			$hdr = preg_split('/: /', $val, 2);
  | 
        
        
            | 
            | 
           243 | 
           			if (count($hdr) == 1) {
  | 
        
        
            | 
            | 
           244 | 
           				// this is a continuation of the last header (like a recieved from line)
  | 
        
        
            | 
            | 
           245 | 
           				$this->headers[$last] .= $val;
  | 
        
        
            | 
            | 
           246 | 
           			} else {
  | 
        
        
            | 
            | 
           247 | 
           				$this->headers[strtolower($hdr[0])] = $hdr[1];
  | 
        
        
            | 
            | 
           248 | 
                           //echo htmlspecialchars($this->headers['from'])."<br />" ;
  | 
        
        
            | 
            | 
           249 | 
           				$last = strtolower($hdr[0]);
  | 
        
        
            | 
            | 
           250 | 
           			}
  | 
        
        
            | 
            | 
           251 | 
           		}
  | 
        
        
            | 
            | 
           252 | 
                   // ajout alex
  | 
        
        
           | 431 | 
           mathias | 
           253 | 
                   // pour supprimer le probl�me des ISO...
  | 
        
        
            | 
            | 
           254 | 
                   // a d�placer ailleur, et appel� avant affichage
  | 
        
        
           | 2 | 
           ddelon | 
           255 | 
              | 
        
        
            | 
            | 
           256 | 
                   if (preg_match ('/windows-[0-9][0-9][0-9][0-9]/', $this->headers['subject'], $nombre)) {
  | 
        
        
            | 
            | 
           257 | 
                       $reg_exp = $nombre[0] ;
  | 
        
        
            | 
            | 
           258 | 
                   } else {
  | 
        
        
            | 
            | 
           259 | 
                       $reg_exp = 'ISO-8859-15?' ;
  | 
        
        
            | 
            | 
           260 | 
                   }
  | 
        
        
            | 
            | 
           261 | 
                   if (preg_match ('/UTF/i', $this->headers['subject'])) $reg_exp = 'UTF-8' ;
  | 
        
        
            | 
            | 
           262 | 
                   preg_match_all ("/=\?$reg_exp\?(Q|B)\?(.*?)\?=/i", $this->headers['subject'], $match, PREG_PATTERN_ORDER)  ;
  | 
        
        
            | 
            | 
           263 | 
                   for ($i = 0; $i < count ($match[0]); $i++ ) {
  | 
        
        
            | 
            | 
           264 | 
              | 
        
        
            | 
            | 
           265 | 
                           if ($match[1][$i] == 'Q') {
  | 
        
        
            | 
            | 
           266 | 
                               $decode = quoted_printable_decode ($match[2][$i]) ;
  | 
        
        
            | 
            | 
           267 | 
                           } elseif ($match[1][$i] == 'B') {
  | 
        
        
            | 
            | 
           268 | 
                               $decode = base64_decode ($match[2][$i]) ;
  | 
        
        
            | 
            | 
           269 | 
                           }
  | 
        
        
            | 
            | 
           270 | 
                           $decode = preg_replace ("/_/", " ", $decode) ;
  | 
        
        
            | 
            | 
           271 | 
                       if ($reg_exp == 'UTF-8') {
  | 
        
        
            | 
            | 
           272 | 
                           $decode = utf8_decode ($decode) ;
  | 
        
        
            | 
            | 
           273 | 
                       }
  | 
        
        
            | 
            | 
           274 | 
                       $this->headers['subject'] = str_replace ($match[0][$i], $decode, $this->headers['subject']) ;
  | 
        
        
            | 
            | 
           275 | 
                   }
  | 
        
        
            | 
            | 
           276 | 
           		// sanity anyone?
  | 
        
        
            | 
            | 
           277 | 
           		if (!$this->headers['content-type']) { $this->headers['content-type'] = "text/plain; charset=us-ascii"; }
  | 
        
        
            | 
            | 
           278 | 
           		if (!$simple) { $this->headers['content-type'] = $this->_ct_parse(); }
  | 
        
        
            | 
            | 
           279 | 
              | 
        
        
            | 
            | 
           280 | 
              | 
        
        
            | 
            | 
           281 | 
           		return TRUE;
  | 
        
        
            | 
            | 
           282 | 
           	}
  | 
        
        
            | 
            | 
           283 | 
              | 
        
        
            | 
            | 
           284 | 
           	// _get_body: pulls the body out of the data and fills $this->body, decoding the data if nessesary.
  | 
        
        
            | 
            | 
           285 | 
           	function _get_body($data,$simple = FALSE) {
  | 
        
        
            | 
            | 
           286 | 
           		$lines = preg_split('/\n/', $data);
  | 
        
        
            | 
            | 
           287 | 
           		$doneheaders = FALSE;
  | 
        
        
            | 
            | 
           288 | 
              | 
        
        
            | 
            | 
           289 | 
           		$data = "";
  | 
        
        
            | 
            | 
           290 | 
           		while (list($key,$val) = each($lines)) {
  | 
        
        
            | 
            | 
           291 | 
                       //echo htmlspecialchars($val)."<br>";
  | 
        
        
            | 
            | 
           292 | 
           			if (($val == '') and (!$doneheaders)) {
  | 
        
        
            | 
            | 
           293 | 
           				$doneheaders = TRUE;
  | 
        
        
            | 
            | 
           294 | 
           				continue;
  | 
        
        
            | 
            | 
           295 | 
           			} else if ($doneheaders) {
  | 
        
        
            | 
            | 
           296 | 
           				$data .= $val . "\n";
  | 
        
        
            | 
            | 
           297 | 
           			}
  | 
        
        
            | 
            | 
           298 | 
           		}
  | 
        
        
            | 
            | 
           299 | 
              | 
        
        
            | 
            | 
           300 | 
           		// now here comes the fun part... decoding.
  | 
        
        
            | 
            | 
           301 | 
           		switch($this->headers['content-transfer-encoding']) {
  | 
        
        
            | 
            | 
           302 | 
           			case 'binary':
  | 
        
        
            | 
            | 
           303 | 
           				$this->body = $this->_cte_8bit($this->_cte_qp($this->_cte_binary($data)),$simple);
  | 
        
        
            | 
            | 
           304 | 
           				break;
  | 
        
        
            | 
            | 
           305 | 
              | 
        
        
            | 
            | 
           306 | 
           			case 'base64':
  | 
        
        
            | 
            | 
           307 | 
           				$this->body = $this->_cte_8bit($this->_cte_qp($this->_cte_base64($data)),$simple);
  | 
        
        
            | 
            | 
           308 | 
           				break;
  | 
        
        
            | 
            | 
           309 | 
              | 
        
        
            | 
            | 
           310 | 
           			case 'quoted-printable':
  | 
        
        
            | 
            | 
           311 | 
           				$this->body = $this->_cte_8bit($this->_cte_qp($data),$simple);
  | 
        
        
            | 
            | 
           312 | 
           				break;
  | 
        
        
            | 
            | 
           313 | 
              | 
        
        
            | 
            | 
           314 | 
           			case '8bit':
  | 
        
        
            | 
            | 
           315 | 
           				$this->body = $this->_cte_8bit($data,$simple);
  | 
        
        
            | 
            | 
           316 | 
           				break;
  | 
        
        
            | 
            | 
           317 | 
              | 
        
        
            | 
            | 
           318 | 
           			case '7bit':		// 7bit doesn't need to be decoded
  | 
        
        
            | 
            | 
           319 | 
           			default:		// And the fall through as well...
  | 
        
        
            | 
            | 
           320 | 
           				$this->body = $data;
  | 
        
        
            | 
            | 
           321 | 
           				break;
  | 
        
        
            | 
            | 
           322 | 
           		}
  | 
        
        
            | 
            | 
           323 | 
                   //echo  $this->headers['content-type'][2][1];
  | 
        
        
            | 
            | 
           324 | 
                   if (isset($this->headers['content-type'][2][1]) && $this->headers['content-type'][2][1] == 'UTF-8') {
  | 
        
        
            | 
            | 
           325 | 
                           //$this->body = utf8_decode ($this->body) ;
  | 
        
        
            | 
            | 
           326 | 
                           //echo quoted_printable_decode(utf8_decode ($this->body)) ;
  | 
        
        
            | 
            | 
           327 | 
                   }
  | 
        
        
            | 
            | 
           328 | 
           		if ($simple) { return TRUE; }
  | 
        
        
            | 
            | 
           329 | 
              | 
        
        
            | 
            | 
           330 | 
           		// if we are a multipart message then break up the parts and decode, set the appropriate variables.
  | 
        
        
            | 
            | 
           331 | 
           		// here comes the best part about making ezmlm-php OOP. since each part is just really a little message
  | 
        
        
            | 
            | 
           332 | 
           		// in itself each part becomes a new parser object and all the wheels turn again... :)
  | 
        
        
            | 
            | 
           333 | 
           		if ($this->multipart) {
  | 
        
        
            | 
            | 
           334 | 
              | 
        
        
            | 
            | 
           335 | 
           			$boundary = '';
  | 
        
        
            | 
            | 
           336 | 
           			for ($i = 2; $i <= count($this->headers['content-type']); $i++) {
  | 
        
        
            | 
            | 
           337 | 
           				if (preg_match('/boundary/i', $this->headers['content-type'][$i][0])) {
  | 
        
        
            | 
            | 
           338 | 
           					$boundary = $this->headers['content-type'][$i][1];
  | 
        
        
            | 
            | 
           339 | 
              | 
        
        
            | 
            | 
           340 | 
           				}
  | 
        
        
            | 
            | 
           341 | 
           			}
  | 
        
        
            | 
            | 
           342 | 
           			if ($boundary != '') {
  | 
        
        
            | 
            | 
           343 | 
           				$this->_get_parts($this->body,$boundary);
  | 
        
        
            | 
            | 
           344 | 
           			} else {
  | 
        
        
            | 
            | 
           345 | 
           				// whoopps... something's not right here. we were told that the message is supposed
  | 
        
        
            | 
            | 
           346 | 
           				// to be a multipart message, yet the boundary wasn't set in the content type.
  | 
        
        
            | 
            | 
           347 | 
           				// mark the message as non multipart and add a message to the top of the body.
  | 
        
        
            | 
            | 
           348 | 
           				$this->multipart = FALSE;
  | 
        
        
            | 
            | 
           349 | 
           				$this->body = "PARSER ERROR:\nWHILE PARSING THIS MESSAGE AS A MULTIPART MESSAGE AS DEFINED IN RFC2045 THE BOUNDARY IDENTIFIER WAS NOT FOUND!\nTHIS MESSAGE WILL NOT DISPLAY CORRECTLY!\n\n" . $this->body;
  | 
        
        
            | 
            | 
           350 | 
           			}
  | 
        
        
            | 
            | 
           351 | 
           		}
  | 
        
        
            | 
            | 
           352 | 
              | 
        
        
            | 
            | 
           353 | 
           		return TRUE;
  | 
        
        
            | 
            | 
           354 | 
           	}
  | 
        
        
            | 
            | 
           355 | 
              | 
        
        
            | 
            | 
           356 | 
           	// _get_parts: breaks up $data into parts based on $boundary following the rfc specs
  | 
        
        
            | 
            | 
           357 | 
           	// detailed in section 5 of RFC2046 (http://www.faqs.org/rfcs/rfc2046.html)
  | 
        
        
            | 
            | 
           358 | 
           	// After the parts are broken up they are then turned into parser objects and the
  | 
        
        
            | 
            | 
           359 | 
           	// resulting array of parts is set to $this->parts;
  | 
        
        
            | 
            | 
           360 | 
           	function _get_parts($data,$boundary) {
  | 
        
        
            | 
            | 
           361 | 
           		$inpart = -1;
  | 
        
        
            | 
            | 
           362 | 
           		$lines = preg_split('/\n/', $data);
  | 
        
        
           | 431 | 
           mathias | 
           363 | 
                   // La premi�re partie contient l'avertissement pour les client mail ne supportant pas
  | 
        
        
            | 
            | 
           364 | 
                   // multipart, elle est stock� dans parts[-1]
  | 
        
        
           | 2 | 
           ddelon | 
           365 | 
           		while(list($key,$val) = each($lines)) {
  | 
        
        
            | 
            | 
           366 | 
           			if ($val == "--" . $boundary) { $inpart++; continue; } // start of a part
  | 
        
        
            | 
            | 
           367 | 
           			else if ($val == "--" . $boundary . "--") { break; } // the end of the last part
  | 
        
        
            | 
            | 
           368 | 
           			else { $parts[$inpart] .= $val . "\n"; }
  | 
        
        
            | 
            | 
           369 | 
           		}
  | 
        
        
            | 
            | 
           370 | 
              | 
        
        
           | 431 | 
           mathias | 
           371 | 
           		for ($i = 0; $i < count($parts) - 1; $i++) {    // On saute la premi�re partie
  | 
        
        
           | 2 | 
           ddelon | 
           372 | 
           			$part[$i] = new ezmlm_parser();
  | 
        
        
            | 
            | 
           373 | 
           			$part[$i]->parse($parts[$i]);
  | 
        
        
            | 
            | 
           374 | 
           			$this->parts[$i] = $part[$i];
  | 
        
        
            | 
            | 
           375 | 
                       //echo $this->parts[$i]."<br>" ;
  | 
        
        
            | 
            | 
           376 | 
           		}
  | 
        
        
            | 
            | 
           377 | 
              | 
        
        
            | 
            | 
           378 | 
           	}
  | 
        
        
            | 
            | 
           379 | 
              | 
        
        
            | 
            | 
           380 | 
           	// _cte_8bit: decode a content transfer encoding of 8bit
  | 
        
        
            | 
            | 
           381 | 
           	// NOTE: this function is a little bit special. Since the end result will be displayed in
  | 
        
        
            | 
            | 
           382 | 
           	// a web browser _cte_8bit decodes ASCII characters > 127 (the US-ASCII table) into the
  | 
        
        
            | 
            | 
           383 | 
           	// html ordinal equivilant, it also ensures that the messages content-type is changed
  | 
        
        
            | 
            | 
           384 | 
           	// to include text/html if it changes anything...
  | 
        
        
            | 
            | 
           385 | 
           	function _cte_8bit($data,$simple = FALSE) {
  | 
        
        
            | 
            | 
           386 | 
           		if ($simple) { return $data; }
  | 
        
        
            | 
            | 
           387 | 
           		$changed = FALSE;
  | 
        
        
            | 
            | 
           388 | 
           		$chars = preg_split('//',$data);
  | 
        
        
            | 
            | 
           389 | 
           		while (list($key,$val) = each($chars)) {
  | 
        
        
            | 
            | 
           390 | 
           			if (ord($val) > 127) { $out .= '&#' . ord($val) . ';'; $changed = TRUE; }
  | 
        
        
            | 
            | 
           391 | 
           			else { $out .= $val; }
  | 
        
        
            | 
            | 
           392 | 
           		}
  | 
        
        
            | 
            | 
           393 | 
           		if ($changed) { $this->headers['content-type'][1] = 'text/html'; }
  | 
        
        
            | 
            | 
           394 | 
           		return $out;
  | 
        
        
            | 
            | 
           395 | 
           	}
  | 
        
        
            | 
            | 
           396 | 
              | 
        
        
            | 
            | 
           397 | 
           	// _cte_binary: decode a content transfer encoding of binary
  | 
        
        
            | 
            | 
           398 | 
           	function _cte_binary($data) { return $data; }
  | 
        
        
            | 
            | 
           399 | 
              | 
        
        
            | 
            | 
           400 | 
           	// _cte_base64: decode a content transfer encoding of base64
  | 
        
        
            | 
            | 
           401 | 
           	function _cte_base64($data) { return base64_decode($data); }
  | 
        
        
            | 
            | 
           402 | 
              | 
        
        
            | 
            | 
           403 | 
           	// _cte_qp: decode a content transfer encoding of quoted_printable
  | 
        
        
            | 
            | 
           404 | 
           	function _cte_qp($data) {
  | 
        
        
            | 
            | 
           405 | 
           		// For the time being we'll use PHP's function, it seems to work well enough.
  | 
        
        
            | 
            | 
           406 | 
           		return quoted_printable_decode($data);
  | 
        
        
            | 
            | 
           407 | 
           	}
  | 
        
        
            | 
            | 
           408 | 
              | 
        
        
            | 
            | 
           409 | 
           }
  |