/*
Fichier deplacemail.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éplace vers une autre boite aux lettres les mails
en attente sur le serveur de messagerie.
Une option permet de conserver les mails sélectionnés dans la
boite aux lettres initiale. Dans ce cas, les mails sélectionnés
sont seulement copiés.
On peut choisir de déplacer :
- tous les mails (fonctionnement par défaut)
- un mail particulier identifié par son numéro
Un fichier de configuration est utilisé pour se connecter à
la boite aux lettres, pour connaitre l'adresse d'expédition
et pour sélectionner le serveur SMTP servant à la réexpédition
des mails.
Il s'agit d'une variante des fichiers de configuration utilisés
par la plupart des autres outils de libremail.
*/
#define appli // pour la déclaration de variables globales à l'application
int main (int nbarg, char *varg[])
{
char serv_smtp [120]; // nom du serveur smtp utilisé
FILE *fconf; // descripteur du fichier de configuration
int numail, nbmes; // numéro du mail courant et nombre de mails
int optc; // option : détermine si on conserve les mails déplacés
// message signalant la copie ou le déplacement d'un mail
char mess_copdepl [50];
// récupération du nom de l'exécutable
memcom (*varg);
// se positionner sur le premier argument de deplacemail
varg ++;
// récupération de l'option de fonctionnement éventuelle
if (--nbarg > 1 && **varg == '-')
{
// si option -c
if (varg [0][1] == 'c')
// les mails seront également conservés sur le serveur initial
optc = 1;
else
{
// "Option %s incorrecte"
aff_err_arg ("ERR_OPTION", *varg);
nbarg = 0; // pour afficher la syntaxe de la commande
}
// récupérer le numéro du mail à traiter s'il a été spécifié
if (nbarg && atoi (*varg) > 0)
{
numail = atoi (*varg);
// décompter l'argument traité
nbarg --;
varg ++;
}
else
numail = 0; // on traitera tous les mails
// controle du nombre d'arguments restant
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 et mémoriser les adresses
// Email d'expédition et de destination
mem_adr (adr_exped, fconf);
mem_adr (adr_dest, fconf);
// récupération du nombre de mails
nbmes = nbmails ();
// si des mails peuvent être traités
if (nbmes)
{
// recupérer le nom du serveur smtp
fgets (serv_smtp, 120, fconf);
serv_smtp [strlen (serv_smtp) - 1] = '\0';
// connexion au serveur smtp pour l'envoi des mails
if (connect_smtp (serv_smtp))
{
// mémorisation message adapté au traitement des mails
if (optc)
// "Copie du mail numéro %d"
strcpy (mess_copdepl, message ("COPIE_MAIL"));
else
// "Déplacement du mail numéro %d\n"
strcpy (mess_copdepl, message ("DEPL_MAIL"));
// si demande copie ou déplacement d'un mail particulier
if (numail)
{
// si un mail existe avec ce numéro
if (numail <= nbmes)
{
// message indiquant copie ou déplacement mail
printf (mess_copdepl, numail);
// envoyer une copie du mail à l'autre adresse
copiemail (numail);
// si déplacement des mails
if (! optc)
// supprimer le mail du premier serveur
detruitmail (numail);
}
// sinon, afficher un message d'erreur
else
// "Numéro de mail trop grand"
affiche_err ("NUMAIL_TROP_GRAND");
}
// sinon, on traitera tous les mails
else
{
// pour chaque mail du serveur
for (numail = 1; numail <= nbmes; numail++)
{
// message indiquant copie ou déplacement mail
printf (mess_copdepl, numail);
fflush (stdout);
// envoyer une copie du mail à l'autre adresse
copiemail (numail);
// si déplacement des mails
if (! optc)
// supprimer le mail du premier serveur
detruitmail (numail);
}
}
// pour l'affichage
putchar ('\n');
// fermeture de la connexion smtp
deconnect_smtp ();
}
}
// se déconnecter proprement du serveur pop
deconnect_pop ();
}
// on n'a plus besoin du fichier de configuration
fclose (fconf);
}
}
else
// "Syntaxe : %s [-c] [numéro_mail] fichier_configuration"
psyntaxe ("SYNT_DEPLACEMAIL");
// pour faire plaisir à gcc qui veut une fonction main de type int
return (0);
}