/branches/livraison_menes/classes/ezmlm-php-2.0/ezmlm-author.php |
---|
New file |
0,0 → 1,78 |
<?php |
// $Id: ezmlm-author.php,v 1.2 2005-09-27 16:43:08 alexandre_tb Exp $ |
// |
// ezmlm-author.php - ezmlm-php v2.0 |
// -------------------------------------------------------------- |
// Displays all messages by a given author |
// -------------------------------------------------------------- |
require_once("ezmlm.php"); |
class ezmlm_author extends ezmlm_php { |
function display($authorhash) { |
$file = "/archive/authors/" . substr($authorhash,0,2) . "/" . substr($authorhash,2,18); |
//echo $file ; |
if (!is_file($this->listdir . $file)) { $this->error(EZMLM_INVALID_AUTHOR); return; } |
// Le fichier author comprend |
// Première ligne hash_auteur nom_auteur |
// num_mess:annéemois:hash_sujet sujet |
$fd = @fopen($this->listdir . $file, "r"); |
$i = 0 ; |
$class = array ('ligne_impaire', 'ligne_paire') ; |
while (!feof($fd)) { |
$buf = fgets($fd,4096); |
if (preg_match('/^' . $authorhash . '/', $buf)) { |
// this should ALWAYS be the first line in the file |
$author = preg_replace('/^' . $authorhash . ' /', '', $buf); |
print '<h3>'.PROJET_MESSAGES_DE.$author.'</h3>' ; |
print '<table class="table_cadre">'."\n"; |
print '<tr><th class="col1">De</th><th>Sujet</th><th>Date</th></tr>'."\n"; |
$tableopened = TRUE; |
} else if (preg_match('/^[0-9]*:[0-9]/',$buf)) { |
// this is a valid message line |
// all we need is the first item |
// on récupère le numéro du message pour en extraire le nom du fichier |
$msgfile = preg_replace('/^([0-9]*):.*/', '\1', $buf); |
$msgdir = (int)((int)$msgfile / 100); |
$msgfile = (int)$msgfile % 100; |
if ($msgfile < 10) { $msgfile = "0" . $msgfile; } |
if (!is_file($this->listdir . "/archive/" . $msgdir . "/" . $msgfile)) { |
print "<!-- " . $this->listdir . "/archive/" . $msgdir . "/" . $msgfile . " -->\n"; |
$this->error(EZMLM_INCONSISTANCY); |
fclose($fd); |
return; |
} |
//$msg = new ezmlm_parser(); |
//$msg->parse_file_headers($this->listdir . "/archive/" . $msgdir . "/" . $msgfile); |
$message = file_get_contents($this->listdir . "/archive/" . $msgdir . "/" . $msgfile) ; |
$mimeDecode = new Mail_mimeDecode($message) ; |
$mailDecode = $mimeDecode->decode() ; |
$subject = $mailDecode->headers['subject']; |
$subject = preg_replace("/\[" . $this->listname . "\]/", "", $subject); |
$date = preg_replace ('/CEST/', '', $mailDecode->headers['date']); |
print '<tr class="'.$class[$i].'">'."\n"; |
$hash = $this->makehash($mailDecode->headers['from']); |
print '<td>'.$this->makelink("action=show_author_msgs&actionargs[]=" . $hash,$this->decode_iso($this->protect_email($mailDecode->headers['from'],TRUE))); |
print '</td>'; |
print "<td><b>" . $this->makelink("action=show_msg&actionargs[]=" . $msgdir . "&actionargs[]=" . $msgfile, $this->decode_iso($subject)) . "</b></td>"; |
/* |
print "<td>[" . $this->makelink("action=show_threads&actionargs[]=" . |
date("Ym", strtotime($date)) . "#" . urlencode("/archive/" . $msgdir . "/" . $msgfile), PROJET_FILE_DE_DISCUSSION) . "]</td>\n"; |
*/ |
print "<td>" . $this->date_francaise($mailDecode->headers['date']) . "</td>\n"; |
print "</tr>\n"; |
$i++; |
if ($i == 2) $i = 0 ; |
unset ($mailDecode) ; |
} |
} |
if ($tableopened) { print "</table>\n"; } |
} |
} |
/branches/livraison_menes/classes/ezmlm-php-2.0/ezmlm.php |
---|
New file |
0,0 → 1,312 |
<?php |
// $Id: ezmlm.php,v 1.3 2006-01-10 09:38:27 mathilde Exp $ |
// |
// ezmlm.php - ezmlm-php v2.0 |
// -------------------------------------------------------------- |
// As the site that ezmlm-php was developed for grew, and grew |
// the old system used had to be bandaid fixed more, and more |
// because the site started moving to an object oriented design |
// for all the backend systems and ezmlm wasn't playing nice |
// with the new design. So, ezmlm was redesigned too, and here |
// it is. |
// |
// It may look a little more confusing if you're not used to |
// working with objects but it actually is much more effiecient |
// and organized in it's new incarnation. |
// Simply edit the variables in the ezmlm-php constructor below |
// just like you would with the old ezmlm-php-config.php file, |
// if you're unsure howto do this check out the file CONFIG, |
// then check the USAGE file for how you should include and use |
// the new classes if you are integrating ezmlm-php into your |
// site. |
// (SEARCH FOR: USER-CONFIG to find where to edit.) |
// -------------------------------------------------------------- |
require_once("ezmlm-errors.def"); |
require_once("ezmlm-parser.php"); |
require_once("ezmlm-threads.php"); |
require_once("ezmlm-listinfo.php"); |
require_once("ezmlm-msgdisplay.php"); |
require_once("ezmlm-repondre.php"); |
require_once("ezmlm-author.php"); |
$GLOBALS['mois'] = array ('Janv', 'Fév', 'Mars', 'Avri', 'Mai', 'Juin', 'Juil', 'Août', 'Sept', 'Oct', 'Nov', 'Déc') ; |
// CLASS: ezmlm_php |
// the base class, contains common functions and the config |
class ezmlm_php { |
var $listdir; // the root directory of the list |
var $listname; // the list address upto the @ |
var $listdomain; // the domain for the list |
var $tempdir; // a directory in which the webserver can write cache files |
var $sendheaders; // send generic page headers |
var $sendbody; // send generic body definitions |
var $sendfooters; // send generic page footers |
var $includebefore; // a file to include before the content |
var $includeafter; // a file to include after the content |
var $href; // what to add before the '?param=value' in links |
var $prefertype; // what mime type do you prefer? |
var $showheaders; // what headers should we show? |
var $msgtemplate; // the template for displaying messages (see the file TEMPLATE) |
var $tablecolours; // what are the colours for the table rows? |
var $thread_subjlen; // the maximum length of subjects in the thread view (0 = no limit) |
var $forcehref; // force the base of makelink(); |
// --------- END USER CONFIGURATION --------- |
// Internal variables |
var $action = ''; |
var $actionargs; |
function ezmlm_php() { |
// USER-CONFIG section |
// these variables act the same way ezmlm-php-config.php did in the first release |
// simply edit these variables to match your setup |
$this->listdir = "/home/telabotap/sd/testv4/client/synchroliste/liste/tela-botanica.org/equipe"; |
$this->listname = "equipe"; |
$this->listdomain = "tela-botanica.org"; |
$this->tempdir = "/home/telabotap/www/tmp"; |
$this->sendheaders = TRUE; |
$this->sendbody = TRUE; |
$this->sendfooters = TRUE; |
$this->includebefore = ""; |
$this->includeafter = ""; |
$this->href = ""; |
$this->prefertype = "text/html"; |
$this->showheaders = array( |
"to", |
"from", |
"subject", |
"date" |
); |
$this->header_en_francais = array ('to' => 'A', |
'from' => 'De', |
'subject' => 'Sujet', |
'date' => 'Date') ; |
$this->msgtemplate = "<pre><ezmlm-body></pre>"; // if blank it will use the internal one |
$this->tablecolours = array( |
// delete the next line if you don't want alternating colours |
"#eeeeee", |
"#ffffff" |
); |
$this->thread_subjlen = 55; |
// --- STOP EDITING HERE --- |
// some sanity checking |
if ((!is_dir($this->listdir . "/archive")) or |
(!is_dir($this->listdir . "/archive/authors")) or |
(!is_dir($this->listdir . "/archive/threads")) or |
(!is_dir($this->listdir . "/archive/subjects"))) { |
return false ; |
/*$this->error(EZMLM_INVALID_DIR,TRUE);*/ |
} |
} |
function set_action($action) { |
if (is_array($action)) { $this->error(EZMLM_INVALID_SYNTAX,TRUE); } |
$this->action = $action; |
} |
function set_actionargs($actionargs) { |
if ($this->action == '') { $this->error(EZMLM_INVALID_SYNTAX,TRUE); } |
$this->actionargs = $actionargs; |
} |
function run() { |
if ($this->action == '') { $this->error(EZMLM_INVALID_SYNTAX,TRUE); } |
if ($this->sendheaders) { $this->sendheaders(); } |
if ($this->sendbody) { $this->sendbody(); } |
if ($this->includebefore != '') { @include_once($this->includebefore); } |
switch ($this->action) { |
case "list_info": |
$info = new ezmlm_listinfo(); |
$info->display(); |
break; |
case "show_msg": |
if (count($this->actionargs) < 2) { |
$this->error(EZMLM_INVALID_SYNTAX,TRUE); |
} |
$show_msg = new ezmlm_msgdisplay(); |
$show_msg->display($this->actionargs[0] . "/" . $this->actionargs[1]); |
break; |
case "show_threads": |
$threads = new ezmlm_threads(); |
$threads->load($this->actionargs[0]); |
break; |
case "show_author_msgs": |
$author = new ezmlm_author(); |
$author->display($this->actionargs[0]); |
break; |
} |
if ($this->includeafter != '') { @include_once($this->includeafter); } |
if ($this->sendfooters) { $this->sendfooters(); } |
} |
function sendheaders() { |
print "<html><head>\n"; |
print "<style type=\"text/css\">\n"; |
print "<!--\n"; |
print ".heading { font-family: helvetica; font-size: 16px; line-height: 18px; font-weight: bold; }\n"; |
print "//-->\n"; |
print "</style>\n"; |
print "</head>\n"; |
} |
function sendbody() { |
print "<body>\n"; |
} |
function sendfooters() { |
print "</body>\n"; |
print "</html>\n"; |
} |
// begin common functions |
// makehash - generates an author hash using the included makehash program |
function makehash($str) { |
$str = preg_replace ('/>/', '', $str) ; |
$handle = popen ('/usr/local/lib/safe_mode/makehash \''.$str.'\'', 'r') ; |
$hash = fread ($handle, 256) ; |
pclose ($handle) ; |
return $hash; |
} |
// makelink - writes the <a href=".."> tag |
function makelink($params,$text) { |
if ($this->forcehref != "") { |
$basehref = $this->forcehref; |
} else { |
$basehref = preg_replace('/^(.*)\?.*/', '\\1', $_SERVER['REQUEST_URI']); |
} |
$link = '<a href="'. $basehref . '&' . $params . '">' . $text . '</a>'; |
return $link; |
} |
// md5_of_file - provides wrapper function that emulates md5_file for PHP < 4.2.0 |
function md5_of_file($file) { |
if (function_exists("md5_file")) { // php >= 4.2.0 |
return md5_file($file); |
} else { |
if (is_file($file)) { |
$fd = fopen($file, "rb"); |
$filecontents = fread($fd, filesize($file)); |
fclose ($fd); |
return md5($filecontents); |
} else { |
return FALSE; |
} |
} |
} |
// protect_email - protects email address turns user@domain.com into user@d... |
function protect_email($str,$short = FALSE) { |
if (preg_match("/[a-zA-Z0-9\-\.]\@[a-zA-Z0-9\-\.]*\./", $str)) { |
$outstr = preg_replace("/([a-zA-Z0-9\-\.]*\@)([a-zA-Z0-9\-\.])[a-zA-Z0-9\-\.]*\.[a-zA-Z0-9\-\.]*/","\\1\\2...",$str); |
$outstr = preg_replace("/\</", '<', $outstr); |
$outstr = preg_replace("/\>/", '>', $outstr); |
} else { |
$outstr = $str; |
} |
if ($short) { |
$outstr = preg_replace("/<.*>/", '', $outstr); |
$outstr = preg_replace("/[\"']/", '', $outstr); |
} |
return trim($outstr); |
} |
// cleanup_body: sortta like protect_email, just for message bodies |
function cleanup_body($str) { |
$outstr = preg_replace("/([a-zA-Z0-9\-\.]*\@)([a-zA-Z0-9\-\.])[a-zA-Z0-9\-\.]*\.[a-zA-Z0-9\-\.]*/","\\1\\2...",$str); |
return $outstr; |
} |
function error($def, $critical = FALSE) { |
global $ezmlm_error; |
print "\n\n"; |
print "<table width=600 border=1 cellpadding=3 cellspacing=0>\n"; |
print "<tr bgcolor=\"#cccccc\"><td><b>EZMLM-PHP Error: " . $ezmlm_error[$def]['title'] . "</td></tr>\n"; |
print "<tr bgcolor=\"#aaaaaa\"><td>" . $ezmlm_error[$def]['body'] . "</td></tr>\n"; |
print "</table>\n\n"; |
if ($critical) { die; } |
} |
/** |
* Parse une chaime et supprime les problême d'encodage de type ISO-4 ... |
* |
* @return string |
*/ |
function decode_iso ($chaine) { |
if (preg_match ('/windows-[0-9][0-9][0-9][0-9]/i', $chaine, $nombre)) { |
$reg_exp = $nombre[0] ; |
} else { |
$reg_exp = 'ISO-8859-15?' ; |
} |
if (preg_match ('/UTF/i', $chaine)) $reg_exp = 'UTF-8' ; |
preg_match_all ("/=\?$reg_exp\?(Q|B)\?(.*?)\?=/i", $chaine, $match, PREG_PATTERN_ORDER) ; |
for ($i = 0; $i < count ($match[0]); $i++ ) { |
if ($match[1][$i] == 'Q') { |
$decode = quoted_printable_decode ($match[2][$i]) ; |
} elseif ($match[1][$i] == 'B') { |
$decode = base64_decode ($match[2][$i]) ; |
} |
$decode = preg_replace ("/_/", " ", $decode) ; |
if ($reg_exp == 'UTF-8') { |
$decode = utf8_decode ($decode) ; |
} |
$chaine = str_replace ($match[0][$i], $decode, $chaine) ; |
} |
return $chaine ; |
} |
/** |
* |
* |
* @return |
*/ |
function date_francaise ($date_mail) { |
$date_mail = preg_replace ('/CEST/', '', $date_mail) ; |
$numero_mois = date('m ', strtotime($date_mail)) - 1 ; |
$date = date ('d ', strtotime($date_mail)).$GLOBALS['mois'][$numero_mois] ; // Le jour et le mois |
$date .= date(' Y ', strtotime($date_mail)) ; // l'année |
if (date('a', strtotime($date_mail)) == 'pm') { |
$date .= (int) date('g', strtotime($date_mail)) + 12 ; // Les heures |
} else { |
$date .= date('g', strtotime($date_mail)) ; |
} |
$date .= date(':i', strtotime($date_mail)) ; // Les minutes |
return $date ; |
} |
} |
// |
// --- END OF CLASS DEFINITION --- |
// |
// FIN |
/branches/livraison_menes/classes/ezmlm-php-2.0/ezmlm-errors.def |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/branches/livraison_menes/classes/ezmlm-php-2.0/ezmlm-errors.def |
---|
New file |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/livraison_menes/classes/ezmlm-php-2.0/README |
---|
New file |
0,0 → 1,131 |
ezmlm-php 2.0 |
Nov 13, 2002 |
http://www.unixpimps.org/software/ezmlm-php |
ezmlm-php is a group of files written in php that allow you to fetch messages |
from a ezmlm mailing list archive via a web page. It is fully customizable so |
it can fit into an existing layout design very well, it is also self contained |
so that you can run it with no existing site setup. |
The new version has been rewritten from the ground up to exclude all external |
dependancies (except one which comes with the source, see makehash later on) |
and now implements RFC2045 MIME parsing in pure PHP. |
The system is now also object based to allow greater flexibility within the |
code itself, it also makes the code much more managable and readable. |
INSTALLATION |
~~~~~~~~~~~~ |
*NOTE* |
The installation of ezmlm-php now requires access to a compiler to build the |
included makehash program. See the MAKEHASH section at the end. |
1. Unpack the tarball and copy the files to your webroot in the directory you |
want the list to be accessed from. For example using /home/www/mailinglist |
gzip -d ezmlm-php-2.0.tar.gz |
tar xvf ezmlm-php.2.0.tar |
cd /home/www/mailinglist |
cp ~/ezmlm-php-2.0/*.php . |
cp ~/ezmlm-php-2.0/*.def . |
2. Build the included makehash program. |
cd ~/ezmlm-php-2.0 |
gzip -d makehash.tar.gz |
tar xvf makehash.tar |
cd makehash |
make |
If you do not have compiler access check the binaries directory in the |
makehash.tar file as there are some common binaries there. If you build |
makehash on a new platform please feel free to submit the binary for |
inclusion. |
3. Move the resulting binary to your webroot. |
4. Edit ezmlm.php and change the user configurable options. Search for |
USER-CONFIG to find where to edit. See CONFIGURATION below. |
5. Access www.yoursite.com/mailinglist to test the installation. |
CONFIGURATION |
~~~~~~~~~~~~~ |
This section will explain each variable. If you used the last version most |
of these are the exact same. |
Name Meaning |
~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
listdir This variable should be pointed at the root of the ezmlm |
archive. For instance /usr/home/lists/ragga-jungle |
listname The name of the list (everything before the @) |
listdomain The domain name of the list |
tempdir Where to store the cache files. /var/tmp should be fine |
for most installations. /tmp is another choice. |
sendheaders If set to TRUE then ezmlm will generate the nessesary |
page headers. If set to FALSE your header file needs to |
generate them. See 'includebefore' |
sendbody If set to TRUE then ezmlm will generate the <body></body> |
tags. |
sendfooters If set to TRUE then ezmlm will generate the tage needed |
to finish the document. If set to FALSE your footer file |
needs to generate them. See 'includeafter' |
includebefore This is a file that will be included before ezmlm-php |
generates any output. You can have ezmlm-php generate |
the nessesary headers (sendheaders = TRUE) and still |
include a file of your own. The file is included by the |
include_once function. |
includeafter This is the exact same as includebefore except the file |
is included after ezmlm-php has sent all of it's data. |
href This is a string to prepend to the path whenever an |
<a href= tag is generated. This option was added to fix |
the problem of using a <base href= tag. |
prefertype This is the mime type that you wish to send if the |
current message is a multipart message. If this type isn't |
found it defaults to the first part. |
Some examples are: text/html, text/plain, etc... |
showheaders This is an array of the headers to show. You can add or |
remove any valid RFC822 header you wish to this array. |
Some examples: X-Mailer, Message-ID |
(This is case-insensitive) |
msgtemplate This is a file to use as the message template, if blank |
the internal one is used. See the file MSGTEMPLATE for |
more information as it is to much to describe here. |
tablescolours This is an array of colour hex triplets for use when a |
table is generated. For each row that is generated the |
next colour is used, just use a single element if you |
don't want alternating colours. |
(Yes there is a U in colours, the software was written |
in Canada ;) |
thread_subjlen This is an integer that tells the software how many |
characters to allow the subjects when displayed in |
threads or on the info page. This is useful if you |
want to limit subjects to a certain length so that no |
line wrapping occurs. |
MAKEHASH |
~~~~~~~~ |
So what is this little binary you need to build? Simply put it is a small |
little C program to generate the nessesary ezmlm-idx hashes for cross |
referencing authors. In the last version this was done by recursivley doing |
a grep on the /authors directory which isn't very efficient when the list |
subscriber base grows above 1000 or so. This program computes the hash by |
using the same algorithim the software does and speeds things up a lot. |
-FIN- |
/branches/livraison_menes/classes/ezmlm-php-2.0/index.php |
---|
New file |
0,0 → 1,19 |
<?php |
// An even simpler version of the index page than version 1. All the actual work of |
// determining what needs to be included and what needs to be run is now in the main class. |
// Also, 'register_globals' doesn't need to be 'on' anymore. |
require_once("ezmlm.php"); |
$ezmlm = new ezmlm_php(); |
$action = ($_POST['action'] ? $_POST['action'] : ($_GET['action'] ? $_GET['action'] : "list_info")); |
$actionargs = ($_POST['actionargs'] ? $_POST['actionargs'] : ($_GET['actionargs'] ? $_GET['actionargs'] : "")); |
$ezmlm->set_action($action); |
$ezmlm->set_actionargs($actionargs); |
$ezmlm->run(); |
unset($ezmlm); |
?> |
/branches/livraison_menes/classes/ezmlm-php-2.0/ezmlm-listinfo.php |
---|
New file |
0,0 → 1,153 |
<?php |
// $Id: ezmlm-listinfo.php,v 1.2 2005-09-27 16:43:08 alexandre_tb Exp $ |
// |
// ezmlm-listinfo.php - ezmlm-php v2.0 |
// -------------------------------------------------------------- |
// Displays general list info in the format of a welcome page. |
// -------------------------------------------------------------- |
require_once("ezmlm.php"); |
class ezmlm_listinfo extends ezmlm_php { |
function ezmlm_listinfo () { |
return is_dir($this->listdir.'/archive/0') ; |
} |
function display() { |
if (!is_dir($this->listdir.'/archive/0')) { // On teste si il y a au moins un message, cad le répertoire 0 |
echo $this->listdir.'/archive/0' ; |
return false ; |
} |
$parser = new ezmlm_parser(); |
$parser->listdir = $this->listdir ; |
//$this->show_info_file(); |
$threads = new ezmlm_threads(); |
$threads->listdir = $this->listdir ; |
$threads->listname = $this->listname ; |
$threads->forcehref = $this->forcehref ; /// ajout alex |
$threads->listmessages() ; |
$this->show_recentmsgs(); |
return true ; |
} |
function show_info_file() { |
if (@is_file($this->listdir . "/text/info")) { |
$infofile = @file($this->listdir . "/text/info"); |
while (list($line_num, $line) = each($infofile)) { |
print nl2br($line); |
} |
} |
} |
function show_recentmsgs($title = "Messages récents") { |
if (!is_dir($this->listdir.'/archive/0')) return false; |
$parser = new ezmlm_parser(); |
$parser->listdir = $this->listdir ; |
print '<table class="table_cadre">'."\n"; |
print '<tr><th class="col1">Num</th><th>De</th><th>Sujet</th><th>Date</th></tr>'."\n"; |
$ctc = 0; |
$recent = $parser->recent_msgs(); |
$class = array ('ligne_paire', 'ligne_impaire') ; |
while (list($key,$val) = each($recent)) { |
print '<tr class="'.$class[$ctc].'">'."\n"; |
print '<td>'.$val->nummessage.'</td>' ; |
print '<td>'; |
$hash = $this->makehash($val->headers['from']); |
print $this->makelink("action=show_author_msgs&actionargs[]=" . $hash,$this->decode_iso($this->protect_email($val->headers['from'],TRUE))); |
print "</td>\n"; |
print '<td><b>'; |
$actionargs = preg_split("/\//", $val->msgfile); |
if (count ($actionargs) > 2) { |
print $this->makelink("action=show_msg&actionargs[]=" . $actionargs[(count($actionargs) - 2)] . |
"&actionargs[]=" . $actionargs[(count($actionargs) - 1)] ,$this->decode_iso($val->headers['subject'])); |
} |
print "</b></td>\n"; |
print '<td>'.$this->date_francaise($val->headers['date']).'</td>'."\n"; |
print "</tr>\n"; |
$ctc++; |
if ($ctc == 2) { $ctc = 0; } |
} |
print '</table>'."\n"; |
return true; |
} |
function show_month ($month) { |
// Le nom du fichier est annéemoi ex 200501 pour janvier 2005 |
// on ouvre chaque fichier en lecture |
$fd = file_get_contents($this->listdir . '/archive/threads/' . $month, 'r'); |
$fichier = explode ("\n", $fd) ; |
// on récupère la première ligne |
$premiere_ligne = $fichier[0] ; |
$derniere_ligne = $fichier[count($fichier)-2]; |
preg_match ('/[0-9]+/', $premiere_ligne, $match) ; |
$numero_premier_mail = $match[0] ; |
preg_match ('/[0-9]+/', $derniere_ligne, $match1) ; |
$numero_dernier_mail = $match1[0] ; |
// On cherche le répertoire du premier mail |
$repertoire_premier_mail = (int) ($numero_premier_mail / 100) ; |
print '<table class="table_cadre">'."\n"; |
print '<tr><th class="col1">Num</th><th>De</th><th>Sujet</th><th>Date</th></tr>'."\n"; |
$ctc = 0; |
$class = array ('ligne_paire', 'ligne_impaire') ; |
for ($i = $numero_premier_mail, $compteur = $numero_premier_mail ; $compteur <= $numero_dernier_mail; $i++, $compteur++) { |
if ($i > 99) { |
$multiplicateur = (int) ($i / 100) ; |
// pour les nails > 99, on retranche n fois 100, ex 256 => 56 cad 256 - 2 * 100 |
$i = $i - $multiplicateur * 100 ; |
} |
if ($i < 10) $num_message = '0'.$i ; else $num_message = $i ; |
$mimeDecode = new Mail_mimeDecode(file_get_contents ($this->listdir.'/archive/'.$repertoire_premier_mail.'/'.$num_message)) ; |
$mailDecode = $mimeDecode->decode() ; |
if ($i == 99) { |
$repertoire_premier_mail++; |
$i = -1; |
} |
print '<tr class="'.$class[$ctc].'">'."\n"; |
print '<td>'.$repertoire_premier_mail.$num_message.'</td><td>'; |
$hash = $this->makehash($mailDecode->headers['from']); |
print $this->makelink("action=show_author_msgs&actionargs[]=" . $hash,$this->decode_iso($this->protect_email($mailDecode->headers['from'],TRUE))); |
print "</td>\n"; |
print '<td><b>'; |
$actionargs[0] = $repertoire_premier_mail ; |
$actionargs[1] = $num_message ; |
if (count ($actionargs) > 1) { |
print $this->makelink("action=show_msg&actionargs[]=" . $actionargs[(count($actionargs) - 2)] . |
"&actionargs[]=" . $actionargs[(count($actionargs) - 1)] ,$this->decode_iso($mailDecode->headers['subject'])); |
} |
print "</b></td>\n"; |
print '<td>'.$this->date_francaise($mailDecode->headers['date']).'</td>'."\n"; |
print "</tr>\n"; |
$ctc++; |
if ($ctc == 2) { $ctc = 0; } |
} |
print '</table>'."\n"; |
return true; |
} |
} |
/branches/livraison_menes/classes/ezmlm-php-2.0/makehash |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/branches/livraison_menes/classes/ezmlm-php-2.0/makehash |
---|
New file |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/livraison_menes/classes/ezmlm-php-2.0/MSGTEMPLATE |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/branches/livraison_menes/classes/ezmlm-php-2.0/MSGTEMPLATE |
---|
New file |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/livraison_menes/classes/ezmlm-php-2.0/ezmlm-threads.php |
---|
New file |
0,0 → 1,347 |
<?php |
// $Id: ezmlm-threads.php,v 1.4 2006-04-19 13:50:13 alexandre_tb Exp $ |
// |
// ezmlm-threads.php - ezmlm-php v2.0 |
// -------------------------------------------------------------- |
// Builds, maintains & displays thread caches |
// These cache files live in $ezmlm->tmpdir and are serialized |
// php objects that can be unserialized and displayed easily |
// -------------------------------------------------------------- |
require_once("ezmlm.php"); |
require_once("ezmlm-parser.php"); |
// CLASS: ezmlm_threads will build, maintain & display thread files (even if a thread is only 1 msg) |
class ezmlm_threads extends ezmlm_php { |
// load: this is the main function that should be called. |
// it first checks to see if the cache files are stale, if they are it calls build |
// other wise it loads them and calls display |
function load($month) { |
if (!is_dir($this->tempdir . "/ezmlm-php-" . $this->listname)) { |
$checksum = $this->tempdir . "/ezmlm-php-" . $this->listname . "-" . $month . "-" . "checksum"; |
} else { |
$checksum = $this->tempdir . "/ezmlm-php-" . $this->listname . "/" . $month . "-" . "checksum"; |
} |
$md5 = '' ; |
if (!is_file($checksum)) { |
$this->build($month); |
} else { |
$fd = fopen($checksum,"r"); |
while (!preg_match('/^md5:/', $md5)) { $md5 = fgets($fd,4096); } |
fclose($fd); |
$md5 = rtrim(preg_replace('/^md5:/', '', $md5), "\n"); |
if ($md5 != $this->md5_of_file($this->listdir . "/archive/threads/" . $month)) { |
print "<!-- $md5 ne " . $this->md5_of_file($this->listdir . "/archive/threads/" . $month) . " -->\n"; |
$this->build($month); |
} |
} |
$this->display($month); |
} |
// display: this loads each cache file sequentially and displays the messages in them |
// there is no checking of checksum's done here so load() is the preferred method to |
// view the threads |
function display($month) { |
$seq = 0; |
if (!is_dir($this->tempdir . "/ezmlm-php-" . $this->listname)) { |
$cache = $this->tempdir . "/ezmlm-php-" . $this->listname . "-" . $month; |
} else { |
$cache = $this->tempdir . "/ezmlm-php-" . $this->listname . "/" . $month; |
} |
// Le lien par date et par thread |
echo '[ '.$this->makelink('action=show_month&actionargs[]='.$month, 'par date').' ]' ; |
$months = array(1 => 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); |
// remplacé par le tableau globals $mois dans ezmlm.php |
print '<h2>'.PROJET_FILE_DE_DISCUSSION.' pour '.$GLOBALS['mois'][((int)substr($month,4,2) / 1)] .', ' . substr($month,0,4) . '</h2>'."\n"; |
print '<table class="table_cadre">'."\n"; |
print '<tr><th>Num</th><th>De</th><th>Sujet</th><th>Date</th></tr>'."\n"; |
print '<tr><td colspan="3"><hr /></td></tr>'."\n"; |
$ctc = 0; |
if (is_file($cache)) { |
include($cache); |
} |
print '<tr><td colspan="3"></td></tr>'."\n"; |
print '</table>'."\n"; |
} |
function thread_to_html($thread) { |
$html = ''; |
$lastdepth = -1; |
$ctc = 0 ; |
$thread_curr = $thread; |
$class = array ('ligne_paire', 'ligne_impaire') ; |
while ($thread_curr != NULL) { |
preg_match ('!/archive/([0-9]*)/([0-9]*)!', $thread_curr->file, $match) ; |
if (!isset($GLOBALS['fichiers_analyses'][$match[1]][$match[2]])) { |
$message = file_get_contents($this->listdir . "/archive/" . $msgdir . "/" . $msgfile) ; |
$mimeDecode = new Mail_mimeDecode($message) ; |
$mailDecode = $mimeDecode->decode() ; |
//$msg = new ezmlm_parser(); |
//$msg->parse_file($this->listdir . $thread_curr->file, TRUE); |
} else { |
$mailDecode = $GLOBALS['fichiers_analyses'][$match[1]][$match[2]] ; |
} |
$actionargs = preg_split("/\//", $thread_curr->file); |
$html .= '<tr class="'.$class[$ctc].'">'."\n"; |
$html .= '<td>'.$actionargs[2].$actionargs[3].'</td><td>'; |
$html .= $this->makelink('action=show_author_msgs&actionargs[]='. |
$this->makehash($this->decode_iso($mailDecode->headers['from'])),$this->decode_iso($this->protect_email($mailDecode->headers['from'],TRUE))); |
$html .= '</td>'."\n"; |
$html .= '<td><b>'; |
//$html .= " <a name=\"" . urlencode($thread_curr->file) . "\">"; A quoi ça sert ? |
for ($i = 0; $i < $thread_curr->depth; $i++) { |
$html .= " "; |
} |
if (($this->thread_subjlen > 0) and (strlen($this->decode_iso($mailDecode->headers['subject'])) > $this->thread_subjlen)) { |
$subject = substr($this->decode_iso($mailDecode->headers['subject']), 0, ($this->thread_subjlen - 3 - ($thread_curr->depth * 2))); |
$subject = $subject . "..."; |
} else { |
$subject = $this->decode_iso($mailDecode->headers['subject']); |
} |
$subject = preg_replace("/\[" . $this->listname . "\]/", "", $subject); |
$html .= $this->makelink("action=show_msg&actionargs[]=" . $actionargs[2] . "&actionargs[]=" . $actionargs[3], $subject); |
$html .= "</b></td>\n"; |
$html .= '<td>' .$this->date_francaise($mailDecode->headers['date']).'</td>'."\n"; |
$html .= "</tr>\n"; |
$ctc++; |
if ($ctc == count($this->tablecolours)) { $ctc = 0; } |
$lastdepth = $thread_curr->depth; |
$thread_curr = $thread_curr->next; |
} |
$html .= '<tr><td colspan="3"><hr noshade size="1" /></td></tr>'."\n"; |
return $html; |
} |
// build: takes one argument in the format YYYYMM and builds the thread cache file |
// for that month if the ezmlm thread file exists. The resulting cache file is then |
// stored in $this->tmpdir; |
function build($month) { |
if (!is_file($this->listdir . "/archive/threads/" . $month)) { return FALSE; } |
if (!is_dir($this->tempdir . "/ezmlm-php-" . $this->listname)) { |
$fd2 = fopen($this->tempdir . "/ezmlm-php-" . $this->listname . "-" . $month,"w+"); |
} else { |
$fd2 = fopen($this->tempdir . "/ezmlm-php-" . $this->listname . "/" . $month,"w+"); |
} |
fclose($fd2); |
$i=0; |
// ouverture du fichier thread de ezmlm |
// Ils sont classés mois par mois |
$fd1 = fopen($this->listdir . "/archive/threads/" . $month, "r"); |
while (!feof($fd1)) { |
$line = fgets($fd1,4096); |
if (preg_match('/^[0-9]*\:[a-z]* \[.*/', $line)) { |
// valid ezmlm thread file entry |
// On place dans $subjectfile le chemin vers le fichier sujet |
$subjectfile = preg_replace("/^[0-9]*\:([a-z]*) \[.*/", "\\1", $line); |
$subjectfile = substr($subjectfile,0,2) . '/' . substr($subjectfile,2,18); |
$thread_head = NULL; |
$thread_curr = NULL; |
$thread_temp = NULL; |
$thread_depth = 1; |
if (!is_file($this->listdir . "/archive/subjects/" . $subjectfile)) { continue; } |
// on ouvre le fichier sujet |
// Celui-ci contient sur la première ligne le hash du sujet puis le sujet |
// sur les autres lignes : |
// num_message:annéemois:hash_auteur nom_auteur |
$fd2 = fopen($this->listdir . "/archive/subjects/" . $subjectfile, "r"); |
while (!feof($fd2)) { |
$line2 = fgets($fd2,4096); |
if (preg_match('/^[0-9]/',$line2)) { |
$msgnum = preg_replace('/^([0-9]*):.*/', '\\1', $line2); |
$msgfile = $msgnum % 100; |
$msgdir = (int)($msgnum / 100); |
if ($msgfile < 10) { $msgfile = "0" . $msgfile; } |
//$msg = new ezmlm_parser(); |
//$msg->parse_file_headers($this->listdir . "/archive/" . $msgdir . "/" . $msgfile, TRUE); |
$message = file_get_contents($this->listdir . "/archive/" . $msgdir . "/" . $msgfile) ; |
$mimeDecode = new Mail_mimeDecode($message) ; |
$mailDecode = $mimeDecode->decode() ; |
// On stocke le fichier analysée pour réutilisation ultérieure |
$GLOBALS['fichiers_analyses'][$msgdir][$msgfile] = $mailDecode ; |
$msgid = (isset ($mailDecode->headers['message-id']) ? $mailDecode->headers['message-id'] : ''); |
$inreply = (isset($mailDecode->headers['in-reply-to']) ? $mailDecode->headers['in-reply-to'] : ''); |
$references = (isset ($mailDecode->headers['references']) ? $mailDecode->headers['references'] : '') ; |
$thread_depth = 1; |
if ($thread_head == NULL) { |
$thread_head = new ezmlm_thread(0,'/archive/' . $msgdir . '/' . $msgfile,$msgid); |
} else { |
$thread_curr = new ezmlm_thread($depth,'/archive/' . $msgdir . '/' . $msgfile,$msgid); |
if ($inreply != '') { $thread_curr->inreply = $inreply; } |
if ($references != '') { $thread_curr->references = $references; } |
$thread_head->append($thread_curr); |
} |
} |
} |
fclose($fd2); |
// so now after all that mess $thread_head contains a full thread tree |
// first build the depth of each message based on 'in-reply-to' and 'references' |
unset($thread_temp); |
$thread_temp = NULL; |
$thread_curr =& $thread_head->next; |
while (get_class($thread_curr) == 'ezmlm_thread') { |
unset($thread_temp); |
$thread_temp = NULL; |
if ($thread_curr->inreply != '') { $thread_temp =& $thread_head->find_msgid($thread_curr->inreply); } |
if ($thread_temp == NULL) { |
if ($thread_curr->references != '') { |
$refs = preg_split('/ /', $thread_curr->references); |
$refs = array_pop($refs); |
$thread_temp =& $thread_head->find_msgid($refs); |
} |
} |
if ($thread_temp == NULL) { |
// we couldn't find anything... set depth to 1, the default |
$thread_curr->depth = 1; |
} else { |
// we found a reference, set it to it's depth + 1 |
$thread_curr->depth = $thread_temp->depth + 1; |
} |
$thread_curr =& $thread_curr->next; |
} |
// now write it to a temp file named MONTH-SEQ where seq is cronologic sequence order of the thread. |
if (!is_dir($this->tempdir . "/ezmlm-php-" . $this->listname)) { |
@mkdir($this->tempdir . "/ezmlm-php-" . $this->listname, 0755); |
if (!is_dir($this->tempdir . "/ezmlm-php-" . $this->listname)) { |
$fd2 = fopen($this->tempdir . "/ezmlm-php-" . $this->listname . "-" . $month, "a"); |
} else { |
$fd2 = fopen($this->tempdir . "/ezmlm-php-" . $this->listname . "/" . $month, "a"); |
} |
} else { |
$fd2 = fopen($this->tempdir . "/ezmlm-php-" . $this->listname . "/" . $month, "a"); |
} |
fputs($fd2,$this->thread_to_html($thread_head)); |
fclose($fd2); |
} |
} |
// finally store our checksum |
if (!is_dir($this->tempdir . "/ezmlm-php-" . $this->listname)) { |
$fd2 = fopen($this->tempdir . "/ezmlm-php-" . $this->listname . "-" . $month . "-" . "checksum","w+"); |
} else { |
$fd2 = fopen($this->tempdir . "/ezmlm-php-" . $this->listname . "/" . $month . "-" . "checksum","w+"); |
} |
fputs($fd2,"md5:" . $this->md5_of_file($this->listdir . "/archive/threads/" . $month) . "\n"); |
fclose($fd2); |
fclose($fd1); |
return TRUE; |
} |
// listmessages: prints out a nice little calendar and displays the message |
// totals for each month. The link jumps to the thread listing. |
// On lit le répetoire archive/threads/ qui contient un fichier par moi avec tous les thread, par sujet |
// Présentés comme suit |
// num_thread:hash [taille_du_thread] Sujet du thread (le dernier) |
// les messages sont rangés par leur numéro |
function listmessages() { |
if (!is_dir($this->listdir . "/archive/threads/")) { |
return false ; |
} |
$dir = opendir($this->listdir . "/archive/threads/"); |
while ($item = readdir($dir)) { |
if (($item == ".") or ($item == "..")) { continue; } |
// Le nom du fichier est annéemoi ex 200501 pour janvier 2005 |
if (preg_match("/^[0-9][0-9][0-9][0-9][0-9][0-9]/",$item)) { |
// on ouvre chaque fichier en lecture |
$fd = fopen($this->listdir . "/archive/threads/" . $item, "r"); |
$count = 0; // on initialise un compteur |
while(!feof($fd)) { |
$curthread = fgets($fd,4096); |
$num = preg_replace("/.*\[([0-9].*)\].*/", "\\1", $curthread); // $num contient le nbre de message du thread |
$count = $count + $num; |
} |
$threadyear = substr($item,0,4); |
$threadmonth = substr($item,4,2); |
// on construit un tableau à 2 entrée [année][mois] = nbre_message |
$threadcount[$threadyear][$threadmonth] = $count; |
} |
} |
closedir($dir); |
arsort($threadcount); // modifié par alex, car remplace l'année par 0 |
// La partie qui suit, simple, crée la table avec le nombre de message échangé chaque mois |
$res = '<table id="petit_calendrier">'."\n"; |
$res .= " <tr>\n"; |
$res .= " <td></td>" ; |
foreach ($GLOBALS['mois'] as $valeur) $res .= '<td>'.$valeur.'</td>' ; |
$res .=" </tr>\n"; |
while (list($key,$val) = each($threadcount)) { |
$res .= " <tr>\n"; |
$res .= " <td>$key</td>"; |
for ($i = 1; $i <= 12; $i++) { |
if ($i < 10) { $key2 = "0" . $i; } |
else { $key2 = $i; } |
if (isset($threadcount[$key][$key2]) && $threadcount[$key][$key2] > 0) { |
$res .= "<td bgcolor=\"" . $this->tablecolours[0] . "\" valign=\"middle\">"; |
$res .= $this->makelink("action=show_month&actionargs[]=$key$key2",$threadcount[$key][$key2]); |
$res .= "</td>"; |
} else { |
$res .= "<td bgcolor=\"" . $this->tablecolours[0] . "\"></td>"; |
} |
} |
$res .= "</tr>\n"; |
} |
$res .= "</table>\n"; |
echo $res ; |
} |
} |
// CLASS: ezmlm-thread is a quick little class to allow us to define |
// a structure of the current thread in a single-linked list. |
// it's a little messy since php doesn't support pointers like C does |
// so we have to use references and a head object to append to the list. |
class ezmlm_thread { |
var $next; |
var $depth; |
var $file; |
var $msgid; |
var $inreply; |
var $references; |
function append($thread) { |
$thread_curr =& $this; |
while ($thread_curr->next != NULL) { |
$thread_curr =& $thread_curr->next; |
} |
$thread_curr->next = $thread; |
} |
function &find_msgid($msgid) { |
$thread_curr =& $this; |
while ($thread_curr->next != NULL) { |
if (trim($thread_curr->msgid) == trim($msgid)) { return $thread_curr; } |
$thread_curr =& $thread_curr->next; |
} |
return NULL; |
} |
function ezmlm_thread($depth,$file,$msgid) { |
$this->depth = $depth; |
$this->file = $file; |
$this->msgid = $msgid; |
$this->next = NULL; |
} |
} |
?> |
/branches/livraison_menes/classes/ezmlm-php-2.0/ezmlm-msgdisplay.php |
---|
New file |
0,0 → 1,232 |
<?php |
// $Id: ezmlm-msgdisplay.php,v 1.3 2006-04-19 13:50:04 alexandre_tb Exp $ |
// |
// ezmlm-msgdisplay.php - ezmlm-php v2.0 |
// -------------------------------------------------------------- |
// Will parse a template (if specified) and display a message. |
// Includes a default template. |
// -------------------------------------------------------------- |
require_once("ezmlm.php"); |
require_once("Mail/mimeDecode.php") ; |
class ezmlm_msgdisplay extends ezmlm_php { |
// our template |
var $msgtmpl; |
var $message_rendu ; |
var $_auth ; |
// display: parses a message (using ezmlm_parser) and displays it |
// using a template |
function display($msgfile) { |
if (!is_file($msgfile)) { |
if (is_file($this->listdir . "/" . $msgfile)) { $msgfile = $this->listdir . "/" . $msgfile; } |
else if (is_file($this->listdir . "/archive/" . $msgfile)) { $msgfile = $this->listdir . "/archive/" . $msgfile; } |
else { return FALSE; } |
} |
$message = file_get_contents($msgfile) ; |
$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) ; |
} |
} |
if (is_file($this->listdir.'/archive/'.$repertoire_precedent.'/'.$fichier_precedent)) { |
print "[" . $this->makelink("action=show_msg&actionargs[]=$a1&actionargs[]=" . $numero_precedent, ' '.PROJET_PRECEDENT.' ') . "] "; |
} else { |
print '['.PROJET_PRECEDENT.']' ; |
} |
if (is_file($this->listdir.'/archive/'.$repertoire_suivant.'/'.$fichier_suivant)) { |
print "[" . $this->makelink("action=show_msg&actionargs[]=$a1&actionargs[]=" . $numero_suivant, ' '.PROJET_SUIVANT.' ') . "] "; |
} else { |
print '['.PROJET_SUIVANT.']' ; |
} |
// on crée un lien vers la thread avec une ancre vers le message |
$parser = new ezmlm_parser(); |
$parser->listdir = $this->listdir ; |
$recent = $parser->recent_msgs(1); |
$actionargs = preg_split("/\//", $recent[0]->msgfile); |
print "[" . $this->makelink('action=show_msg&actionargs[]=' . $actionargs[(count($actionargs) - 2)] . |
'&actionargs[]=' . $actionargs[(count($actionargs) - 1)] , ' '.PROJET_DERNIER_MESSAGE.' ') . '] '; |
if ($this->_auth->getAuth()) { |
print '['.$this->makelink('action=repondre&actionargs[]='.$a1.'&actionargs[]='.$a2, PROJET_REPONDRE).'] '; |
} |
print '<br />'."\n"; |
print '<div class="message">' ; |
print $this->parse_entete_mail($mailDecode) ; |
$this->parse_template($mailDecode, $a2, $a1); |
print $this->message_rendu; |
print '</div>' ; |
} |
/** |
* analyse l'entete d'un mail pour en extraire les entêtes |
* to, from, subject, date |
* met à jour la variable $this->msgtmpl |
* |
*/ |
function parse_entete_mail (&$mailDecode) { |
$startpos = strpos(strtolower($this->msgtmpl_entete), '<ezmlm-headers>'); |
$endpos = strpos(strtolower($this->msgtmpl_entete), '</ezmlm-headers>'); |
$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), '<ezmlm-header-name>'); |
$headers_replace = substr_replace($headers_replace, $this->header_en_francais[$val], $hnpos, 19); |
$hvpos = strpos(strtolower($headers_replace), '<ezmlm-header-value'); |
if ($val == 'date') { |
$headers_replace = substr_replace($headers_replace, $this->date_francaise($mailDecode->headers[strtolower($val)]), $hvpos, 20); |
} else { |
$headers_replace = substr_replace($headers_replace, $this->protect_email($mailDecode->headers[strtolower($val)]), $hvpos, 20); |
} |
$headers_replace = $this->decode_iso ($headers_replace) ; |
} |
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' : |
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 .= '<a href="'.PROJET_CHEMIN_APPLI.'fichier_attache.php?nom_liste='.$this->listname. |
'&actionargs[]='.$numero_mois. |
'&actionargs[]='.$numero_mail; |
if (count ($profondeur) > 0) { |
array_shift($profondeur) ; |
for ($j= 0; $j < count ($profondeur); $j++) $corps .= '&actionargs[]='.$profondeur[$j]; |
} |
$corps .= '&actionargs[]='.$i ; |
$corps .= '">'.'<img src="'.$mimeType->getCheminIcone().'" alt="'.$nom_piece_jointe.'" /> ' ; |
$corps .= $nom_piece_jointe; |
$corps .= '</a><br />' ; |
break ; |
} |
} |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,TRUE), $this->msgtmpl); |
} else if ($mailDecode->ctype_primary == 'message') { |
$this->message_rendu .= "\n".'<div class="message">'.$this->parse_entete_mail($mailDecode->parts[0]); |
$corps .= $this->parse_template($mailDecode->parts[0], $numero_mail, $numero_mois, 0) ; |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,true), $this->msgtmpl).'</div>'; |
} 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 .= '<a href="'.PROJET_CHEMIN_APPLI.'fichier_attache.php?nom_liste='.$this->listname.'&actionargs[]='. |
$numero_mois.'&actionargs[]='. |
$numero_mail.'&actionargs[]='.$i.'">'. |
'<img src="'.$mimeType->getCheminIcone().'" alt="'.$mailDecode->ctype_parameters['name'].'" /> ' ; |
$corps .= $mailDecode->ctype_parameters['name'].'</a><br />' ; |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,true), $this->msgtmpl); |
} |
} else { |
if (preg_match('/html/i', $mailDecode->ctype_secondary)) { |
$this->message_rendu .= preg_replace('/<ezmlm-body>/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('/<ezmlm-body>/i', '<pre>' . utf8_decode($this->cleanup_body($mailDecode->body,TRUE)) . '</pre>', $this->msgtmpl); |
} else { |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', '<pre>' . $this->cleanup_body($mailDecode->body,TRUE) . '</pre>', $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 = '<pre> |
<ezmlm-body> |
</pre> |
'; |
} |
$this->msgtmpl_entete = '<dl><ezmlm-headers> |
<dt><ezmlm-header-name> :</dt> |
<dd><ezmlm-header-value></dd> |
</ezmlm-headers> |
</dl>' ; |
} |
} |
/branches/livraison_menes/classes/ezmlm-php-2.0/ezmlm-parser.php |
---|
New file |
0,0 → 1,389 |
<?php |
// $Id: ezmlm-parser.php,v 1.2 2005-09-27 16:43:08 alexandre_tb Exp $ |
// |
// ezmlm-parser.php - ezmlm-php v2.0 |
// -------------------------------------------------------------- |
// Contains all the code for parsing messages. |
// It handles all the nessesary decoding, attachments, etc... |
// Note this does all the parsing itself now removing the dependancy |
// on the mailparse library (as it looks like it will never make |
// it into the official inclusion with PHP)... |
// -------------------------------------------------------------- |
require_once("ezmlm.php"); |
require_once("Mail/mimeDecode.php") ; |
// CLASS: ezmlm-parser |
class ezmlm_parser extends ezmlm_php { |
var $headers; // the full untouched headers of the message |
var $body; // the full untouched (but decoded) body (this is not $this->parts[0]->body) |
var $parts; // all the parts, if it is a multipart message. each part is an ezmlm_parser object... |
// Here's the most accessed headers, everything else can be |
// accessed from the $this->headers array. |
var $to; // To: |
var $from; // From: |
var $date; // Date: |
var $subject; // Subject: |
var $replyto; // Reply-To: |
var $contenttype; // Content-Type: |
var $multipart; // TRUE if the message is a multipart message |
var $msgfile; // if parsed from a file, this is the filename... |
// functions |
// recent_msgs - parses and returns an arbitrary number of the most recent messages |
function recent_msgs($show = 20, $month = "") { |
if ($month == "") { $month = date("Ym"); } |
$threadyear = substr($month,0,4); |
$threadmonth = substr($month,4,2); |
if (!is_file($this->listdir . "/archive/threads/" . $month)) { |
if ($threadmonth == '01') { $prevthread = ($threadyear - 1) . "12"; } |
else if ($threadmonth >= 11) { $prevthread = $threadyear . ($threadmonth - 1); } |
else { $prevthread = $threadyear . "0" . ($threadmonth - 1); } |
return $this->recent_msgs($show,$prevthread); |
} |
// on ouvre les fichiers de threads du dernier mois |
$fd = fopen($this->listdir . "/archive/threads/" . $month, "r"); |
fseek($fd,-256,SEEK_END); |
// on récupère la dernière ligne |
while (!feof($fd)) { |
$temp = fgets($fd,4096); |
if ($temp != "") { $curthread = $temp; } |
} |
$nombre_message = 0 ; |
fseek ($fd, 0) ; |
while (!feof($fd)) { |
$nombre_message++; |
fgets($fd); |
} |
fclose($fd); |
///echo "<br />".$curthread."<br />" ; |
$subjectfile = preg_replace("/^[0-9]*\:([a-z]*) \[.*/", "\\1", $curthread); |
$subjectfile = substr($subjectfile,0,2) . "/" . substr($subjectfile,2,18); // on ne garde que les 2 1ère lettre du hash, slash et le reste du hash |
// on ouvre le fichier des sujets |
// présenté comme suit : |
// hash sujet originel (sur la première ligne) |
// num_message:annéemois:hash_auteur Nom Auteur |
$fd = fopen($this->listdir . "/archive/subjects/" . $subjectfile, "r"); |
fseek($fd,-512,SEEK_END); |
// on prend la dernière ligne |
while (!feof($fd)) { |
$temp = fgets($fd,4096); |
if ($temp != "") { $cursubject = $temp; } |
} |
fclose($fd); |
list($msgnum,$fromthread,$authorid) = split(":",$cursubject); |
$msgdir = (int)($msgnum / 100); // on reconstruit le répertoire du message en divisant son numéro par 100 |
$numshown = 0; |
$msgfiles = array(); |
// on boucle 100 fois |
for ($i = 0; $i <= 99; $i++) { |
if (($msgdir == 0) and ($i == 0)) { $i++; }; |
if ($i < 10) { $msgfile = "0" . $i; } |
else { $msgfile = $i; } |
if (!is_file($this->listdir . "/archive/" . $msgdir . "/" . $msgfile)) { break; } |
} |
if ($show == '') $show = $nombre_message ; // Si aucun paramètre n'est passé on renvoie tous les fichiers du mois |
while ($numshown < $show) { |
$i--; |
if ($i < 0) { |
$i = 99; |
$msgdir--; |
if ($msgdir < 0) { break; } |
} |
if ($i < 10) { |
$msgfile = $this->listdir . "/archive/" . $msgdir . "/0" . $i; |
} else { |
$msgfile = $this->listdir . "/archive/" . $msgdir . "/" . $i; |
} |
/* |
$msg = new ezmlm_parser(); |
$msg->parse_file($msgfile); |
*/ |
if (!is_file($msgfile)) { |
if (is_file($this->listdir . "/" . $msgfile)) { |
$msgfile = $this->listdir . "/" . $msgfile; |
} else if (is_file($this->listdir . "/archive/" . $msgfile)) { |
$msgfile = $this->listdir . "/archive/" . $msgfile; |
} else { |
return $msgfiles; |
} |
} |
$message = file_get_contents($msgfile) ; |
$mimeDecode = new Mail_mimeDecode($message) ; |
$mailDecode = $mimeDecode->decode() ; |
$mailDecode->msgfile = $msgfile ; |
$mailDecode->nummessage = $msgdir.$i ; |
$msgfiles[] = $mailDecode ; |
unset($mailDecode); |
$numshown++; |
} |
return $msgfiles; |
} |
// parse_file - opens a file and feeds the data to parse, file can be relative to the listdir |
function parse_file($file,$simple = FALSE) { |
if (!is_file($file)) { |
if (is_file($this->listdir . "/" . $file)) { $file = $this->listdir . "/" . $file; } |
else if (is_file($this->listdir . "/archive/" . $file)) { $file = $this->listdir . "/archive/" . $file; } |
else { return FALSE; } |
} |
$this->msgfile = $file; |
$data = '' ; |
$fd = fopen($file, "r"); |
while (!feof($fd)) { $data .= fgets($fd,4096); } |
fclose($fd); |
return $this->parse($data,$simple); |
} |
// parse_file_headers - ouvre un fichier et analyse les entêtes |
function parse_file_headers($file,$simple = FALSE) { |
if (!is_file($file)) { |
if (is_file($this->listdir . "/" . $file)) { $file = $this->listdir . "/" . $file; } |
else if (is_file($this->listdir . "/archive/" . $file)) { $file = $this->listdir . "/archive/" . $file; } |
else { return FALSE; } |
} |
$this->msgfile = $file; |
$data = file_get_contents ($file) ; |
$message = file_get_contents($file) ; |
$mimeDecode = new Mail_mimeDecode($message) ; |
$mailDecode = $mimeDecode->decode() ; |
return $mailDecode ; |
/*$fd = fopen($file, "r"); |
while (!feof($fd)) { $data .= fgets($fd,4096); } |
fclose($fd);*/ |
if ($this->_get_headers($data, $simple)) return true ; |
return false ; |
} |
// this does all of the work (well it calls two functions that do all the work :) |
// all the decoding a part breaking follows RFC2045 (http://www.faqs.org/rfcs/rfc2045.html) |
function parse($data,$simple = FALSE) { |
if (($this->_get_headers($data,$simple)) && $this->_get_body($data,$simple)) { return TRUE; } |
return FALSE; |
} |
// all of these are internal functions, you shouldn't call them directly... |
// _ct_parse: parse Content-Type headers -> $ct[0] = Full header, $ct[1] = Content-Type, $ct[2] ... $ct[n] = AP's |
function _ct_parse() { |
$instr = $this->headers['content-type']; |
preg_replace('/\(.*\)/','',$instr); // strip rfc822 comments |
if (preg_match('/: /', $instr)) { |
$ct = preg_split('/:/',trim($instr),2); |
$ct = preg_split('/;/',trim($ct[1])); |
} else { |
$ct = preg_split('/;/',trim($instr)); |
} |
if (isset($ct[1])) $attrs = preg_split('/[\s\n]/',$ct[1]); |
$i = 2; |
$ct[1] = $ct[0]; |
$ct[0] = $this->headers['content-type']; |
if (isset($attrs) && is_array($attrs)) { |
while (list($key, $val) = each($attrs)) { |
if ($val == '') continue; |
$ap = preg_split('/=/',$val,2); |
if (preg_match('/^"/',$ap[1])) { $ap[1] = substr($ap[1],1,strlen($ap[1])-2); } |
$ct[$i] = $ap; |
$i++; |
} |
} |
// are we a multipart message? |
if (preg_match('/^multipart/i', $ct[1])) { $this->multipart = TRUE; } |
return $ct; |
} |
// _get_headers: pulls the headers out of the data and builds the $this->headers array |
function _get_headers($data,$simple = FALSE) { |
$lines = preg_split('/\n/', $data); |
while (list($key, $val) = each($lines)) { |
$val = trim($val); |
if ($val == "") break; |
if (preg_match('/^From[^:].*$/', $val)) continue; /* strips out any From lines added by the MTA */ |
$hdr = preg_split('/: /', $val, 2); |
if (count($hdr) == 1) { |
// this is a continuation of the last header (like a recieved from line) |
$this->headers[$last] .= $val; |
} else { |
$this->headers[strtolower($hdr[0])] = $hdr[1]; |
//echo htmlspecialchars($this->headers['from'])."<br />" ; |
$last = strtolower($hdr[0]); |
} |
} |
// ajout alex |
// pour supprimer le problème des ISO... |
// a déplacer ailleur, et appelé avant affichage |
if (preg_match ('/windows-[0-9][0-9][0-9][0-9]/', $this->headers['subject'], $nombre)) { |
$reg_exp = $nombre[0] ; |
} else { |
$reg_exp = 'ISO-8859-15?' ; |
} |
if (preg_match ('/UTF/i', $this->headers['subject'])) $reg_exp = 'UTF-8' ; |
preg_match_all ("/=\?$reg_exp\?(Q|B)\?(.*?)\?=/i", $this->headers['subject'], $match, PREG_PATTERN_ORDER) ; |
for ($i = 0; $i < count ($match[0]); $i++ ) { |
if ($match[1][$i] == 'Q') { |
$decode = quoted_printable_decode ($match[2][$i]) ; |
} elseif ($match[1][$i] == 'B') { |
$decode = base64_decode ($match[2][$i]) ; |
} |
$decode = preg_replace ("/_/", " ", $decode) ; |
if ($reg_exp == 'UTF-8') { |
$decode = utf8_decode ($decode) ; |
} |
$this->headers['subject'] = str_replace ($match[0][$i], $decode, $this->headers['subject']) ; |
} |
// sanity anyone? |
if (!$this->headers['content-type']) { $this->headers['content-type'] = "text/plain; charset=us-ascii"; } |
if (!$simple) { $this->headers['content-type'] = $this->_ct_parse(); } |
return TRUE; |
} |
// _get_body: pulls the body out of the data and fills $this->body, decoding the data if nessesary. |
function _get_body($data,$simple = FALSE) { |
$lines = preg_split('/\n/', $data); |
$doneheaders = FALSE; |
$data = ""; |
while (list($key,$val) = each($lines)) { |
//echo htmlspecialchars($val)."<br>"; |
if (($val == '') and (!$doneheaders)) { |
$doneheaders = TRUE; |
continue; |
} else if ($doneheaders) { |
$data .= $val . "\n"; |
} |
} |
// now here comes the fun part... decoding. |
switch($this->headers['content-transfer-encoding']) { |
case 'binary': |
$this->body = $this->_cte_8bit($this->_cte_qp($this->_cte_binary($data)),$simple); |
break; |
case 'base64': |
$this->body = $this->_cte_8bit($this->_cte_qp($this->_cte_base64($data)),$simple); |
break; |
case 'quoted-printable': |
$this->body = $this->_cte_8bit($this->_cte_qp($data),$simple); |
break; |
case '8bit': |
$this->body = $this->_cte_8bit($data,$simple); |
break; |
case '7bit': // 7bit doesn't need to be decoded |
default: // And the fall through as well... |
$this->body = $data; |
break; |
} |
//echo $this->headers['content-type'][2][1]; |
if (isset($this->headers['content-type'][2][1]) && $this->headers['content-type'][2][1] == 'UTF-8') { |
//$this->body = utf8_decode ($this->body) ; |
//echo quoted_printable_decode(utf8_decode ($this->body)) ; |
} |
if ($simple) { return TRUE; } |
// if we are a multipart message then break up the parts and decode, set the appropriate variables. |
// here comes the best part about making ezmlm-php OOP. since each part is just really a little message |
// in itself each part becomes a new parser object and all the wheels turn again... :) |
if ($this->multipart) { |
$boundary = ''; |
for ($i = 2; $i <= count($this->headers['content-type']); $i++) { |
if (preg_match('/boundary/i', $this->headers['content-type'][$i][0])) { |
$boundary = $this->headers['content-type'][$i][1]; |
} |
} |
if ($boundary != '') { |
$this->_get_parts($this->body,$boundary); |
} else { |
// whoopps... something's not right here. we were told that the message is supposed |
// to be a multipart message, yet the boundary wasn't set in the content type. |
// mark the message as non multipart and add a message to the top of the body. |
$this->multipart = FALSE; |
$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; |
} |
} |
return TRUE; |
} |
// _get_parts: breaks up $data into parts based on $boundary following the rfc specs |
// detailed in section 5 of RFC2046 (http://www.faqs.org/rfcs/rfc2046.html) |
// After the parts are broken up they are then turned into parser objects and the |
// resulting array of parts is set to $this->parts; |
function _get_parts($data,$boundary) { |
$inpart = -1; |
$lines = preg_split('/\n/', $data); |
// La première partie contient l'avertissement pour les client mail ne supportant pas |
// multipart, elle est stocké dans parts[-1] |
while(list($key,$val) = each($lines)) { |
if ($val == "--" . $boundary) { $inpart++; continue; } // start of a part |
else if ($val == "--" . $boundary . "--") { break; } // the end of the last part |
else { $parts[$inpart] .= $val . "\n"; } |
} |
for ($i = 0; $i < count($parts) - 1; $i++) { // On saute la première partie |
$part[$i] = new ezmlm_parser(); |
$part[$i]->parse($parts[$i]); |
$this->parts[$i] = $part[$i]; |
//echo $this->parts[$i]."<br>" ; |
} |
} |
// _cte_8bit: decode a content transfer encoding of 8bit |
// NOTE: this function is a little bit special. Since the end result will be displayed in |
// a web browser _cte_8bit decodes ASCII characters > 127 (the US-ASCII table) into the |
// html ordinal equivilant, it also ensures that the messages content-type is changed |
// to include text/html if it changes anything... |
function _cte_8bit($data,$simple = FALSE) { |
if ($simple) { return $data; } |
$changed = FALSE; |
$chars = preg_split('//',$data); |
while (list($key,$val) = each($chars)) { |
if (ord($val) > 127) { $out .= '&#' . ord($val) . ';'; $changed = TRUE; } |
else { $out .= $val; } |
} |
if ($changed) { $this->headers['content-type'][1] = 'text/html'; } |
return $out; |
} |
// _cte_binary: decode a content transfer encoding of binary |
function _cte_binary($data) { return $data; } |
// _cte_base64: decode a content transfer encoding of base64 |
function _cte_base64($data) { return base64_decode($data); } |
// _cte_qp: decode a content transfer encoding of quoted_printable |
function _cte_qp($data) { |
// For the time being we'll use PHP's function, it seems to work well enough. |
return quoted_printable_decode($data); |
} |
} |
/branches/livraison_menes/classes/ezmlm-php-2.0/TODO |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/branches/livraison_menes/classes/ezmlm-php-2.0/TODO |
---|
New file |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/livraison_menes/classes/ezmlm-php-2.0/makehash.tar.gz |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/branches/livraison_menes/classes/ezmlm-php-2.0/makehash.tar.gz |
---|
New file |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/livraison_menes/classes/ezmlm-php-2.0/ezmlm-repondre.php |
---|
New file |
0,0 → 1,187 |
<?php |
// $Id: ezmlm-repondre.php,v 1.2 2005-09-27 16:43:08 alexandre_tb Exp $ |
// |
// ezmlm-msgdisplay.php - ezmlm-php v2.0 |
// -------------------------------------------------------------- |
// Will parse a template (if specified) and display a message. |
// Includes a default template. |
// -------------------------------------------------------------- |
require_once("ezmlm.php"); |
require_once("Mail/mimeDecode.php") ; |
class ezmlm_repondre extends ezmlm_php { |
// our template |
var $msgtmpl; |
var $message_rendu ; |
// display: parses a message (using ezmlm_parser) and displays it |
// using a template |
function repondre($msgfile) { |
if (!is_file($msgfile)) { |
if (is_file($this->listdir . "/" . $msgfile)) { $msgfile = $this->listdir . "/" . $msgfile; } |
else if (is_file($this->listdir . "/archive/" . $msgfile)) { $msgfile = $this->listdir . "/archive/" . $msgfile; } |
else { return FALSE; } |
} |
$message = file_get_contents($msgfile) ; |
$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 '<br />'."\n"; |
$this->parse_template($mailDecode, $a2, $a1); |
$formulaireReponse = new HTML_formulaireMail('formulaire_reponse', 'post', str_replace('&', '&', $this->forcehref).'&action=repondre&'. |
'actionargs[]='.$a1.'&actionargs[]='.$a2.'&'.PROJET_VARIABLE_ACTION.'='.PROJET_ENVOYER_UN_MAIL_V) ; |
$formulaireReponse->construitFormulaire() ; |
$formulaireReponse->addElement ('hidden', 'messageid', $mailDecode->headers['message-id']) ; |
// Ajout de > au début de chaque ligne du message |
$tableau = explode ("\n", $this->message_rendu) ; |
$this->message_rendu = "> ".implode ("\n> ", $tableau) ; |
$formulaireReponse->setDefaults(array('mail_corps' => $this->message_rendu, |
'mail_titre' => 'Re : '.$this->decode_iso ($mailDecode->headers['subject']))) ; |
print $formulaireReponse->toHTML() ; |
} |
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' : |
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 .= ''; |
if (count ($profondeur) > 0) { |
array_shift($profondeur) ; |
//for ($j= 0; $j < count ($profondeur); $j++) $corps .= '&actionargs[]='.$profondeur[$j]; |
} |
/*$corps .= '&actionargs[]='.$i ; |
$corps .= '">'.'<img src="'.$mimeType->getCheminIcone().'" alt="'.$nom_piece_jointe.'" /> ' ; |
$corps .= $nom_piece_jointe; |
$corps .= '</a><br />' ;*/ |
break ; |
} |
} |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,TRUE), $this->msgtmpl); |
} else if ($mailDecode->ctype_primary == 'message') { |
$this->message_rendu .= "\n".'<div class="message">'.$this->parse_entete_mail($mailDecode->parts[0]); |
$corps .= $this->parse_template($mailDecode->parts[0], $numero_mail, $numero_mois, 0) ; |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,true), $this->msgtmpl).'</div>'; |
} 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 .= '' ; |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($corps,true), $this->msgtmpl); |
} |
} else { |
if (preg_match('/html/i', $mailDecode->ctype_secondary)) { |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($mailDecode->body), $this->msgtmpl); |
} else { |
if (isset ($mailDecode->ctype_parameters['charset']) && $mailDecode->ctype_parameters['charset'] == 'UTF-8') { |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', utf8_decode($this->cleanup_body($mailDecode->body)) , $this->msgtmpl); |
} else { |
$this->message_rendu .= preg_replace('/<ezmlm-body>/i', $this->cleanup_body($mailDecode->body), $this->msgtmpl); |
} |
} |
} |
} |
function ezmlm_repondre() { |
$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 = '<ezmlm-body>'; |
} |
$this->msgtmpl_entete = '<dl><ezmlm-headers> |
<dt><ezmlm-header-name> :</dt> |
<dd><ezmlm-header-value></dd> |
</ezmlm-headers> |
</dl>' ; |
} |
} |