/*
Fichier copiedepl.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
Bibliothèque des fonctions communes aux commandes deplacemail
deplpartaille et deplpartiel .
*/
#include <stdio.h>
#include <string.h>
#include "messages.h"
#include "buflect.h"
#include "pop.h"
#include "smtp.h"
#include "copiedepl.h"
/* récupère une adresse email dans le fichier de configuration dont
le descripteur fconf est passé en paramètre, extrait l'adresse
entre les < > s'ils existent et la mémorise dans bufadr */
void mem_adr (char *bufadr, FILE *fconf)
{
char fin_adr [120]; // partie droite de l'adresse expéditeur reconstituée
long posit; // position dans le fichier de configuration
int i, j; // compteurs
// lire une ligne du fichier de configuration
fgets (buf_lect, sizeof (buf_lect), fconf);
// rechercher le @ dans la ligne lue
i = 0;
while (buf_lect [i] != '@' && buf_lect [i])
i++;
// si trouvé
if (buf_lect [i] == '@')
{
// se positionner au début de l'adresse email
do
i--;
while (i > 0 && buf_lect [i] != '<' && buf_lect [i] != ' '
&& buf_lect [i] != '\t');
if (buf_lect [i] == '<' || buf_lect [i] == ' ' || buf_lect [i] == '\t')
i++;
// mémoriser l'adresse email
j = 0;
while (buf_lect [i] != '\n' && buf_lect [i] != '>' && buf_lect [i])
bufadr [j++] = buf_lect [i++];
bufadr [j] = '\0';
}
// sinon pour l'adresse de l'expéditeur
// si fichier de configuration classique
else if (bufadr == adr_exped && *buf_lect == '/')
{
// on va fabriquer une adresse d'expéditeur à partir
// des 2 premières lignes du fichier de configuration
// mémoriser la position courante dans le fichier de configuration
posit = ftell (fconf);
// et revenir au début de ce fichier
rewind (fconf);
// lire le nom du serveur pop
fgets (buf_lect, sizeof (buf_lect), fconf);
// si ce nom commence par pop
if (*buf_lect == 'p' && buf_lect [1] == 'o' && buf_lect [2] == 'p')
{
// sauter le premier mot
i = 3;
while (buf_lect [i++] != '.')
; // en sortant on est positionné après le '.'
}
else
i = 0;
// mémoriser la fin de l'adresse email
fin_adr [0] = '@';
j = 1;
do
fin_adr [j++] = buf_lect [i++];
while (buf_lect [i] != '\n' && buf_lect [i]);
fin_adr [j] = '\0';
// lire le nom de l'utilisateur
fgets (buf_lect, sizeof (buf_lect), fconf);
// sauter la zone user dans la ligne lue
i = 4;
while (buf_lect [i] > ' ')
i++;
while (buf_lect [i] == ' ')
i++;
// fabriquer le début de l'adresse email
j = 0;
while (buf_lect [i] != '\n' && buf_lect [i])
bufadr [j] = buf_lect [i];
// rajouter la fin de cette adresse
strcpy (bufadr + j, fin_adr);
// se repositionner comme avant dans le fichier de configuration
fseek (fconf, posit, SEEK_SET);
}
// sinon erreur non récupérable
else
// "Adresse Email erronée dans le fichier de configuration"
errfatale ("ERR_ADR_MAIL", NULL);
}
/* réexpédie le mail sélectionné à sa nouvelle adresse */
void copiemail (int numail)
{
char bufw [120]; // buffer d'envoi d'une requête
// initialisation de l'envoi SMTP
// expéditeur du message
sprintf (bufw, "MAIL FROM: <%s>", adr_exped);
envoie_smtp (bufw);
lire_smtp ();
// destinataire principal du message
sprintf (bufw, "RCPT TO: <%s>", adr_dest);
envoie_smtp (bufw);
lire_smtp ();
// si destinataire refusé, on le signale
if (buf_lect [0] != '2')
{
// Affichage de l'adresse à problème
// "Destinataire %s refusé\n"
printf (message ("REFUS_DEST"), adr_dest);
puts (buf_lect);
// et on n'envoie aucun mail d'avertissement
envoie_smtp ("RSET");
lire_smtp ();
return; // mail non envoyé
}
// préparation de l'envoi du message
envoie_smtp ("DATA");
lire_smtp ();
// demande de lecture du message et réception de l'acquittement
sprintf (bufw, "RETR %d", numail);
env_pop (bufw);
lire_pop ();
// terminé pour ce mail si erreur d'envoi coté serveur
if (memcmp (buf_lect, "-ERR ", 5) == 0)
{
// Erreur serveur pour l'accès au mail
aff_err_argnum ("ERREUR_SERVEUR", numail);
}
// réexpédition du mail
do
{
// lire une ligne du mail
lire_pop ();
// expédier la ligne lue à l'autre serveur
envoie_smtp (buf_lect);
}
while (buf_lect [0] != '.' || buf_lect [1] != '\0');
// récupérer l'acquitement du serveur smrp
lire_smtp ();
}
/* supprime le mail sélectionné du serveur courant */
void detruitmail (int numail)
{
char bufw [120]; // buffer d'envoi d'une requête de destruction
// demande de destruction du mail sur le serveur initial
sprintf (bufw, "DELE %d", numail);
env_pop (bufw);
lire_pop ();
}