#define defaut_port_smtp 25 // port utilisé par défaut par les serveurs smtp
#define octet unsigned char
/* Connexion au serveur smtp (même fonction qu'en mode normal) */
int connect_smtp (char *infoserveur)
{
octet *carinfo; // caractère de infoserveur
char serv_smtp [120]; // nom du serveur smtp utilisé
int port; // numéro du port smtp utilisé
FILE *fich_auth; // descripteur du fichier d'authentification smtp
char bufin [120]; // buffer pour lire le fichier d'authentification
char bufw [120]; // buffer d'envoi d'une ligne ou requête smtp
int caract; // caractère du fichier d'authentification smtp
int retour; // code de retour de la fonction
// initialisation du numéro de port par défaut
port = defaut_port_smtp;
// si la ligne smtp de fichier de configuration fait
// référence à un fichier d'authentification smtp
if (*infoserveur == '>')
{
// se positionner sur le nom de ce fichier
carinfo = infoserveur + 1;
if (fich_auth)
{
// recupérer le nom du serveur smtp
fgets (serv_smtp, 120, fich_auth);
serv_smtp [strlen (serv_smtp) - 1] = '\0';
// mémoriser les autres lignes particulières du fichier
// d'authentification smtp (on s'arrête sur une ligne vide)
while (fgets (bufin, 120, fich_auth) && *bufin != '\n')
{
bufin [strlen (bufin) - 1] = '\0';
// numéro de port spécifié ?
if (startligne (bufin, "port"))
{
// récupérer le numéro du port
carinfo = bufin + 4;
while (*carinfo == ' ' || *carinfo == '\t')
carinfo++;
port = atoi (carinfo);
// le vérifier sommairement
if (!port)
{
// "Numéro de port smtp invalide"
affiche_err ("PORT_SMTP_INVALIDE");
retour = 0;
}
}
}
// tentative de connexion au serveur smtp
if (port)
retour = connect_serv_smtp (serv_smtp, port);
// si la connexion s'est bien déroulée
if (retour)
{
// se positionner sur la première ligne
// du dialogue d'authentification
while (fgets (bufin, 120, fich_auth) && *bufin == '\n')
;
// dialogue d'authentification
do
{
// mise en forme de la ligne lue
bufin [strlen (bufin) - 1] = '\0';
// si ligne à encoder base 64
if (startligne (bufin, "b64"))
{
// l'encoder avant de l'envoyer
encode64 (bufin + 4, bufw, strlen (bufin + 4));
puts (bufin);
envoie_smtp (bufw);
}
// sinon, envoyer directement la ligne
else
envoie_smtp (bufin);
// et lire la réponse du serveur
lire_smtp ();
}
// passage à la ligne suivante
while (fgets (bufin, 120, fich_auth));
}
// libérer le fichier d'authentification smtp
fclose (fich_auth);
}
else
{
// message d'erreur
// "Fichier %s non trouvé"
aff_err_arg ("FICH_ABSENT", carinfo);
retour = 0;
}
}
// sinon simple connexion à un serveur smtp sans authentification
else
{
// parcourir le nom du serveur smtp
carinfo = infoserveur;
while (*carinfo > ' ')
carinfo ++;
// si le nom du serveur smtp est suivi d'autres informations
if (*carinfo)
{
// terminer le nom du serveur smtp
*carinfo = '\0';
// se positionner sur le numéro de port éventuel
do
carinfo++;
while (*carinfo == ' ' || *carinfo == '\t');
}
// si un numéro de port semble présent
if (*carinfo)
// le récupérer
port = atoi (carinfo);
// si numéro de port trouvé ou si on a conservé le port par défaut
if (port)
// établir la connexion smtp avec le port choisi
retour = connect_serv_smtp (infoserveur, port);
// sinon message d'erreur
else
{
// "Numéro de port smtp invalide"
affiche_err ("PORT_SMTP_INVALIDE");
retour = 0;
}
// si la connexion smtp s'est bien déroulée
if (retour)
{
// générer le message helo nom_de_calculateur
strcpy (bufw, "HELO ");
gethostname (bufw + 5, sizeof (bufw) - 5);