Finalités Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail Réalisé par sa modestie Arnaud de VILLEDON de NAIDE, le 9 mars 2013 Document sous licence GPL. Vous avez le droit d'en faire des copies, des améliorations. Si vous le vendez, je vous laisse 1 % (et oui, la vie est dure) Pensez à indiquer l'origine de vos copies SVP Il faut parfois vider sa messagerie. Toutefois, l'accès aux messages archivés peut être très utile, ET DE MANIERE CONVIVIALE. J'utilise personnellement, sous Evolution, des dossiers sous la réception, jusqu'au niveau 3 MAX. J'avais effectué un programme d'archivage, il y a 4 ans, mais l'architecture d'evolution a changé. De plus, avoir une page générale "index.html" à la racine de ma sauvegarde était à l'époque effectuée de manière manuelle. Maintenant, un deuxième programme comble ce vide. Programmes réalisés sur environnement : Système d'exploitation Ubuntu 12.04 Logiciel Hypermail 2.3.0 patchlevel 1 - Sat Mar 9 00:24:54 2013 Logiciel Evolution 3.2.3 (il faut l'installer. C'est simple!). http://sourceforge.net/projects/hypermail/ En date du 09-03-2013 La programmation est réalisée en langage "C" (merci Dennis) Plan du document Vue de base d'evolution Structure interne des fichiers et dossiers Programme de Création de l'archivage de toute l'arborescence (merci Hypermail) : programme archiveevolution2.c Correction du petit bug hypermail pour les accents (pour les froggies comme moi) Programme d'indexage de chaque dossier pour créer des hypertextes : programme creearbohtml.c
Vue de base d'evolution avec les dossiers Comme on peut le voir, je n'utilise pas de profondeur supérieure à 3. Si vous avez plus profond, il faudra modifier le programme n 2. Structure des fichiers d'evolution Maintenant, les dossiers sont sous "$HOME/.local/share/evolution/mail/local". La nouvelle architecture interne des dossiers et fichiers d'evolution s'est simplifiée : chaque dossier est de la forme..dossier.sous-dossier1.sous-dossier2 Donc plus besoin d'effectuer de la récursivité dans chaque dossier. Maintenant, rentrons dans un dossier. Par exemple le dossier "amis". Il contient un sous-dossier "cur" qui contient les mails. Bon alors rien de bien terrible...
archiveevolution2.c #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h> #include <stdlib.h> #include <string.h> char arbo[50][50]; char commande[250]; char archivedest[100]; void transfochemin(char *src,char *dest) int i=(src[0]=='.')?2:0,j=0; while(src[i]) char c=(src[i]!='.')?src[i]:'/'; dest[j++]=c; i++; dest[j]=0; void lis(int niveau,char *nomrep) DIR *d,*dm; struct dirent *de,*dem; struct stat stat_p; time_t tt; int premier=1,i; char buf[100],reponse[10],nomrep[200]; if((d=opendir(nomrep))==null) fprintf(stderr,"impossible d'ouvrir %s\n",nomrep); perror("archiveevolution"); exit(1); if(chdir(nomrep)!=0) fprintf(stderr,"[lis %02d] : impossible d'entrer dans %s\n",niveau,nomrep); printf("[lis %02d] : Entrée dans %s\n",niveau,nomrep); while(de=readdir(d)) // permet de savoir si c'est un répertoire... int stat_e=stat(de->d_name,&stat_p); if(stat_p.st_mode & S_IFDIR) // on enlève le '.' et le '..'. Par contre ne pas enlever les dossiers..quelquechose if(strcmp(de->d_name,".")!=0 && strcmp(de->d_name,"..")!=0 && strncmp(de->d_name,"..",2)==0) int nbmails=0; transfochemin(de->d_name,nomrep); printf("- %s --> %s\n",de->d_name,nomrep); chdir(de->d_name); chdir("cur"); if((dm=opendir("."))==null) fprintf(stderr,"impossible d'ouvrir %s/cur\n",de->d_name); perror("archiveevolution"); exit(2); while(dem=readdir(dm)) if(strcmp(dem->d_name,".")!=0 && strcmp(dem->d_name,"..")!=0) printf("\t- Mail %s\n",dem->d_name); sprintf(commande, "hypermail -u -m %s -o hm_reverse=1 -o hm_language=fr -d %s/%s -l %s 2>/dev/null", dem->d_name,archivedest,nomrep,nomrep); printf("%s\n",commande); system(commande); nbmails++; printf("\t***** Total=%d *****\n",nbmails); chdir("../..");
int main(int c,char **v) char repevol[100]; if(c==2) // on cherche l'emplacement du 'home' de l'utilisateur sprintf(repevol,"%s/.local/share/evolution/mail/local",getenv("home")); strcpy(archivedest,v[1]); // le dossier d'archivage existe-t-il? if(chdir(v[1])!=0) printf("le répertoire %s n'existe pas!\n",v[1]); printf("je me place dans %s!\n",v[1]); lis(0,repevol); printf("il manque un argument...\n"); printf("syntaxe : %s <Dossier d'archivage>\n",v[0]); printf("exemple : %s /media/multimedia/archivemails/2009-03-25\n",v[0]); Compilation : gcc -o archev2 archiveevolution2.c Exécution :./archev2 dossier_archivage il a fallu créer ce dossier auparavant Petit bug d'accent sur Hypermail Nos amis anglo-saxons ont fait un mini-bug : certains accents graves sont décris en HTML comme des &eagrave ; et non comme des è ; Il suffit d'aller dans le dossier archive et taper la commande : find./* type f exec sed i 's/eagrave/egrave/g' \; Programme d'indexation des dossiers archivés #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h> #include <stdlib.h> #include <string.h> typedef struct int niveau; char url[200]; char shortname[50]; PileArbo; PileArbo pile[100]; int nbpile=0; int niveauprecedent(int i) if(i==0) return 0; return (pile[i].niveau)-(pile[i-1].niveau); int NiveauSuivant(int i) if(i>nbpile-1) return 0; return (pile[i+1].niveau==pile[i].niveau); void empile(int prof,char *lib, char *shortn) pile[nbpile].niveau=prof; strcpy(pile[nbpile].url,lib+1); strcpy(pile[nbpile].shortname,shortn); nbpile++; void copie(pilearbo *dest,pilearbo *src)
dest->niveau=src->niveau; strcpy(dest->url,src->url); strcpy(dest->shortname,src->shortname); void tripile() int i=0; while(i<nbpile-1) if(strcmp(pile[i].url,pile[i+1].url)>0) PileArbo temp; copie(&temp,pile+i); copie(pile+i,pile+i+1); copie(pile+i+1,&temp); if(i>0) i--; i++; void affpile() int i; for(i=0;i<nbpile;i++) printf("niveau %d ; Url '%s' ; short '%s'\n",pile[i].niveau,pile[i].url,pile[i].shortname); char archivedest[100]; void lis(int niveau,char *nomrep,char *arbo) DIR *d; struct dirent *de; struct stat stat_p; char arboconc[200]; if((d=opendir(nomrep))==null) fprintf(stderr,"impossible d'ouvrir %s\n",nomrep); perror("creearbo"); exit(1); sprintf(arboconc,"%s/%s",arbo,nomrep); if(chdir(nomrep)!=0) fprintf(stderr,"[lis %02d] : impossible d'entrer dans %s\n",niveau,nomrep); printf("[lis %02d] : Entrée dans %s (%s)\n",niveau,nomrep,arboconc); while(de=readdir(d)) // permet de savoir si c'est un rãépertoire... int stat_e=stat(de->d_name,&stat_p); if(strcmp(de->d_name,"index.html")==0) printf("trouvé l'index dans le dossier %s!\n",nomrep); empile(niveau,arboconc,nomrep); if(stat_p.st_mode & S_IFDIR) // on enlève le '.' et le '..' if(strcmp(de->d_name,".")!=0 && strcmp(de->d_name,"..")!=0 && strncmp(de->d_name,"att-",2)!=0) printf("trouvé le dossier %s. J'y rentre!\n",de->d_name); lis(niveau+1,de->d_name,arboconc); chdir(".."); void creehtml() char nomindex[200]; FILE *po; int i; sprintf(nomindex,"%s/index.html",archivedest); po=fopen(nomindex,"w"); fprintf(po,"<html>\n\t<body>\n\t\t"); for(i=1;i<nbpile;i++) int np=niveauprecedent(i); if(np>0)
char niv; switch(pile[i].niveau) case 1 : niv='a'; break; case 2: niv='1'; break; case 3 : niv='a'; break; fprintf(po,"<ol type='%c'>\n",niv); if(np<0) fprintf(po,"</ol>\n"); fprintf(po,"<li><a href='%s/index.html'>%s</a></li>\n",pile[i].url,pile[i].shortname); fclose(po); int main(int c,char **v) if(c==2) strcpy(archivedest,v[1]); // le dossier d'archivage existe-t-il? if(chdir(v[1])!=0) printf("le répertoire %s n'existe pas!\n",v[1]); printf("je me place dans %s!\n",v[1]); lis(0,".",""); printf("***************************************\n"); tripile(); affpile(); creehtml(); printf("il manque un argument...\n"); printf("syntaxe : %s <Dossier d'archivage>\n",v[0]); printf("exemple : %s /media/data/sauvemail/sauvemail_2013-02-21\n",v[0]); Le programme, une fois compilé, demande à l'exécution le nom du dossier dans lequel on a archivé les mails. Résultat (moche mais fonctionnel) Ca, c'est le résultat du deuxième programme Et ça, le boulot d'hypermail That's all, folks! Bonne chance à tous! Ne suivez personne ; cultivez-vous!