Subversion Repositories Applications.projet

Rev

Rev 406 | Rev 431 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 406 Rev 420
1
<?php
1
<?php
2
// $Id: ezmlm-msgdisplay.php,v 1.11 2008-11-19 09:28:46 aperonnet Exp $
2
// $Id: ezmlm-msgdisplay.php,v 1.11 2008-11-19 09:28:46 aperonnet Exp $
3
//
3
//
4
// ezmlm-msgdisplay.php - ezmlm-php v2.0
4
// ezmlm-msgdisplay.php - ezmlm-php v2.0
5
// --------------------------------------------------------------
5
// --------------------------------------------------------------
6
// Will parse a template (if specified) and display a message.
6
// Will parse a template (if specified) and display a message.
7
// Includes a default template.
7
// Includes a default template.
8
// --------------------------------------------------------------
8
// --------------------------------------------------------------
9
 
9
 
10
require_once("ezmlm.php");
10
require_once("ezmlm.php");
11
require_once("Mail/mimeDecode.php") ;
11
require_once("Mail/mimeDecode.php") ;
12
 
12
 
13
class ezmlm_msgdisplay extends ezmlm_php {
13
class ezmlm_msgdisplay extends ezmlm_php {
14
	// our template
14
	// our template
15
	var $msgtmpl;
15
	var $msgtmpl;
16
    var $message_rendu ;
16
    var $message_rendu ;
17
    var $_auth ;
17
    var $_auth ;
18
	// display: parses a message (using ezmlm_parser) and displays it
18
	// display: parses a message (using ezmlm_parser) and displays it
19
	// using a template
19
	// using a template
20
    var $msgfile;
20
    var $msgfile;
21
    
21
    
22
    function display($msgfile) {
22
    function display($msgfile) {
23
        if (!is_file($msgfile)) {
23
        if (!is_file($msgfile)) {
24
            if (is_file($this->listdir . "/" . $msgfile)) { $msgfile = $this->listdir . "/" . $msgfile; }
24
            if (is_file($this->listdir . "/" . $msgfile)) { $msgfile = $this->listdir . "/" . $msgfile; }
25
		else if (is_file($this->listdir . "/archive/" . $msgfile)) { $msgfile = $this->listdir . "/archive/" . $msgfile; }
25
		else if (is_file($this->listdir . "/archive/" . $msgfile)) { $msgfile = $this->listdir . "/archive/" . $msgfile; }
26
		else { return FALSE; }
26
		else { return FALSE; }
27
	    }
27
	    }
28
	$this->msgfile = $msgfile ;
28
	$this->msgfile = $msgfile ;
29
        $message = file_get_contents($msgfile) ;
29
        $message = file_get_contents($msgfile) ;
30
	// En cours de codage
30
	// En cours de codage
31
	// La fonction display retourne tout simplement le source du mail
31
	// La fonction display retourne tout simplement le source du mail
32
	// Il n'y a plus d'analyse a ce niveau
32
	// Il n'y a plus d'analyse a ce niveau
33
	
33
	
34
	return $message;
34
	return $message;
35
        $mimeDecode = new Mail_mimeDecode($message) ;
35
        $mimeDecode = new Mail_mimeDecode($message) ;
36
        $mailDecode = $mimeDecode->decode(array('decode_bodies' => 'true', 'include_bodies' => 'true')) ;
36
        $mailDecode = $mimeDecode->decode(array('decode_bodies' => 'true', 'include_bodies' => 'true')) ;
37
        
37
        
38
        // $msg->msgfile contient le chemin du fichier du mail en partant de la racine
38
        // $msg->msgfile contient le chemin du fichier du mail en partant de la racine
39
        // Le point d'exclamation est le delimiteur de l'expression reguliere
39
        // Le point d'exclamation est le delimiteur de l'expression reguliere
40
		$relfile = preg_replace('!' . $this->listdir . '!', '', $msgfile);
40
		$relfile = preg_replace('!' . $this->listdir . '!', '', $msgfile);
41
        
41
        
42
		$a1 = preg_replace('!/archive/(.*)/.*$!', '\1', $relfile);  // $a1 contient le nom du repertoire
42
		$a1 = preg_replace('!/archive/(.*)/.*$!', '\1', $relfile);  // $a1 contient le nom du repertoire
43
		$a2 = preg_replace('!/archive/.*/(.*)$!', '\1', $relfile);  // $a2 contient le nom du fichier
43
		$a2 = preg_replace('!/archive/.*/(.*)$!', '\1', $relfile);  // $a2 contient le nom du fichier
44
		if (isset($mailDecode->headers['date'])) $msgtime = strtotime(preg_replace ('/CEST/', '', $mailDecode->headers['date']));
44
		if (isset($mailDecode->headers['date'])) $msgtime = strtotime(preg_replace ('/CEST/', '', $mailDecode->headers['date']));
45
        $threadidx = date("Ym", $msgtime);
45
        $threadidx = date("Ym", $msgtime);
46
        if ($a2 <= 10) $numero_precedent = '0'.($a2 - 1) ; else $numero_precedent = ($a2 - 1) ;
46
        if ($a2 <= 10) $numero_precedent = '0'.($a2 - 1) ; else $numero_precedent = ($a2 - 1) ;
47
        if ($a2 < 9) $numero_suivant = '0'.($a2 + 1) ; else $numero_suivant =  ($a2 + 1);
47
        if ($a2 < 9) $numero_suivant = '0'.($a2 + 1) ; else $numero_suivant =  ($a2 + 1);
48
        // On teste si le message suivant existe
48
        // On teste si le message suivant existe
49
        $decoupe = explode ('/', $msgfile) ;
49
        $decoupe = explode ('/', $msgfile) ;
50
        
50
        
51
        // Les nom de fichiers sont du format :
51
        // Les nom de fichiers sont du format :
52
        // archive/0/01
52
        // archive/0/01
53
        // archive/0/02 ... 0/99 archive/1/01 ...
53
        // archive/0/02 ... 0/99 archive/1/01 ...
54
        
54
        
55
        $nom_fichier = $decoupe[count($decoupe)-1] ;
55
        $nom_fichier = $decoupe[count($decoupe)-1] ;
56
        $nom_repertoire = $decoupe[count($decoupe)-2] ;
56
        $nom_repertoire = $decoupe[count($decoupe)-2] ;
57
        $repertoire_suivant = $nom_repertoire ; $repertoire_precedent = $nom_repertoire ;
57
        $repertoire_suivant = $nom_repertoire ; $repertoire_precedent = $nom_repertoire ;
58
        if ($nom_fichier > 8) {
58
        if ($nom_fichier > 8) {
59
            $fichier_suivant = $nom_fichier + 1 ;
59
            $fichier_suivant = $nom_fichier + 1 ;
60
            if ($nom_fichier == 99) {
60
            if ($nom_fichier == 99) {
61
                $fichier_suivant = '01' ;
61
                $fichier_suivant = '01' ;
62
                $repertoire_suivant = $nom_repertoire + 1 ;
62
                $repertoire_suivant = $nom_repertoire + 1 ;
63
            }
63
            }
64
        } else {
64
        } else {
65
            $fichier_suivant = '0'.($nom_fichier + 1) ;
65
            $fichier_suivant = '0'.($nom_fichier + 1) ;
66
        }
66
        }
67
        if ($nom_fichier > 10) {
67
        if ($nom_fichier > 10) {
68
            $fichier_precedent = $nom_fichier - 1 ;
68
            $fichier_precedent = $nom_fichier - 1 ;
69
        } else {
69
        } else {
70
            if ($nom_fichier == '01') {
70
            if ($nom_fichier == '01') {
71
                $fichier_precedent = '99' ;
71
                $fichier_precedent = '99' ;
72
                $repertoire_precedent = $nom_repertoire - 1 ;
72
                $repertoire_precedent = $nom_repertoire - 1 ;
73
            } else {
73
            } else {
74
                $fichier_precedent = '0'.($nom_fichier - 1) ;
74
                $fichier_precedent = '0'.($nom_fichier - 1) ;
75
            }
75
            }
76
        }
76
        }
77
        print $this->parse_entete_mail($mailDecode) ;
77
        print $this->parse_entete_mail($mailDecode) ;
78
		$this->parse_template($mailDecode, $a2, $a1);
78
		$this->parse_template($mailDecode, $a2, $a1);
79
        print $this->message_rendu;
79
        print $this->message_rendu;
80
        //print '</div>' ;
80
        //print '</div>' ;
81
	}
81
	}
82
    
82
    
83
    /**
83
    /**
84
     * Renvoie les infos des messages suivants
84
     * Renvoie les infos des messages suivants
85
     * 
85
     * 
86
     *
86
     *
87
    */
87
    */
88
    function getInfoSuivant() {
88
    function getInfoSuivant() {
89
		$relfile = preg_replace('!' . $this->listdir . '!', '', $this->msgfile);
89
		$relfile = preg_replace('!' . $this->listdir . '!', '', $this->msgfile);
90
	 	$nom_repertoire = preg_replace('!/archive/(.*)/.*$!', '\1', $relfile);
90
	 	$nom_repertoire = preg_replace('!/archive/(.*)/.*$!', '\1', $relfile);
91
		$nom_fichier = preg_replace('!/archive/.*/(.*)$!', '\1', $relfile);
91
		$nom_fichier = preg_replace('!/archive/.*/(.*)$!', '\1', $relfile);
92
	       
92
	       
93
		$repertoire_suivant = $nom_repertoire;
93
		$repertoire_suivant = $nom_repertoire;
94
		
94
		
95
		// On recupere le numero du dernier message
95
		// On recupere le numero du dernier message
96
		if (file_exists($this->listdir.'/archnum')) {
96
		if (file_exists($this->listdir.'/archnum')) {
97
			$numero_dernier_message = file_get_contents($this->listdir.'/archnum');
97
			$numero_dernier_message = file_get_contents($this->listdir.'/archnum');
98
		}
98
		}
99
		
99
		
100
		// a partir du nom du fichier
100
		// a partir du nom du fichier
101
		// et du nom du repertoire, on reconstitue
101
		// et du nom du repertoire, on reconstitue
102
		// le numero du message stocke dans le fichier d index
102
		// le numero du message stocke dans le fichier d index
103
		// le message 12 du repertoire 2 a le numero 212
103
		// le message 12 du repertoire 2 a le numero 212
104
		
104
		
105
		if ($nom_repertoire == '0') {
105
		if ($nom_repertoire == '0') {
106
			$numero_message = $nom_fichier;
106
			$numero_message = $nom_fichier;
107
		} else {
107
		} else {
108
			$numero_message = $nom_repertoire.$nom_fichier ;
108
			$numero_message = $nom_repertoire.$nom_fichier ;
109
		}
109
		}
110
		
110
		
111
		// On ouvre le fichier d index
111
		// On ouvre le fichier d index
112
		$fichier_index = fopen ($this->listdir.'/archive/'.$nom_repertoire.'/index', 'r');
112
		$fichier_index = fopen ($this->listdir.'/archive/'.$nom_repertoire.'/index', 'r');
113
		
113
		
114
		
114
		
115
		$compteur_ligne = 1;
115
		$compteur_ligne = 1;
116
		if (preg_match ('/0([1-9][0-9]*)/', $nom_fichier, $match)) {
116
		if (preg_match ('/0([1-9][0-9]*)/', $nom_fichier, $match)) {
117
			$nom_fichier = $match[1];
117
			$nom_fichier = $match[1];
118
			$prefixe = '0' ;
118
			$prefixe = '0' ;
119
		} else {
119
		} else {
120
			$prefixe = '' ;
120
			$prefixe = '' ;
121
		}
121
		}
122
		$prefixe = $this->prefixe_nom_message($nom_fichier);
122
		$prefixe = $this->prefixe_nom_message($nom_fichier);
123
		//echo $numero_message;
123
		//echo $numero_message;
124
		// on cherche la ligne avec le numero du message
124
		// on cherche la ligne avec le numero du message
125
		while (!feof($fichier_index)) {
125
		while (!feof($fichier_index)) {
126
				
126
				
127
				$temp = fgets($fichier_index,4096);
127
				$temp = fgets($fichier_index,4096);
-
 
128
				$x = preg_match('/(\d+): (\w+) (.*)/', $temp, $matches);
-
 
129
                array_shift($matches);
128
				list($num, $hash, $sujet) = split (':', $temp) ;
130
                list($num, $hash, $sujet) = $matches;
129
				
131
 
130
				if ($num == $numero_message) {
132
				if ($num == $numero_message) {
131
					
133
					
132
					$ligne_message_precedent = $compteur_ligne -2;
134
					$ligne_message_precedent = $compteur_ligne -2;
133
					$temp = fgets($fichier_index, 4096);
135
					$temp = fgets($fichier_index, 4096);
134
					$temp = fgets($fichier_index, 4096);
136
					$temp = fgets($fichier_index, 4096);
135
					list ($fichier_suivant,$hash, $sujet) = split(':', $temp);
137
					list ($fichier_suivant,$hash, $sujet) = split(':', $temp);
136
					
138
					
137
					// Au cas ou est au dernier message du fichier d index
139
					// Au cas ou est au dernier message du fichier d index
138
					// il faut ouvrir le suivant
140
					// il faut ouvrir le suivant
139
					if (feof($fichier_index)) {
141
					if (feof($fichier_index)) {
140
						$repertoire_suivant++;
142
						$repertoire_suivant++;
141
						if (file_exists($this->listdir.'/archive/'.$repertoire_suivant.'/index')) {
143
						if (file_exists($this->listdir.'/archive/'.$repertoire_suivant.'/index')) {
142
							$fichier_index_suivant = fopen($this->listdir.'/archive/'.$repertoire_suivant.'/index', 'r');
144
							$fichier_index_suivant = fopen($this->listdir.'/archive/'.$repertoire_suivant.'/index', 'r');
143
							// on recupere le numero du premier message
145
							// on recupere le numero du premier message
144
							list($fichier_suivant, $hash, $sujet) = split (':', fgets($fichier_index_suivant), 4096);
146
							list($fichier_suivant, $hash, $sujet) = split (':', fgets($fichier_index_suivant), 4096);
145
							fclose ($fichier_index_suivant);
147
							fclose ($fichier_index_suivant);
146
						}
148
						}
147
					}
149
					}
148
					
150
					
149
					// Si le numero est > 100, il faut decouper et ne retenir
151
					// Si le numero est > 100, il faut decouper et ne retenir
150
					// que les dizaines et unites
152
					// que les dizaines et unites
151
					if ($fichier_suivant >= 100) {
153
					if ($fichier_suivant >= 100) {
152
						$decimal = (string) $fichier_suivant;
154
						$decimal = (string) $fichier_suivant;
153
						$numero = substr($decimal, -2) ;
155
						$numero = substr($decimal, -2) ;
154
						$fichier_suivant = $numero ;
156
						$fichier_suivant = $numero ;
155
					} else {
157
					} else {
156
						if ($fichier_suivant <= 9)$fichier_suivant = '0'.$fichier_suivant;
158
						if ($fichier_suivant <= 9)$fichier_suivant = '0'.$fichier_suivant;
157
					}
159
					}
158
					
160
					
159
					break;
161
					break;
160
				}
162
				}
161
				
163
				
162
				// On avance d une ligne, la 2e ligne contient date hash auteur
164
				// On avance d une ligne, la 2e ligne contient date hash auteur
163
				$temp2 = fgets($fichier_index, 4096);
165
				$temp2 = fgets($fichier_index, 4096);
164
				$compteur_ligne += 2;
166
				$compteur_ligne += 2;
165
		}
167
		}
166
		
168
		
167
		// On utilise $ligne_message_precedent pour recupere le num du message precedent
169
		// On utilise $ligne_message_precedent pour recupere le num du message precedent
168
		// Si $ligne_precedent est negatif soit c le premier message de la liste
170
		// Si $ligne_precedent est negatif soit c le premier message de la liste
169
		// soit il faut ouvrir le repertoire precedent 
171
		// soit il faut ouvrir le repertoire precedent 
170
		
172
		
171
		if ($ligne_message_precedent > 0) {
173
		if ($ligne_message_precedent > 0) {
172
			$compteur = 1;
174
			$compteur = 1;
173
			rewind($fichier_index);
175
			rewind($fichier_index);
174
			while (!feof($fichier_index)) {
176
			while (!feof($fichier_index)) {
175
				$temp = fgets($fichier_index, 4096);
177
				$temp = fgets($fichier_index, 4096);
176
				if ($ligne_message_precedent == $compteur) {
178
				if ($ligne_message_precedent == $compteur) {
177
					list ($fichier_precedent, $hash, $sujet) = split (':', $temp) ; 	
179
					list ($fichier_precedent, $hash, $sujet) = split (':', $temp) ; 	
178
				}
180
				}
179
				$compteur++;
181
				$compteur++;
180
			}
182
			}
181
			// Le nom du repertoire precedent est le meme que le repertoire courant
183
			// Le nom du repertoire precedent est le meme que le repertoire courant
182
			$repertoire_precedent = $nom_repertoire ;
184
			$repertoire_precedent = $nom_repertoire ;
183
		// Si $ligne_message_precedent est negatif, alors il faut ouvrir
185
		// Si $ligne_message_precedent est negatif, alors il faut ouvrir
184
		// le fichier index du repertoire precedent
186
		// le fichier index du repertoire precedent
185
		// si le nom du repertoire est 0, alors il n y a pas de repertoire precedent
187
		// si le nom du repertoire est 0, alors il n y a pas de repertoire precedent
186
		// et donc pas de message precedent
188
		// et donc pas de message precedent
187
		} else {
189
		} else {
188
			
190
			
189
			if ($nom_repertoire != '0') {
191
			if ($nom_repertoire != '0') {
190
				$repertoire_precedent = $nom_repertoire -1 ;
192
				$repertoire_precedent = $nom_repertoire -1 ;
191
				// on ouvre le fichier d index et on extraie le numero
193
				// on ouvre le fichier d index et on extraie le numero
192
				// du dernier message
194
				// du dernier message
193
				
195
				
194
				$fichier_index_precedent = fopen ($this->listdir.'/archive/'.$repertoire_precedent.'/index', 'r') ;
196
				$fichier_index_precedent = fopen ($this->listdir.'/archive/'.$repertoire_precedent.'/index', 'r') ;
195
				while (!feof($fichier_index_precedent)) {
197
				while (!feof($fichier_index_precedent)) {
196
					$temp = fgets($fichier_index_precedent,4096);
198
					$temp = fgets($fichier_index_precedent,4096);
197
					$ligne = split (':', $temp) ;
199
					$ligne = split (':', $temp) ;
198
					if ($ligne[0] != '') $fichier_precedent = $ligne[0];
200
					if ($ligne[0] != '') $fichier_precedent = $ligne[0];
199
					$temp = fgets($fichier_index_precedent,4096);
201
					$temp = fgets($fichier_index_precedent,4096);
200
				}
202
				}
201
				
203
				
202
				fclose ($fichier_index_precedent);
204
				fclose ($fichier_index_precedent);
203
			// on se situe dans le repertoire 0 donc pas de message precedent
205
			// on se situe dans le repertoire 0 donc pas de message precedent
204
			} else {
206
			} else {
205
				$fichier_precedent = null;
207
				$fichier_precedent = null;
206
				$repertoire_precedent = null;
208
				$repertoire_precedent = null;
207
			}
209
			}
208
		}
210
		}
209
		if ($fichier_precedent > 100) {
211
		if ($fichier_precedent > 100) {
210
			$decimal = (string) $fichier_precedent;
212
			$decimal = (string) $fichier_precedent;
211
			$numero = substr($decimal, -2) ;
213
			$numero = substr($decimal, -2) ;
212
			$fichier_precedent = $numero ;
214
			$fichier_precedent = $numero ;
213
		} else {
215
		} else {
214
			if ($fichier_precedent < 10 )$fichier_precedent = '0'.$fichier_precedent;
216
			if ($fichier_precedent < 10 )$fichier_precedent = '0'.$fichier_precedent;
215
		}
217
		}
216
		fclose ($fichier_index);
218
		fclose ($fichier_index);
217
		//if ($fichier_precedent != null && $fichier_precedent < 10) $fichier_precedent = '0'.$fichier_precedent;
219
		//if ($fichier_precedent != null && $fichier_precedent < 10) $fichier_precedent = '0'.$fichier_precedent;
218
	
220
	
219
		return array ('fichier_suivant' => $fichier_suivant,
221
		return array ('fichier_suivant' => $fichier_suivant,
220
			      'repertoire_suivant' => $repertoire_suivant,
222
			      'repertoire_suivant' => $repertoire_suivant,
221
			      'fichier_precedent' => $fichier_precedent,
223
			      'fichier_precedent' => $fichier_precedent,
222
			      'repertoire_precedent' => $repertoire_precedent);
224
			      'repertoire_precedent' => $repertoire_precedent);
223
	}
225
	}
224
	
226
	
225
    /**
227
    /**
226
    *   analyse l'entete d'un mail pour en extraire les entête
228
    *   analyse l'entete d'un mail pour en extraire les entête
227
    *   to, from, subject, date
229
    *   to, from, subject, date
228
    *   met à jour la variable $this->msgtmpl
230
    *   met à jour la variable $this->msgtmpl
229
    *
231
    *
230
    */
232
    */
231
    
233
    
232
    function parse_entete_mail (&$mailDecode) {
234
    function parse_entete_mail (&$mailDecode) {
233
        $startpos = strpos(strtolower($this->msgtmpl_entete), '<ezmlm-headers>');
235
        $startpos = strpos(strtolower($this->msgtmpl_entete), '<ezmlm-headers>');
234
        $endpos = strpos(strtolower($this->msgtmpl_entete), '</ezmlm-headers>');
236
        $endpos = strpos(strtolower($this->msgtmpl_entete), '</ezmlm-headers>');
235
		$headers = substr($this->msgtmpl_entete,$startpos + 15,($endpos - $startpos - 15));
237
		$headers = substr($this->msgtmpl_entete,$startpos + 15,($endpos - $startpos - 15));
236
        $headers_replace = '' ;
238
        $headers_replace = '' ;
237
		for ($i = 0; $i < count($this->showheaders); $i++) {
239
		for ($i = 0; $i < count($this->showheaders); $i++) {
238
		    $val = $this->showheaders[$i];
240
		    $val = $this->showheaders[$i];
239
		    $headers_replace .= $headers;
241
		    $headers_replace .= $headers;
240
		    $hnpos = strpos(strtolower($headers_replace), '<ezmlm-header-name>');
242
		    $hnpos = strpos(strtolower($headers_replace), '<ezmlm-header-name>');
241
		    $headers_replace = substr_replace($headers_replace, $this->header_en_francais[$val], $hnpos, 19);
243
		    $headers_replace = substr_replace($headers_replace, $this->header_en_francais[$val], $hnpos, 19);
242
		    $hvpos = strpos(strtolower($headers_replace), '<ezmlm-header-value');
244
		    $hvpos = strpos(strtolower($headers_replace), '<ezmlm-header-value');
243
            $headers_replace = $this->decode_iso ($headers_replace) ;
245
            $headers_replace = $this->decode_iso ($headers_replace) ;
244
            switch ($val) {
246
            switch ($val) {
245
            	case 'date':
247
            	case 'date':
246
            	$headers_replace = substr_replace($headers_replace, $this->date_francaise($mailDecode->headers[strtolower($val)]), $hvpos, 20);
248
            	$headers_replace = substr_replace($headers_replace, $this->date_francaise($mailDecode->headers[strtolower($val)]), $hvpos, 20);
247
            	break;
249
            	break;
248
            	case 'from':
250
            	case 'from':
249
            	if ($mailDecode->headers[strtolower($val)] == '') $from = $mailDecode->headers['return-path'] ;
251
            	if ($mailDecode->headers[strtolower($val)] == '') $from = $mailDecode->headers['return-path'] ;
250
            		else $from = $mailDecode->headers['from'];
252
            		else $from = $mailDecode->headers['from'];
251
            	$headers_replace = substr_replace($headers_replace, $this->protect_email($this->decode_iso($from)), $hvpos, 20);
253
            	$headers_replace = substr_replace($headers_replace, $this->protect_email($this->decode_iso($from)), $hvpos, 20);
252
            	//$headers_replace = htmlspecialchars($headers_replace);
254
            	//$headers_replace = htmlspecialchars($headers_replace);
253
            	break;
255
            	break;
254
            	default:
256
            	default:
255
            	$headers_replace = substr_replace($headers_replace, $this->protect_email($this->decode_iso($mailDecode->headers[strtolower($val)])), $hvpos, 20);
257
            	$headers_replace = substr_replace($headers_replace, $this->protect_email($this->decode_iso($mailDecode->headers[strtolower($val)])), $hvpos, 20);
256
            }
258
            }
257
		}
259
		}
258
        return substr_replace($this->msgtmpl_entete, $headers_replace, $startpos, (($endpos + 16) - $startpos));
260
        return substr_replace($this->msgtmpl_entete, $headers_replace, $startpos, (($endpos + 16) - $startpos));
259
    }
261
    }
260
    
262
    
261
    
263
    
262
	function parse_template(&$mailDecode, $numero_mail, $numero_mois, $num_part = '') {
264
	function parse_template(&$mailDecode, $numero_mail, $numero_mois, $num_part = '') {
263
        static $profondeur = array();
265
        static $profondeur = array();
264
        if ($num_part != '') array_push ($profondeur, $num_part) ;
266
        if ($num_part != '') array_push ($profondeur, $num_part) ;
265
        $corps = '' ;
267
        $corps = '' ;
266
        
268
        
267
		if ($mailDecode->ctype_primary == 'multipart') {
269
		if ($mailDecode->ctype_primary == 'multipart') {
268
            include_once PROJET_CHEMIN_CLASSES.'type_fichier_mime.class.php' ;
270
            include_once PROJET_CHEMIN_CLASSES.'type_fichier_mime.class.php' ;
269
			for ($i = 0; $i < count($mailDecode->parts); $i++) {
271
			for ($i = 0; $i < count($mailDecode->parts); $i++) {
270
                switch ($mailDecode->parts[$i]->ctype_secondary) {
272
                switch ($mailDecode->parts[$i]->ctype_secondary) {
271
                    case 'plain' : 
273
                    case 'plain' : 
272
                    if ($mailDecode->parts[$i]->headers['content-transfer-encoding'] == '8bit') {
274
                    if ($mailDecode->parts[$i]->headers['content-transfer-encoding'] == '8bit') {
273
                    	$corps .= $this->_cte_8bit($mailDecode->parts[$i]->body);
275
                    	$corps .= $this->_cte_8bit($mailDecode->parts[$i]->body);
274
                    } else if ($mailDecode->parts[$i]->headers['content-transfer-encoding'] == 'quoted-printable') {
276
                    } else if ($mailDecode->parts[$i]->headers['content-transfer-encoding'] == 'quoted-printable') {
275
                    	if ($mailDecode->parts[$i]->ctype_parameters['charset'] == 'UTF-8') {
277
                    	if ($mailDecode->parts[$i]->ctype_parameters['charset'] == 'UTF-8') {
276
                    		$corps .= utf8_decode($mailDecode->parts[$i]->body);	
278
                    		$corps .= utf8_decode($mailDecode->parts[$i]->body);	
277
                    	}
279
                    	}
278
                    }
280
                    }
279
                    break;
281
                    break;
280
                    case 'html' : $corps .= trim(strip_tags ($mailDecode->parts[$i]->body, '<br><p><a><style>'));
282
                    case 'html' : $corps .= trim(strip_tags ($mailDecode->parts[$i]->body, '<br><p><a><style>'));
281
                    break ;
283
                    break ;
282
                    case 'mixed' : 
284
                    case 'mixed' : 
283
                    case 'rfc822' :
285
                    case 'rfc822' :
284
                    case 'alternative' :
286
                    case 'alternative' :
285
                    case 'appledouble' :
287
                    case 'appledouble' :
286
                        $this->parse_template($mailDecode->parts[$i], $numero_mail, $numero_mois, $i) ;
288
                        $this->parse_template($mailDecode->parts[$i], $numero_mail, $numero_mois, $i) ;
287
                    break ;
289
                    break ;
288
                    case 'applefile' : continue ;
290
                    case 'applefile' : continue ;
289
                    break ;
291
                    break ;
290
                    default : 
292
                    default : 
291
                    
293
                    
292
                    if ($mailDecode->parts[$i]->ctype_secondary == 'octet-stream') {
294
                    if ($mailDecode->parts[$i]->ctype_secondary == 'octet-stream') {
293
                        $nom_piece_jointe = $mailDecode->parts[$i]->ctype_parameters['name'] ;
295
                        $nom_piece_jointe = $mailDecode->parts[$i]->ctype_parameters['name'] ;
294
                        $tab = explode ('.', $nom_piece_jointe) ;
296
                        $tab = explode ('.', $nom_piece_jointe) ;
295
                        $extension = $tab[count ($tab) - 1] ;
297
                        $extension = $tab[count ($tab) - 1] ;
296
                        $mimeType = type_fichier_mime::factory($extension);
298
                        $mimeType = type_fichier_mime::factory($extension);
297
                        $mimeType->setCheminIcone(PROJET_CHEMIN_ICONES) ;
299
                        $mimeType->setCheminIcone(PROJET_CHEMIN_ICONES) ;
298
                    } else {
300
                    } else {
299
                        $nom_piece_jointe = isset ($mailDecode->parts[$i]->d_parameters['filename']) ? 
301
                        $nom_piece_jointe = isset ($mailDecode->parts[$i]->d_parameters['filename']) ? 
300
                                            $mailDecode->parts[$i]->d_parameters['filename'] : $mailDecode->parts[$i]->ctype_parameters['name'] ;
302
                                            $mailDecode->parts[$i]->d_parameters['filename'] : $mailDecode->parts[$i]->ctype_parameters['name'] ;
301
                        $mimeType = new type_fichier_mime( $mailDecode->parts[$i]->ctype_primary.'/'.
303
                        $mimeType = new type_fichier_mime( $mailDecode->parts[$i]->ctype_primary.'/'.
302
                                            $mailDecode->parts[$i]->ctype_secondary, PROJET_CHEMIN_ICONES) ;
304
                                            $mailDecode->parts[$i]->ctype_secondary, PROJET_CHEMIN_ICONES) ;
303
                    }
305
                    }
304
                    $lien = PROJET_CHEMIN_APPLI.'fichier_attache.php?nom_liste='.$this->listname.
306
                    $lien = PROJET_CHEMIN_APPLI.'fichier_attache.php?nom_liste='.$this->listname.
305
                                    '&actionargs[]='.$numero_mois.
307
                                    '&actionargs[]='.$numero_mois.
306
                                    '&actionargs[]='.$numero_mail;
308
                                    '&actionargs[]='.$numero_mail;
307
                    if (count ($profondeur) > 0) {
309
                    if (count ($profondeur) > 0) {
308
                        array_shift($profondeur) ;
310
                        array_shift($profondeur) ;
309
                        for ($j= 0; $j < count ($profondeur); $j++) $lien .= '&actionargs[]='.$profondeur[$j];
311
                        for ($j= 0; $j < count ($profondeur); $j++) $lien .= '&actionargs[]='.$profondeur[$j];
310
                    } 
312
                    } 
311
                    $lien .= '&actionargs[]='.$i ;
313
                    $lien .= '&actionargs[]='.$i ;
312
                    $corps .= '<a href="'.$lien.'">';
314
                    $corps .= '<a href="'.$lien.'">';
313
					
315
					
314
                    $corps .= '<img src="'.$mimeType->getCheminIcone().'" alt="'.$nom_piece_jointe.'" />&nbsp;' ;
316
                    $corps .= '<img src="'.$mimeType->getCheminIcone().'" alt="'.$nom_piece_jointe.'" />&nbsp;' ;
315
                    if ($mailDecode->parts[$i]->ctype_secondary == 'jpg' || $mailDecode->parts[$i]->ctype_secondary == 'jpeg') 
317
                    if ($mailDecode->parts[$i]->ctype_secondary == 'jpg' || $mailDecode->parts[$i]->ctype_secondary == 'jpeg') 
316
                    	$corps .= '<img src="'.$lien.'" alt="'.$nom_piece_jointe.'" />&nbsp;' ;
318
                    	$corps .= '<img src="'.$lien.'" alt="'.$nom_piece_jointe.'" />&nbsp;' ;
317
                    $corps .= $nom_piece_jointe;
319
                    $corps .= $nom_piece_jointe;
318
                    $corps .= '</a><br />' ;
320
                    $corps .= '</a><br />' ;
319
                    break ;
321
                    break ;
320
                }
322
                }
321
            }
323
            }
322
            $this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,TRUE), $this->msgtmpl);
324
            $this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,TRUE), $this->msgtmpl);
323
            
325
            
324
		} else if ($mailDecode->ctype_primary == 'message') {
326
		} else if ($mailDecode->ctype_primary == 'message') {
325
            
327
            
326
            $this->message_rendu .= "\n".'<div class="message">'.$this->parse_entete_mail($mailDecode->parts[0]);
328
            $this->message_rendu .= "\n".'<div class="message">'.$this->parse_entete_mail($mailDecode->parts[0]);
327
            $corps .= $this->parse_template($mailDecode->parts[0], $numero_mail, $numero_mois, 0) ;
329
            $corps .= $this->parse_template($mailDecode->parts[0], $numero_mail, $numero_mois, 0) ;
328
            $this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,true), $this->msgtmpl).'</div>';
