#define szlig 120 // longueur maximale des lignes du fichier de données
#define maxmemo 5 // nombre maximal de lignes du fichier mémorisées
/* variables globales au source */
char chem_mailrep [szchemin]; // chemin d'accès au fichier de données
FILE *fmailrep = NULL; // descripteur du fichier de données
int nbligmemo = 0; // nombre de mots clés mémorisés
char mot_cle [maxmemo][20]; // liste des mots clés mémorisés
char chaine [maxmemo][szlig]; // et des chaines de caractères associées
long posmessage = 0; // position dans le fichier du corps du message
/* si ce n'est déjà fait, ouvre de fichier décrivant le contenu d'un mail
à envoyer automatiquement, et mémorise certaines données qu'il contient
si le nom de fichier ficmailrep n'est pas NULL, c'est ce fichier qui sera
utilisé, sinon le nom du fichier est fabriqué à partir du mot clé ncom */
FILE * acces_mailrep (char *ficmailrep, char *ncom)
{
static int testacces = 0; // mémorise si on a déjà appelé cette fonction
char nom_mailrep [20]; // nom du fichier sans suffixe linguistique
char ligne [szlig]; // contenu d'une ligne du fichier de données
int i, j; // indices pour traitement chaines de caractères
// si on appelle cette fonction pour la première fois
if (testacces == 0)
{
// on ne repassera plus dans ce bloc d'instructions
testacces = 1;
// générer le chemin d'accès au fichier du mail en réponse
// si c'est un fichier spécifique
if (ficmailrep)
// recopier son nom
strcpy (chem_mailrep, ficmailrep);
// sinon
else
{
// fabriquer le nom du fichier à partir du mot clé ncom
sprintf (nom_mailrep, "mail-%s", ncom);
strcpy (chem_mailrep, chemfichlang (nom_mailrep, 0));
}
// tenter de l'ouvrir en lecture
fmailrep = fopen (chem_mailrep, "r");
// si l'ouverture s'est bien passée
if (fmailrep)
{
// tant qu'on n'est pas arrivé sur le ligne !MESSAGE, lire une ligne
while (fgets (ligne, szlig, fmailrep) && ! posmessage)
{
// suppression de \n en fin de ligne
ligne [strlen (ligne) - 1] = '\0';
// si cette ligne contient une chaine à mémoriser
if ('A' <= *ligne && *ligne <= 'Z')
{
//
if (nbligmemo >= maxmemo)
{
// "Débordement : recompiler mailrep avec maxmemo plus grand"
affiche_err ("AUGM_MAXMEMO");
exit (-1);
}
// la mémoriser
i = 0;
// mémorisation du mot clé
while (ligne [i] > ' ')
mot_cle [nbligmemo][i++] = ligne [i];
mot_cle [nbligmemo][i++] = '\0';
// aller sur la chaine de caractères associée
while (ligne [i] == ' ' || ligne [i] == '\t')
i++;
j = 0;
// la mémorisation de la chaine diffère selon
// qu'elle soit encadrée ou non de '"'
if (ligne [i] == '"')
{
while (ligne [++i] != '"' && i < szlig)
{
if (ligne [i] == '\\')
i++;
chaine [nbligmemo][j++] = ligne [i];
}
}
else
{
while (ligne [i] > ' ')
chaine [nbligmemo][j++] = ligne [i++];
}
// fin de la mémorisation de la chaine associée
chaine [nbligmemo++][j] = '\0';
}
// sinon, si on vient de lire la ligne !MESSAGE
else if (*ligne == '!' && strcmp (ligne, "!MESSAGE") == 0)
// mémoriser la position du début du message dans le fichier
posmessage = ftell (fmailrep);
}
}
// sinon, message d'erreur (qui ne sera pas répété)
else
{
// "Fichier %s manquant ou inaccessible"
// "Les auteurs de mails détruits ne seront pas avertis"
aff_err_arg ("FICH_MANQUANT", chem_mailrep);
affiche_err ("PAS_AVERTIS");
}
}
// retourner le résultat des opérations de chargement
return (fmailrep);
}
/* retourne une chaine de caractères identifiée par un nom */
char *chaine_mailrep (char *motcle)
{
int ligmemo;
// chercher le mot clé dans la liste
for (ligmemo = 0; ligmemo < nbligmemo; ligmemo++)
{
// si trouvé, retourner la chaine de caractères associée
if (strcmp (mot_cle [ligmemo], motcle) == 0)
return (chaine [ligmemo]);
}
void envoi_mailrep ()
{
char ligne [szlig]; // contenu d'une ligne du fichier de données
// se positionner au début du message
fseek (fmailrep, posmessage, SEEK_SET);
// tant qu'on n'a pas envoyé tout le message, lire une ligne
while (fgets (ligne, szlig, fmailrep))
{
// supprimer le \n en fin de ligne
ligne [strlen (ligne) - 1] = '\0';
// envoyer la ligne dans le mail
envoie_smtp (ligne);
}
}