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 de fonctions permettant de récupérer le nom
d'expéditeur d'un mail, puis de le comparer à des noms
d'expéditeurs d'une liste pour compter les différences.
*/
// lit l'entête d'un mail et récupère le champ expéditeur
void recup_exped (int numes, char *bufFrom)
{
char bufw [120]; // buffer d'envoi d'une requête
int debexped; // position du premier caractère significatif du exped
// initialisations
bufFrom [0] = '\0';
// demande de lecture de l'entête du message
sprintf (bufw, "TOP %d 1", numes);
env_pop (bufw);
// lire la première ligne de l'entête du message
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", numes);
return;
}
// lecture entête du message et mémorisation de l'expéditeur du mail
do
{
// si on a trouvé le champ exped
if (start ("From"))
{
// recherche du premier caractère significatif du exped
debexped = 6;
while (buf_lect [debexped] == ' ')
debexped++;
// tronquer si nécessaire l'expéditeur
if (strlen (buf_lect + debexped) >= 120)
buf_lect [debexped + 120] = '\0';
// mémorisation de l'expéditeur
strcpy (bufFrom, buf_lect + debexped);
}
// lire la ligne suivante de l'entête du message
lire_pop ();
}
// lecture terminée si ligne limitée à un .
while (buf_lect [0] != '.' || buf_lect [1] != '\0');
}
/* recherche si le champ du mail passée en paramètre
contient l'une des chaines de la liste */
int simexped (char *bufFrom, char **liste, int sz_liste)
{
char exped [120]; // expéditeur à tester
char *chainetest; // chaine de la liste à tester
int nbdiff; // nombre de différences
int mindiff; // nombre de différences pour la chaine qui en a le moins
int i, j; // compteurs
// initialisation
i = 0;
// mémorisation de l'expéditeur
// s'il commence par "
if (*bufFrom == '"')
{
// on mémorise ce qu'il y a entre les deux "
while (bufFrom [i + 1] != '"' && bufFrom [i + 1])
{
exped [i] = bufFrom [i + 1];
i++;
}
// terminer la chaine de caractères
exped [i] = '\0';
}
// sinon
else
{
// chercher après le premier espace
while (bufFrom [i] && bufFrom [i++] != ' ')
;
// le champ adresse de l'expéditeur
while (bufFrom [i] && bufFrom [i++] != '@')
;
// le nom de l'expéditeur est jusqu'à l'espace qui précède
while (i > 0 && bufFrom [i] != ' ')
i--;
// précaution pour le cas oùil y aurait plusieurs espaces
while (i > 0 && bufFrom [i] == ' ')
i--;
// on mémorise l'expéditeur en commençant par la fin
exped [i] = '\0';
while (i--)
exped [i] = bufFrom [i];
}
// initialisation
mindiff = strlen (exped);
// on compare la chaine exped avec toutes les chaines de la liste
// sauf si on a trouvé la chaine exped telle quelle dans la liste
for (j = 0; j < sz_liste && mindiff; j++)
{
// on ne compare que des chaines de longueur identique
if (strlen (exped) == strlen (liste [j]))
{
// sélectionner la chaine à comparer
chainetest = liste [j];
// initialisation
i = 0;
nbdiff = 0;
// tant que la chaine expéditeur n'a pas été parcourue
while (exped [i])
{
// comparer 2 caractères à la même position
// on accepte les différences de casse (par sécurité)
if (tolower (exped [i]) != tolower (chainetest [i]))
// comptabiliser les différences
nbdiff ++;
// passer au caractère suivant des 2 chaines
i++;
}
// si moins de différences que pour une chaine précédente
if (mindiff > nbdiff)
// mémoriser la nouvelle valeur de nbdiff
mindiff = nbdiff;
}
}
// retourner le résultat de la meilleure comparaisons
return (mindiff);
}