330
            $this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,true), $this->msgtmpl).'</div>';
329
            
331
            
330
        } else if ($mailDecode->ctype_primary == 'application' || $mailDecode->ctype_primary == 'image'){
332
        } else if ($mailDecode->ctype_primary == 'application' || $mailDecode->ctype_primary == 'image'){
331
            if ($mailDecode->ctype_secondary == 'applefile') return ;
333
            if ($mailDecode->ctype_secondary == 'applefile') return ;
332
            $mimeType = new type_fichier_mime( $mailDecode->ctype_primary.'/'.$mailDecode->ctype_secondary,PROJET_CHEMIN_ICONES) ;
334
            $mimeType = new type_fichier_mime( $mailDecode->ctype_primary.'/'.$mailDecode->ctype_secondary,PROJET_CHEMIN_ICONES) ;
333
            
335
            
334
            if ($mimeType->getIdType() != 12) {
336
            if ($mimeType->getIdType() != 12) {
335
                $corps .= '<a href="'.PROJET_CHEMIN_APPLI.'fichier_attache.php?nom_liste='.$this->listname.'&actionargs[]='.
337
                $corps .= '<a href="'.PROJET_CHEMIN_APPLI.'fichier_attache.php?nom_liste='.$this->listname.'&actionargs[]='.
336
                                    $numero_mois.'&actionargs[]='.
338
                                    $numero_mois.'&actionargs[]='.
337
                                    $numero_mail.'&actionargs[]='.$i.'">'.
339
                                    $numero_mail.'&actionargs[]='.$i.'">'.
338
                                    '<img src="'.$mimeType->getCheminIcone().'" alt="'.$mailDecode->ctype_parameters['name'].'" />&nbsp;' ;
340
                                    '<img src="'.$mimeType->getCheminIcone().'" alt="'.$mailDecode->ctype_parameters['name'].'" />&nbsp;' ;
339
                $corps .= $mailDecode->ctype_parameters['name'].'</a><br />' ;
341
                $corps .= $mailDecode->ctype_parameters['name'].'</a><br />' ;
340
                
342
                
341
                $this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,true), $this->msgtmpl);
343
                $this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,true), $this->msgtmpl);
