Arc_net_bal // archivage, nettoyage d'un compte de messagerie imap

Description

Ce programme permet de supprimer définitivement les mails
marqués comme supprimés d'un compte de messagerie IMAP
De sauvegarder sur disque les mails des sous-répertoires
désignés avec un historique de xxx mois

arc_net_bal HOST=<Adresse serveur de messagerie>
USER=<login du compte de messagerie>
PASS=<mot de passe du compte mail >
FOLD=<Folders a vider et sauvegarder>
<séparateur entre valeurs ':' >
PATH=<Répertoire de sauvegarde eml >
HIST=<nombre de jours pour l'historique sur disque>

Exemple d'exécution en ligne de commande:
arc_net_bal HOST=mail.Myprovider.com USER=stevos_teen PASS=vpaw68hk PATH=c:\tmp\ FOLD=Autres:Archive

Source / Exemple :


import java.text.DateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.Properties;
import java.util.StringTokenizer;

import javax.mail.*;
import javax.mail.internet.*;
import java.io.*;

public class arc_net_bal {
	public static String rep_out="";
	public static String rep_save="";
	public static int cpt_msg=1;
	public static String fic_log;
	public static int nb_jour_hist;
	public static void resume_prog() {
	    System.out.println("------------------------------------------------");
	    System.out.println("arc_net_bal HOST=<Adresse serveur de messagerie> ");
	    System.out.println("            USER=<login du compte de messagerie>");
	    System.out.println("            PASS=<mot de passe du compte mail  >");
	    System.out.println("            FOLD=<Folders a vider et sauvegarder>");
	    System.out.println("                 <séparateur entre valeurs ':' >");
	    System.out.println("            PATH=<Répertoire de sauvegarde eml >");
	    System.out.println("            HIST=<nombre de jours pour l'historique sur disque>");
	    System.out.println("------------------------------------------------");
	    System.out.println("Ce programme permet de supprimer définitivement les mails ");
	    System.out.println("marqués comme supprimés d'un compte de messagerie");
	    System.out.println("De sauvegarder sur disque les mails des sous-répertoires");
	    System.out.println("désignés avec un historique de 3 mois ");
	    System.out.println("------------------------------------------------");
	}
	public static void ecritLog(String ligne)
	{
	 try
	     {
	       FileWriter f = new FileWriter(fic_log,true);
	       BufferedWriter bf = new BufferedWriter(f);
	       bf.write(ligne);
	       bf.newLine();
	       bf.close();
	     }
	  catch(IOException e)
	    { 
	      System.out.println(e.getMessage());
	    }
	  }	
    public static void archivage(Folder vfolder) {
      try {  
        vfolder.open(Folder.READ_WRITE);
        ecritLog("---  Nombre de messages sur " + vfolder.getName() + " :  " + vfolder.getMessageCount() );        
        Message msg[] = vfolder.getMessages();
        FileOutputStream file_save_mail;
        String nom_fic; 
        String cpt_msg_fmt;
        File f;
    	java.util.Calendar rightNow =  java.util.Calendar.getInstance();
    	String annee=rightNow.get(java.util.Calendar.YEAR) + "";
    	String mois=rightNow.get(java.util.Calendar.MONTH)  + 1 + "";
    	String jour=rightNow.get(java.util.Calendar.DAY_OF_MONTH) + "";
    	String heure= rightNow.get(java.util.Calendar.HOUR_OF_DAY) + "";
    	String minute=rightNow.get(java.util.Calendar.MINUTE) + "";
    	String seconde=rightNow.get(java.util.Calendar.SECOND) + "";
    	
  		if (mois.length() == 1) mois = "0" + mois;
    	if (jour.length() == 1) jour = "0" + jour;
    	if (heure.length() == 1) heure = "0" + heure;
    	if (minute.length() == 1) minute = "0" + minute; 
    	if (seconde.length() == 1) seconde = "0" + seconde; 
        
        for (int i = 0; i < msg.length; i++) {
          // Suppression définitive des message supprimés
     	 if ( msg[i].isSet(Flags.Flag.DELETED) ) { 
     		ecritLog("Suppression définitive du message :"); 
     		ecritLog("Expediteur: " + msg[i].getFrom());
     		ecritLog("Sujet: " + msg[i].getSubject());
     		ecritLog("Date:  " + msg[i].getReceivedDate().toString() );
            ecritLog(" " );
     	 }
     	 else
     	 { 
     		if ( rep_save.indexOf( vfolder.getName() )>= 1 ) {
     		   cpt_msg++;
     		   cpt_msg_fmt = cpt_msg + "";
               switch (cpt_msg_fmt.length())
     		   {
     			 case 1 : cpt_msg_fmt = "0000" + cpt_msg; break;
     			 case 2 : cpt_msg_fmt = "000"  + cpt_msg; break;
     			 case 3 : cpt_msg_fmt = "00"   + cpt_msg; break;
     			 case 4 : cpt_msg_fmt = "0"    + cpt_msg; break;
               }
     		   nom_fic=annee +"."+ mois +"."+ jour +"."+ heure +"."+ minute +"."+ seconde + "_" + cpt_msg_fmt;
     		   nom_fic="C:\\tmp\\"+nom_fic+".eml";
   			   file_save_mail = new FileOutputStream(nom_fic);
     		   msg[i].writeTo(file_save_mail);
     		   ecritLog("Sauvegarde message:  " + nom_fic );
     		   ecritLog("Expediteur: " + msg[i].getFrom());
     		   ecritLog("Sujet: " + msg[i].getSubject());
     		   ecritLog("Date:  " + msg[i].getReceivedDate().toString() );
     		   ecritLog(" " );
     		   f = new File(nom_fic);
     		   if ( f.exists() )  { msg[i].setFlag(Flags.Flag.DELETED, true); }
     		  }
     	 }
        } 
        vfolder.close(true);
        ecritLog("--------------------------------------------------------");
      } catch (Exception e) {
          System.out.println(e.getMessage());
      }
   }
   public static void epuration () {
	   ecritLog("---  Epuration du répertoire d'archivage: " + rep_out + " des fichiers de plus de " + nb_jour_hist);
	   // les messages a supprimer sont de la forme 2009.01.30.15.44.07_00006.eml 
	   File f = new File(rep_out);
	   File files[] = f.listFiles();
	   String nom_fichier;
	   java.util.Calendar rightNow =  java.util.Calendar.getInstance();
	   java.util.Calendar datefichier =  java.util.Calendar.getInstance();
	   
	   for (int cpt=0; cpt < files.length; cpt++ ) {
		   nom_fichier = files[cpt].getName();
           if ( nom_fichier.length()== 29 & nom_fichier.indexOf(".eml") ==25) {
        	  try {
        	   StringTokenizer st = new StringTokenizer(nom_fichier, ".",false);       	   
        	   datefichier.set( Integer.decode(st.nextToken()) ,
        			            Integer.decode(st.nextToken())-1,
        			            Integer.decode(st.nextToken()));        	   
        	   datefichier.add(Calendar.DATE, nb_jour_hist); // On ajoute x jours à la date du fichier
        	   //Si la date de création du fichier + x jours est inférieur à la date du jour:: onsupprime 
        	   if ( rightNow.compareTo(datefichier) == 1 ) { 
        		   ecritLog("supression du fichier : " + nom_fichier);
        		   files[cpt].delete(); }
        	  } catch (Exception e) { ecritLog("erreur sur le fichier " + nom_fichier);  }
           }
        	  
	   }
   }
   public static void main (String args[]) throws Exception {

   if (args.length!=6) {
	 resume_prog();  
     System.exit(0);
    }	   
   String iphost ="", login="", password="", path="", str_nb_jrs_hist = "120";
   for (int i=0; i<args.length; i++) 
   {
	     if (args[i].substring(0,5).equals("HOST="))  { iphost= args[i].substring(5);}
	     if (args[i].substring(0,5).equals("USER="))  { login= args[i].substring(5);}
	     if (args[i].substring(0,5).equals("PASS="))  { password= args[i].substring(5);}
	     if (args[i].substring(0,5).equals("FOLD="))  { rep_save= args[i].substring(5);}
	     if (args[i].substring(0,5).equals("PATH="))  { path= args[i].substring(5);}
	     if (args[i].substring(0,5).equals("HIST="))  { str_nb_jrs_hist= args[i].substring(5);}
	     
   }
   if (path.equals("")) { 
	 System.out.println("la variable PATH est indéfinie");
	 resume_prog();  
     System.exit(0);
   } else { rep_out=path; }
   if (iphost.equals("")) { System.out.println("la variable HOST est indéfinie"); resume_prog(); System.exit(0);}
   if (login.equals("")) { System.out.println("la variable USER est indéfinie"); resume_prog(); System.exit(0);}
   if (password.equals("")) { System.out.println("la variable PASS est indéfinie"); resume_prog(); System.exit(0);}
   rep_save=":"+rep_save;
   // on vérifie que le répertoire (lecture) est correcte
   File repertoire=new File(rep_out);  
   if ( ! repertoire.isDirectory ( )){
  	 System.out.println("ERREUR : " + rep_out +  " is NOT A DIRECTORY");
  	 System.exit(0);
   } else {
	   //on crée le log du traitement s'il n'existe pas
	    java.util.Calendar DateSysteme =  java.util.Calendar.getInstance();
	    String annee=DateSysteme.get(java.util.Calendar.YEAR) + "";
	    String mois=DateSysteme.get(java.util.Calendar.MONTH)  + 1 + "";
	    if (mois.length() == 1) mois = "0" + mois;                  
	    fic_log = rep_out + "arc_net_bal_" + annee + "_" + mois +".log"; 
        String datelog = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.MEDIUM,Locale.FRANCE).format(Calendar.getInstance().getTime());
        ecritLog(" ");
        ecritLog("==== Execution: " + datelog);
   }
   try { nb_jour_hist=Integer.decode(str_nb_jrs_hist); }
   catch (Exception e) { System.out.println("la variable HIST doit être un numérique"); resume_prog();System.exit(0); }
    // obtenir des propriétés du sytème
    Properties props = System.getProperties();
    Session session = Session.getInstance(props);       
    Store s = session.getStore("imap");
    s.connect(iphost, login, password);
    Folder repINBOX = s.getFolder("INBOX");
    archivage(repINBOX);    
    repINBOX.open(Folder.READ_ONLY);
    Folder folders[] = repINBOX.list();
    for (int cpt = 0; cpt < folders.length; cpt++ ) {
     	archivage(folders[cpt]);
    }  //Fin de l'épuration de la boite mail
    
    // Nettoyage du répertoire disque de sauvegarde
    epuration();
    
    String datelog = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.MEDIUM,Locale.FRANCE).format(Calendar.getInstance().getTime());
    ecritLog(">Fin Execution: " + datelog);   
  }
}

Conclusion :


Une source utilisant l'API Javamail qui en partant du dossier INBOX - Boite d'envoi - peut parcourir les sous répertoires.
Les messages marqués en suppression; sont supprimés définitivement (expunge).
Les messages des répertoires spécifiés sont sauvegardés sur disque.
Enfin les anciens messages stockés sont supprimés aprés un certain nombre de jours (paramètres).
Toutes les opérations sont écrites dans un fichier de log mensuel

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.