PSR SE2a4 2022/2023 G2
Sommaire
A faire (concernant les serveurs SMTP):
-un système doit être réalisé permettant au serveur SMTP sortant de mettre en file d’attente les messages non remis à destination pour cause d’erreur transitoire du serveur SMTP cible;
-les communications peuvent ne pas être chiffrées, les communications non chiffrés sont reçues sur le port 25 ;
-les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent être négociées directement sur le port 465 ;
-il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS ;
-les serveurs SMTP doivent gérer les enregistrements MX permettant d’associer un nom de domaine à un serveur de messagerie, le recours aux enregistrements AAAA et A est à utiliser en cas d’absence de MX ;
A faire (concernant le stockage des courriels):
- ne doivent être stockés que les courriels à destination d’un utilisateur local ;
-le processus de remise stocke le message dans le sous-répertoire Maildir/tmp puis le déplace dans le sous-répertoire Maildir/new, déplacement doit être fait par la primitive rename ;
-pour assurer un nom unique aux fichiers de stockage, utilisez la date en seconde (fonction time), le PID et un compteur commun à tous les flux d’exécution (utilisation de sémaphores indispensable).
Tips:
-Se connecter au serveur : "ssh root@capbreton.plil.info"
-Se connecter à la VM : "ssh root@193.48.57.164"
Exécuter le programme:
-ouvrir le terminal en mode root : "su -"
-vérifier si le port 25 est déjà occupé : "ss -tpln"
-??? : "service exim4 stop"
-dans la racine du prog : "make" (voir makefile pour make et makefile???)
-dans MTA int ou MTA ext : "./SMTPin -p25" et "./SMTPext -p25"
-dans la racine du prog : "nc localhost 25"
Modifications dans le programme:
Le fichier "mx.c" dans le "src/SMTPin" ne sert pas (il est vide d'ailleurs), la fonction "**chercherMX" est implémentée dans un autre fichier "mx.c" dans "libs/Reseau", on peut donc le supprimer.
Dans le fichier "in.c" -> fonction "gestionCourriel", lorsqu'on initialise la connexion au serveur, on ne teste pas a bien été créée, on rajoute donc une condition d'erreur.
Dans le fichier "in.c" -> fonction "gestionCourriel", lorsqu'on a trouvé les enregistrements DNS de type MX (serveurs courriel), on leur envoie le courriel de cette façon :
-On envoie le courriel au MX qui a la priorité la plus basse,
-Si l'envoi échoue, on retente avec le MX de priorité suivante,
-Jusqu'à ce qu'on réussisse à envoyer le courriel à un MX.
Pourtant si l'envoi est un succès, on continue d'envoyer le mail aux autres MX, il faut donc rajouter l'instruction else{break;} dans le code lorsque l'envoi est un succès.
Ancien code :
while(*p!=NULL){
- ifdef DEVERMINE
printf("Serveur : %s\n",*p);
- endif
int ss=connexionServeur(*p,SMTP_PORT_DEFAULT); FILE *dialogue=fdopen(ss,"a+"); if(dialogue==NULL){ perror("gestionCourriel.fdopen"); exit(EXIT_FAILURE); } char erreur[MAX_ERREUR]; int resultat=SMTP_dialogue(dialogue,donnees,erreur,MAX_ERREUR); if(resultat<0) ecritureJournal(JOURNIV_DEVERMINE,JOURNAL_MXHS,*p); // Logguer l'erreur fclose(dialogue); p++; }
Nouveau code :
while(*p!=NULL){
- ifdef DEVERMINE
printf("Serveur : %s\n",*p);
- endif
int ss=connexionServeur(*p,SMTP_PORT_DEFAULT); if(ss<0){ fprintf(stderr,"La connexion au serveur %s a échoué", *p); } FILE *dialogue=fdopen(ss,"a+"); if(dialogue==NULL){ perror("gestionCourriel.fdopen"); exit(EXIT_FAILURE); } char erreur[MAX_ERREUR]; int resultat=SMTP_dialogue(dialogue,donnees,erreur,MAX_ERREUR); fclose(dialogue); if(resultat<0) ecritureJournal(JOURNIV_DEVERMINE,JOURNAL_MXHS,*p); // Logguer l'erreur else{break;} p++; }
-le processus de remise stocke le message dans le sous-répertoire Maildir/tmp puis le déplace dans le sous-répertoire Maildir/new, déplacement doit être fait par la primitive rename ;