342
            }
344
            }
343
        } else {
345
        } else {
344
			if (preg_match('/html/i', $mailDecode->ctype_secondary)) {
346
			if (preg_match('/html/i', $mailDecode->ctype_secondary)) {
345
                $this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($mailDecode->body,TRUE), $this->msgtmpl);
347
                $this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($mailDecode->body,TRUE), $this->msgtmpl);
346
            } else {
348
            } else {
347
                if (isset ($mailDecode->ctype_parameters['charset']) && $mailDecode->ctype_parameters['charset'] == 'UTF-8') {
349
                if (isset ($mailDecode->ctype_parameters['charset']) && $mailDecode->ctype_parameters['charset'] == 'UTF-8') {
348
                    $this->message_rendu .= preg_replace('/<ezmlm-body>/i', '<pre>' . utf8_decode($this->cleanup_body($mailDecode->body,TRUE)) . '</pre>', $this->msgtmpl);
350
                    $this->message_rendu .= preg_replace('/<ezmlm-body>/i', '<pre>' . utf8_decode($this->cleanup_body($mailDecode->body,TRUE)) . '</pre>', $this->msgtmpl);
349
                } else {
351
                } else {
350
                    $this->message_rendu .= preg_replace('/<ezmlm-body>/i', '<pre>' . $this->cleanup_body($mailDecode->body,TRUE) . '</pre>', $this->msgtmpl);
352
                    $this->message_rendu .= preg_replace('/<ezmlm-body>/i', '<pre>' . $this->cleanup_body($mailDecode->body,TRUE) . '</pre>', $this->msgtmpl);
351
                }
353
                }
352
            }
