#! /usr/bin/perl

use Net::POP3;
use File::stat;
$rouge="\e[1;31m";
$jaune="\e[1;33m";
$bleu="\e[1;34m";
$bleu2="\e[0;36m";
$gris="\e[1;0m";
$nb=0;
$tailleMax=100000;
$CONF=$ENV{HOME}."/.scanmail.cfg";
$stat=stat($CONF) or die ("$rouge Impossible d'ouvrir le fichier $CONF $gris");

# Vérifie que l'utilisateur est propriétaire du fichier
if ($stat->uid !=$<) {
  print "\n$rouge"."Pour utiliser le fichier $CONF, vous devez en être propriétaire !\n";
  print "\nUtilisez la commande : chown $ENV{USER} $CONF\n\n$gris";
  exit;
}

# Vérifications des droits de lecture/écriture sur le fichier

if (($stat->mode & 07777) !=oct(600)) {
  printf ("\n$rouge Les permissions sur le fichier sont : %o\n", $stat->mode & 07777);
  print $gris."Changez les permissions du fichier:\n";
  print "chmod 600 $CONF\n\n";
  exit;
}

# Ouverture du fichier de configuration
open (F, $CONF) || die "$rouge Impossible d'ouvrir le fichier $CONF$gris";

# lecture du fichier de configuration et récupération des valeurs

while ($ligne = <F>) {
if ($ligne=~ /^\s*server\s*=\s*([\w\.\-\\\/]+)/i) {
    $serveur[$#serveur+1]=$1;
  }
if ($ligne=~ /^\s*user\s*=\s*([\w\.\-\\\/@]+)/) {
    $user[$#user+1]=$1;
  }
if ($ligne=~ /^\s*pass\s*=\s*([\w]+)/) {
    $pass[$#pass+1]=$1;
  }
  
if ($ligne=~ /^\s*max\s*=\s*([0-9]+)/i) {
    $tailleMax=$1;
  }
  
}
  
if ($#serveur!=$#user || $#serveur!=$#pass || $#user!=$#pass) {
  print $rouge."Il y a une erreur dans le fichier de configuration !!\n".$gris;
  print "Entrées trouvées:\n";
  print "\t=>serveur(s): ", $#serveur+1,"\n";
  print "\t=>user(s)   : ", $#user+1,"\n";
  print "\t=>pass      : ", $#pass+1,"\n";
  print "Les valeurs ci-dessus doivent être égales\n";
close(F);
  die;
}
close(F);
# print "TaileMax: $tailleMax\n";

# exit;

SERVEUR: foreach ( @serveur ) {
  $m = Net::POP3->new($serveur[$nb]);
  
if (!$m) {
    print $rouge."Le serveur $serveur[$nb] ne répond pas\n$gris";
    $nb++;
  next SERVEUR;
  }
  print "Connexion au serveur $serveur[$nb]\n";
  
# 2/ on fait son login, ce qui rend le nombre '$number' de mails en attente
  $number= $m->login($user[$nb],$pass[$nb]);
if ($number eq undef) {
    print $rouge."Authentification refusée pour l'utilisateur $user[$nb] sur $serveur[$nb]\n".$gris;
    $nb++;
  next SERVEUR;
  }
if ($number ne '0E0') {
    print "Il y a $number mail(s) en attente sur $serveur[$nb]\n";
    
  # 3/ Affiche la taille des messages   
  for ($i=1; $i<$number+1; $i++) {
      $t=$m->list($i);
      print $bleu."Message ", $i, ": ", $t, " octets".$gris;
    if ($t>$tailleMax) {
        $rl_msg=$m->top($i,0); # Lecture des entêtes seules
        $taille_header=0; # Variable pour avoir le début du message
        print "\n----------------\n";
        $test=0;
foreach $ligne (@$rl_msg) {
            $taille_header++;
          @header=split(':', $ligne);
  if ($header[0] eq "Subject" or $header[0] eq "From" or $header[0] eq "Content-Type" or $header[0] eq "Content-Disposition" or $test==1) {
            print $jaune.$ligne;

    #if ($header[0] eq "Content-Disposition") { $test=1; print "\nCOntent : ".$test;}
    #if ($test==1) { $test=0; print $test;}

           }  
        }
# print "\nTaille Headers=$taille_header\n";
        $rl_msg=$m->top($i,10); # Récupération 10 premières lignes du message
foreach $ligne (@$rl_msg) {
    if ($taille_header<=0) { print $bleu2.$ligne; }
            $taille_header--;
        }
        print $gris."----------------\n";  
        print "Effacer ce message [o/n]?";
        $reponse=<STDIN>;
if ( $reponse =~/^[oO]/) {
          $m->delete($i);
          print "Message effacé";
        } else {
          print "Message gardé";
        }
        print "\n";
      }
      print "\n";
    }
  }
else {
    print "Aucun message !\n";
  }
  $nb++;
  $m->quit();
}