listdir . "/" . $msgfile)) { $msgfile = $this->listdir . "/" . $msgfile; } else if (is_file($this->listdir . "/archive/" . $msgfile)) { $msgfile = $this->listdir . "/archive/" . $msgfile; } else { return FALSE; } } $this->msgfile = $msgfile ; $message = file_get_contents($msgfile) ; // En cours de codage // La fonction display retourne tout simplement le source du mail // Il n'y a plus d'analyse à ce niveau return $message; $mimeDecode = new Mail_mimeDecode($message) ; $mailDecode = $mimeDecode->decode(array('decode_bodies' => 'true', 'include_bodies' => 'true')) ; // $msg->msgfile contient le chemin du fichier du mail en partant de la racine // Le point d'exclamation est le délimiteur de l'expression régulière $relfile = preg_replace('!' . $this->listdir . '!', '', $msgfile); $a1 = preg_replace('!/archive/(.*)/.*$!', '\1', $relfile); // $a1 contient le nom du répertoire $a2 = preg_replace('!/archive/.*/(.*)$!', '\1', $relfile); // $a2 contient le nom du fichier if (isset($mailDecode->headers['date'])) $msgtime = strtotime(preg_replace ('/CEST/', '', $mailDecode->headers['date'])); $threadidx = date("Ym", $msgtime); if ($a2 <= 10) $numero_precedent = '0'.($a2 - 1) ; else $numero_precedent = ($a2 - 1) ; if ($a2 < 9) $numero_suivant = '0'.($a2 + 1) ; else $numero_suivant = ($a2 + 1); // On teste si le message suivant existe $decoupe = explode ('/', $msgfile) ; // Les nom de fichiers sont du format : // archive/0/01 // archive/0/02 ... 0/99 archive/1/01 ... $nom_fichier = $decoupe[count($decoupe)-1] ; $nom_repertoire = $decoupe[count($decoupe)-2] ; $repertoire_suivant = $nom_repertoire ; $repertoire_precedent = $nom_repertoire ; if ($nom_fichier > 8) { $fichier_suivant = $nom_fichier + 1 ; if ($nom_fichier == 99) { $fichier_suivant = '01' ; $repertoire_suivant = $nom_repertoire + 1 ; } } else { $fichier_suivant = '0'.($nom_fichier + 1) ; } if ($nom_fichier > 10) { $fichier_precedent = $nom_fichier - 1 ; } else { if ($nom_fichier == '01') { $fichier_precedent = '99' ; $repertoire_precedent = $nom_repertoire - 1 ; } else { $fichier_precedent = '0'.($nom_fichier - 1) ; } } print $this->parse_entete_mail($mailDecode) ; $this->parse_template($mailDecode, $a2, $a1); print $this->message_rendu; //print '' ; } /** * Renvoie les infos des messages suivants * * */ function getInfoSuivant() { $relfile = preg_replace('!' . $this->listdir . '!', '', $this->msgfile); $nom_repertoire = preg_replace('!/archive/(.*)/.*$!', '\1', $relfile); $nom_fichier = preg_replace('!/archive/.*/(.*)$!', '\1', $relfile); $repertoire_suivant = $nom_repertoire; // a partir du nom du fichier // et du nom du repertoire, on reconstitue // le numero du message stocke dans le fichier d index // le message 12 du repertoire 2 a le numero 112 if ($nom_repertoire == '0') { $numero_message = $nom_fichier; } else { $numero_message = $nom_repertoire.$nom_fichier ; } // On ouvre le fichier d index $fichier_index = fopen ($this->listdir.'/archive/'.$nom_repertoire.'/index', 'r'); $compteur_ligne = 1; if (preg_match ('/0([1-9][0-9]*)/', $nom_fichier, $match)) { $nom_fichier = $match[1]; $prefixe = '0' ; } else { $prefixe = '' ; } $prefixe = $this->prefixe_nom_message($nom_fichier); //echo $numero_message; // on cherche la ligne avec le numero du message while (!feof($fichier_index)) { $temp = fgets($fichier_index,4096); list($num, $hash, $sujet) = split (':', $temp) ; if ($num == $numero_message) { $ligne_message_precedent = $compteur_ligne -2; $temp = fgets($fichier_index, 4096); $temp = fgets($fichier_index, 4096); list ($fichier_suivant,$hash, $sujet) = split(':', $temp); // Au cas ou est au dernier message du fichier d index // il faut ouvrir le suivant if (feof($fichier_index)) { $repertoire_suivant++; if (file_exists($this->listdir.'/archive/'.$repertoire_suivant.'/index')) { $fichier_index_suivant = fopen($this->listdir.'/archive/'.$repertoire_suivant.'/index', 'r'); // on recupere le numero du premier message list($fichier_suivant, $hash, $sujet) = split (':', fgets($fichier_index_suivant), 4096); fclose ($fichier_index_suivant); } } // Si le numero est > 100, il faut decouper et ne retenir // que les dizaines et unites if ($fichier_suivant >= 100) { $decimal = (string) $fichier_suivant; $numero = substr($decimal, -2) ; $fichier_suivant = $numero ; } else { if ($fichier_suivant <= 9)$fichier_suivant = '0'.$fichier_suivant; } break; } // On avance d une ligne, la 2e ligne contient date hash auteur $temp2 = fgets($fichier_index, 4096); $compteur_ligne += 2; } // On utilise $ligne_message_precedent pour recupere le num du message precedent // Si $ligne_precedent est negatif soit c le premier message de la liste // soit il faut ouvrir le repertoire precedent if ($ligne_message_precedent > 0) { $compteur = 1; rewind($fichier_index); while (!feof($fichier_index)) { $temp = fgets($fichier_index, 4096); if ($ligne_message_precedent == $compteur) { list ($fichier_precedent, $hash, $sujet) = split (':', $temp) ; } $compteur++; } // Le nom du repertoire precedent est le meme que le repertoire courant $repertoire_precedent = $nom_repertoire ; // Si $ligne_message_precedent est negatif, alors il faut ouvrir // le fichier index du repertoire precedent // si le nom du repertoire est 0, alors il n y a pas de repertoire precedent // et donc pas de message precedent } else { if ($nom_repertoire != '0') { $repertoire_precedent = $nom_repertoire -1 ; // on ouvre le fichier d index et on extraie le numero // du dernier message $fichier_index_precedent = fopen ($this->listdir.'/archive/'.$repertoire_precedent.'/index', 'r') ; while (!feof($fichier_index_precedent)) { $temp = fgets($fichier_index_precedent,4096); $ligne = split (':', $temp) ; if ($ligne[0] != '') $fichier_precedent = $ligne[0]; $temp = fgets($fichier_index_precedent,4096); } fclose ($fichier_index_precedent); // on se situe dans le repertoire 0 donc pas de message precedent } else { $fichier_precedent = null; $repertoire_precedent = null; } } if ($fichier_precedent > 100) { $decimal = (string) $fichier_precedent; $numero = substr($decimal, -2) ; $fichier_precedent = $numero ; } else { if ($fichier_precedent < 10 )$fichier_precedent = '0'.$fichier_precedent; } fclose ($fichier_index); //if ($fichier_precedent != null && $fichier_precedent < 10) $fichier_precedent = '0'.$fichier_precedent; return array ('fichier_suivant' => $fichier_suivant, 'repertoire_suivant' => $repertoire_suivant, 'fichier_precedent' => $fichier_precedent, 'repertoire_precedent' => $repertoire_precedent); } /** * analyse l'entete d'un mail pour en extraire les entête * to, from, subject, date * met à jour la variable $this->msgtmpl * */ function parse_entete_mail (&$mailDecode) { $startpos = strpos(strtolower($this->msgtmpl_entete), ''); $endpos = strpos(strtolower($this->msgtmpl_entete), ''); $headers = substr($this->msgtmpl_entete,$startpos + 15,($endpos - $startpos - 15)); $headers_replace = '' ; for ($i = 0; $i < count($this->showheaders); $i++) { $val = $this->showheaders[$i]; $headers_replace .= $headers; $hnpos = strpos(strtolower($headers_replace), ''); $headers_replace = substr_replace($headers_replace, $this->header_en_francais[$val], $hnpos, 19); $hvpos = strpos(strtolower($headers_replace), 'decode_iso ($headers_replace) ; switch ($val) { case 'date': $headers_replace = substr_replace($headers_replace, $this->date_francaise($mailDecode->headers[strtolower($val)]), $hvpos, 20); break; case 'from': if ($mailDecode->headers[strtolower($val)] == '') $from = $mailDecode->headers['return-path'] ; else $from = $mailDecode->headers['from']; $headers_replace = substr_replace($headers_replace, $this->protect_email($this->decode_iso($from)), $hvpos, 20); //$headers_replace = htmlspecialchars($headers_replace); break; default: $headers_replace = substr_replace($headers_replace, $this->protect_email($this->decode_iso($mailDecode->headers[strtolower($val)])), $hvpos, 20); } } return substr_replace($this->msgtmpl_entete, $headers_replace, $startpos, (($endpos + 16) - $startpos)); } function parse_template(&$mailDecode, $numero_mail, $numero_mois, $num_part = '') { static $profondeur = array(); array_push ($profondeur, $num_part) ; $corps = '' ; if ($mailDecode->ctype_primary == 'multipart') { include_once PROJET_CHEMIN_CLASSES.'type_fichier_mime.class.php' ; for ($i = 0; $i < count($mailDecode->parts); $i++) { switch ($mailDecode->parts[$i]->ctype_secondary) { case 'plain' : if ($mailDecode->parts[$i]->headers['content-transfer-encoding'] == '8bit') { $corps .= $this->_cte_8bit($mailDecode->parts[$i]->body); } break; case 'html' : $corps .= $mailDecode->parts[$i]->body ; break ; case 'mixed' : case 'rfc822' : case 'alternative' : case 'appledouble' : $this->parse_template($mailDecode->parts[$i], $numero_mail, $numero_mois, $i) ; break ; case 'applefile' : continue ; break ; default : if ($mailDecode->parts[$i]->ctype_secondary == 'octet-stream') { $nom_piece_jointe = $mailDecode->parts[$i]->ctype_parameters['name'] ; $tab = explode ('.', $nom_piece_jointe) ; $extension = $tab[count ($tab) - 1] ; $mimeType = type_fichier_mime::factory($extension, $GLOBALS['projet_db']); $mimeType->setCheminIcone(PROJET_CHEMIN_ICONES) ; } else { $nom_piece_jointe = isset ($mailDecode->parts[$i]->d_parameters['filename']) ? $mailDecode->parts[$i]->d_parameters['filename'] : $mailDecode->parts[$i]->ctype_parameters['name'] ; $mimeType = new type_fichier_mime($GLOBALS['projet_db'], $mailDecode->parts[$i]->ctype_primary.'/'. $mailDecode->parts[$i]->ctype_secondary, PROJET_CHEMIN_ICONES) ; } $corps .= ''.''.$nom_piece_jointe.' ' ; $corps .= $nom_piece_jointe; $corps .= '
' ; break ; } } $this->message_rendu .= preg_replace('//i', $this->cleanup_body($corps,TRUE), $this->msgtmpl); } else if ($mailDecode->ctype_primary == 'message') { $this->message_rendu .= "\n".'
'.$this->parse_entete_mail($mailDecode->parts[0]); $corps .= $this->parse_template($mailDecode->parts[0], $numero_mail, $numero_mois, 0) ; $this->message_rendu .= preg_replace('//i', $this->cleanup_body($corps,true), $this->msgtmpl).'
'; } else if ($mailDecode->ctype_primary == 'application' || $mailDecode->ctype_primary == 'image'){ if ($mailDecode->ctype_secondary == 'applefile') return ; $mimeType = new type_fichier_mime($GLOBALS['projet_db'], $mailDecode->ctype_primary.'/'.$mailDecode->ctype_secondary,PROJET_CHEMIN_ICONES) ; if ($mimeType->getIdType() != 12) { $corps .= ''. ''.$mailDecode->ctype_parameters['name'].' ' ; $corps .= $mailDecode->ctype_parameters['name'].'
' ; $this->message_rendu .= preg_replace('//i', $this->cleanup_body($corps,true), $this->msgtmpl); } } else { if (preg_match('/html/i', $mailDecode->ctype_secondary)) { $this->message_rendu .= preg_replace('//i', $this->cleanup_body($mailDecode->body,TRUE), $this->msgtmpl); } else { if (isset ($mailDecode->ctype_parameters['charset']) && $mailDecode->ctype_parameters['charset'] == 'UTF-8') { $this->message_rendu .= preg_replace('//i', '
' . utf8_decode($this->cleanup_body($mailDecode->body,TRUE)) . '
', $this->msgtmpl); } else { $this->message_rendu .= preg_replace('//i', '
' . $this->cleanup_body($mailDecode->body,TRUE) . '
', $this->msgtmpl); } } } } function ezmlm_msgdisplay() { $this->ezmlm_php(); if (($this->msgtemplate != "") and (is_file($this->msgtemplate))) { $fd = fopen($this->msgtemplate, "r"); while (!feof($fd)) { $this->msgtmpl .= fgets($fd,4096); } fclose($fd); } else { $this->msgtmpl = '

'; } $this->msgtmpl_entete = '
:
' ; } }