354
            }
353
		}
355
		}
354
		array_pop ($profondeur);
356
		array_pop ($profondeur);
355
	}	
357
	}	
356
 
358
 
357
	function ezmlm_msgdisplay() {
359
	function ezmlm_msgdisplay() {
358
		$this->ezmlm_php();
360
		$this->ezmlm_php();
359
		if (($this->msgtemplate != "") and (is_file($this->msgtemplate))) {
361
		if (($this->msgtemplate != "") and (is_file($this->msgtemplate))) {
360
			$fd = fopen($this->msgtemplate, "r");
362
			$fd = fopen($this->msgtemplate, "r");
361
			while (!feof($fd)) { $this->msgtmpl .= fgets($fd,4096); }
363
			while (!feof($fd)) { $this->msgtmpl .= fgets($fd,4096); }
362
			fclose($fd);
364
			fclose($fd);
363
		} else {
365
		} else {
364
			$this->msgtmpl = '<pre>
366
			$this->msgtmpl = '<pre>
365
<ezmlm-body>
367
<ezmlm-body>
366
</pre>
368
</pre>
367
        ';
369
        ';
368
		}
370
		}
369
        $this->msgtmpl_entete = '<dl><ezmlm-headers>
371
        $this->msgtmpl_entete = '<dl><ezmlm-headers>
370
<dt><ezmlm-header-name> :</dt>
372
<dt><ezmlm-header-name> :</dt>
371
<dd><ezmlm-header-value></dd>
373
<dd><ezmlm-header-value></dd>
372
</ezmlm-headers>
374
</ezmlm-headers>
373
</dl>' ;
375
</dl>' ;
374
	}
376
	}
