/*
Fichier selhtm.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 recopie les caractéristique de chaque mail
en attente de téléchargement (ou de destruction).
Ces informations sont mémorisées dans 2 fichiers distincts,
un pour les message lisibles en mode texte, l'autre pour les
mais rédigé seulement en HTML pur (fréquent pour les publicités).
Un fichier de configuration est utilisé pour se connecter à la
boite aux lettres.
*/
#define appli // pour la déclaration de variables globales à l'application
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "messages.h"
#include "buflect.h"
#include "ficonf.h"
#include "pop.h"
#include "trtentete.h"
/* prototypes */
void lirentete (int numes);
/* variables globales au source
(pour éviter des tonnes de passages de paramètres) */
FILE *fseltxt, *fselhtm; // descripteurs des 2 fichiers résultat
/* programme principal */
int main (int nbarg, char *varg[])
{
FILE *fconf; // descripteur du fichier de configuration
int numes, nbmes; // numéro du mail courant et nombre de mails
// récupération du nom de l'exécutable
memcom (*varg);
if (--nbarg == 3)
{
// ouvrir le fichier de configuration
fconf = ouvre_ficonf (varg [1]);
if (fconf)
{
// connexion sur le compte mail du serveur pop
if (connect_pop (fconf))
{
// ouvrir les fichiers résultat
fseltxt = fopen (varg [2], "w");
fselhtm = fopen (varg [3], "w");
if (fseltxt && fselhtm)
{
// récupération du nombre de mails
nbmes = nbmails ();
// récupération de la liste des mails
for (numes = 1; numes <= nbmes; numes++)
lirentete (numes);
// pour l'affichage propre
putchar ('\n');
}
else
// "Impossible d'écrire dans un fichier résultat"
affiche_err ("IMPOS_ECR_FICHRES");
// se déconnecter proprement du serveur pop
deconnect_pop ();
}
// on n'a plus besoin du fichier de configuration
fclose (fconf);
}
}
else
// "Syntaxe : %s fich_configuration fich_liste1 fich_liste2"
psyntaxe ("SYNT_SELHTM");
return (0);
}
/* lit l'entête d'un message et affiche certaines lignes */
void lirentete (int numes)
{
char bufw [120]; // buffer d'envoi d'une requête
// buffers pour affichage ordonné des caractéristiques du message
char bufDate [120], bufFrom [120], bufTo [120], bufCc [120], bufReply [120],
bufSubject [120], bufContent [120], bufRetPath [120];
int posbuf; // simple compteur
FILE *ficdest; // descripteur du fichier qui mémorisera le message
// initialisation
bufDate [0] = '\0';
bufFrom [0] = '\0';
bufTo [0] = '\0';
bufCc [0] = '\0';
bufReply [0] = '\0';
bufSubject [0] = '\0';
bufContent [0] = '\0';
bufRetPath [0] = '\0';
/* demande de lecture de l'entête du message
On demande 5 lignes du corps du message pour trouver le
2ème Content-type si le premier est multipart/mixed */
sprintf (bufw, "TOP %d 5", numes);
env_pop (bufw);
// suivi de l'exécution
// "\rMessage %d"
printf (message ("ANALYSE_MAIL"), numes);
fflush (stdout);
// lecture et mémorisation des caractéristiques du message
do
{
// lire une ligne de l'entête du message
lire_pop ();
// mémorisation des caractéristiques importantes
if (start ("Date"))
membuf (bufDate);
else if (start ("From"))
memconvbuf (bufFrom);
else if (start ("To"))
memconvbuf (bufTo);
else if (start ("Cc"))
memconvbuf (bufCc);
else if (start ("Reply-To"))
memconvbuf (bufReply);
else if (start ("Subject"))
memconvbuf (bufSubject);
else if (start ("Content-Type"))
membuf (bufContent);
else if (start ("Return-Path"))
membuf (bufRetPath);
}
// lecture terminée si ligne limitée à un .
while (buf_lect [0] != '.' && buf_lect [1] != '\r');
// positionnement sur le 2ème attribut de Content_type
// nécessaire pour bonne détection s'il y à 0 ou plus
// d'un blanc après le : du Content-Type
posbuf = 17;
while (bufContent [posbuf] != '/')
posbuf++;
// choix du fichier de destination
if (*bufContent && tolower (bufContent [posbuf+1]) == 'h'
&& tolower (bufContent [posbuf+2]) == 't')
ficdest = fselhtm;
else
ficdest = fseltxt;
// "Message %d\n"
fputc ('\n', ficdest);
fprintf (ficdest, message ("AFF_NUMAIL"), numes);
// enregistrement des caractéristiques mémorisées
if (bufDate [0])
fprintf (ficdest, "%s\n", bufDate);
if (bufFrom [0])
fprintf (ficdest, "%s\n", bufFrom);
if (bufTo [0])
fprintf (ficdest, "%s\n", bufTo);
if (bufCc [0])
fprintf (ficdest, "%s\n", bufCc);
if (bufReply [0])
fprintf (ficdest, "%s\n", bufReply);
if (bufRetPath [0])
fprintf (ficdest, "%s\n", bufRetPath);
if (bufSubject [0])
fprintf (ficdest, "%s\n", bufSubject);
if (bufContent [0])
fprintf (ficdest, "%s\n", bufContent);
}