/*
Fichier listesimexped.c
Auteur Bernard Chardonneau
Logiciel libre, droits d'utilisation précisés en français
dans le fichier : licence-fr.txt
Traductions des droits d'utilisation dans les fichiers :
licence-de.txt , licence-en.txt , licence-es.txt ,
licence-it.txt , licence-nl.txt , licence-pt.txt ,
licence-eo.txt , licence-eo-utf.txt
Droits d'utilisation également sur la page web :
http://libremail.tuxfamily.org/voir.php?page=droits
Ce programme détruit les mail du serveur dont le nom de l'expéditeur
indiqué diffère d'un petit nombre de caractères d'un nom d'expéditeur
figurant dans une liste.
La liste des noms d'expéditeurs à tester est mémorisée dans un
fichier.
Un fichier de configuration est utilisé pour se connecter à la
boite aux lettres.
*/
#define appli // pour la déclaration de variables globales à l'application
/* variables globales au source
(pour éviter des tonnes de passages de paramètres) */
char **listexped; // mémorise les noms d'expéditeurs à tester
int sz_listexped; // nombre d'expéditeurs mémorisés dans listexped
// chaine de caractère mémorisée pour éviter appels répétitifs à message ()
char mess_analys [50]; // message signalant l'analyse d'un mail
/* programme principal */
int main (int nbarg, char *varg[])
{
// fichier contenant la liste des chaines à tester
char fichliste [szchemin + 12];
char *car_fichliste; // pointeur sur un caractère de ce fichier
FILE *fconf; // descripteur du fichier de configuration
FILE *ftrace; // fichier contenant les expéditeurs des mail refusés
int numes, nbmes; // muméro du mail courant et nombre de mails
int nbdiff; // nombre de différences dans le nom d'expéditeur
int nbmaxdiff; // nombre max de différences dans le nom d'expéditeur
char bufFrom [120]; // buffer contenant l'expéditeur du mail
char bufw [120]; // buffer d'envoi d'une requête de destruction de mail
char datecour [10]; // date courante (pour le fichier des mails refusés)
int conserves = 0; // nombre de mails conservés
int supprimes = 0; // nombre de mails supprimés
// récupération du nom de l'exécutable
memcom (*varg);
// se positionner sur le premier argument de listesimexped
nbarg --;
varg ++;
// initialisation des valeurs des options
nbmaxdiff = 1; // une seule différence par défaut
ftrace = NULL; // pas de fichier trace
// tant qu'il peut y avoir des options à traiter
while (nbarg > 1)
{
// si nombre de différence maximal passé en paramètre
if (atoi (*varg) > 0)
{
// récupérer ce nombre
nbmaxdiff = atoi (*varg);
// sauter l'argument traité
nbarg --;
varg ++;
}
// sinon si option -t (trace des mails supprimés)
else if (**varg == '-' && varg [0][1] == 't')
{
// ouvrir le fichier trace en écriture fin de fichier
ftrace = fopen (varg [1], "a");
// si nom de fichier correct
if (ftrace)
// initialiser la date courante
initdatecour (datecour);
else
// sinon, avertir l'utilisateur
// "Impossible d'écrire dans le fichier %s"
aff_err_arg ("IMPOS_ECR_FICH", varg [1]);
// sauter les arguments traités
nbarg -= 2;
varg += 2;
}
// aucune autre option n'est reconnue
else
{
// "Option %s incorrecte"
aff_err_arg ("ERR_OPTION", *varg);
nbarg = 0; // pour rappeller la syntaxe
}
}
// contrôle du nombre d'arguments restants
if (nbarg == 1)
{
// ouvrir le fichier de configuration
fconf = ouvre_ficonf (*varg);
if (fconf)
{
// connexion sur le compte mail du serveur pop
if (connect_pop (fconf))
{
// récupérer le nom du répertoire racine de la messagerie
fgets (fichliste, szchemin, fconf);
// fabriquer le chemin d'accès au fichier contenant les
// noms d'expéditeurs à tester : <racine>/simexped
car_fichliste = fichliste + strlen (fichliste);
*(car_fichliste - 1) = '/';
strcpy (car_fichliste, ficdir ("FIC_SIMEXPED"));
// charger en mémoire les noms d'expéditeurs à tester
listexped = charge_valchamp (fichliste, &sz_listexped);
// si la liste n'est pas vide
if (sz_listexped)
{
// récupération du nombre de mails
nbmes = nbmails ();
// Initialisation du message à afficher à chaque
// analyse de mail "\rAnalyse du mail n° %d"
strcpy (mess_analys, message ("ANALYSE_MAIL"));
// vérification des différents mails
for (numes = 1; numes <= nbmes; numes++)
{
// "\rAnalyse du mail n° %d"
printf (mess_analys, numes);
fflush (stdout);
// recupérer l'expéditeur du mail
recup_exped (numes, bufFrom);
// compter les différences par rapport
// au nom d'expéditeur le plus proche
nbdiff = simexped (bufFrom, listexped, sz_listexped);
// s'il y a des différences, mais pas trop
if (nbdiff && nbdiff <= nbmaxdiff)
{
// demande de destruction du mail
sprintf (bufw, "DELE %d", numes);
env_pop (bufw);
lire_pop ();
supprimes ++;
// si utilisation d'un fichier trace
if (ftrace)
// mémoriser le mail supprimé dans ce fichier
fprintf (ftrace, "%s %d %s\n",
datecour, nbdiff, bufFrom);
}
// sinon, conserver le mail
else
conserves ++;
}
// se déconnecter proprement du serveur pop
deconnect_pop ();
// si des mails ont été supprimés
if (supprimes)
// attendre pour enregistrement correct des suppressions
// (évite problème si autre filtre appelé juste après)
sleep (2);
}
// on n'a plus besoin du fichier de configuration
fclose (fconf);
}
}
else
// "Syntaxe : %s [nbmaxdiff] [-t fichier_trace] fich_configuration"
psyntaxe ("SYNT_SUPSIMEXP");