375
	
377
	
376
		// _cte_8bit: decode a content transfer encoding of 8bit
378
		// _cte_8bit: decode a content transfer encoding of 8bit
377
	// NOTE: this function is a little bit special. Since the end result will be displayed in
379
	// NOTE: this function is a little bit special. Since the end result will be displayed in
378
	// a web browser _cte_8bit decodes ASCII characters > 127 (the US-ASCII table) into the
380
	// a web browser _cte_8bit decodes ASCII characters > 127 (the US-ASCII table) into the
379
	// html ordinal equivilant, it also ensures that the messages content-type is changed
381
	// html ordinal equivilant, it also ensures that the messages content-type is changed
380
	// to include text/html if it changes anything...
382
	// to include text/html if it changes anything...
381
	function _cte_8bit($data,$simple = FALSE) {
383
	function _cte_8bit($data,$simple = FALSE) {
382
		if ($simple) { return $data; }
384
		if ($simple) { return $data; }
383
		$changed = FALSE;
385
		$changed = FALSE;
384
		$out = '';
386
		$out = '';
385
		$chars = preg_split('//',$data);
387
		$chars = preg_split('//',$data);
386
		while (list($key,$val) = each($chars)) {
388
		while (list($key,$val) = each($chars)) {
387
			if (ord($val) > 127) { $out .= '&#' . ord($val) . ';'; $changed = TRUE; }
389
			if (ord($val) > 127) { $out .= '&#' . ord($val) . ';'; $changed = TRUE; }
388
			else { $out .= $val; }
390
			else { $out .= $val; }
389
		}
391
		}
390
		if ($changed) { $this->headers['content-type'][1] = 'text/html'; }
392
		if ($changed) { $this->headers['content-type'][1] = 'text/html'; }
391
		return $out;
393
		return $out;
392
	}
394
	}
393
 
395
 
394
}
396
}