PSR SE2a4 2022/2023 G2 : Différence entre versions
(→Modifications SMTPin:) |
(→Modifications SMTPin:) |
||
Ligne 25 : | Ligne 25 : | ||
*Dans le fichier "in.c" -> fonction "gestionCourriel", une fois les enregistrements DNS de type MX (serveurs courriel) trouvés, 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 que l'envoi soit un succès. 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.<br> | *Dans le fichier "in.c" -> fonction "gestionCourriel", une fois les enregistrements DNS de type MX (serveurs courriel) trouvés, 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 que l'envoi soit un succès. 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.<br> | ||
− | + | ||
while(*p!=NULL){ | while(*p!=NULL){ | ||
#ifdef DEVERMINE | #ifdef DEVERMINE | ||
Ligne 44 : | Ligne 44 : | ||
p++; | p++; | ||
} | } | ||
− | |||
== Modifications SMTPout: == | == Modifications SMTPout: == |
Version du 18 mars 2023 à 18:54
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).
Exécuter le prog
- ouvrir le terminal en mode root : "su -"
- vérifier si le port 25 est déjà occupé : "ss -tpln"
- arrêter le processus exim4 (qui utilise le port 25) : "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 SMTPin:
- 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", une fois les enregistrements DNS de type MX (serveurs courriel) trouvés, 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 que l'envoi soit un succès. 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.
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); fclose(dialogue); if(resultat<0) ecritureJournal(JOURNIV_DEVERMINE,JOURNAL_MXHS,*p); // Logguer l'erreur else{break;} p++; }
Modifications SMTPout:
On stocke les courriels dans la structure de répertoire MAILDIR, composée de 3 sous-répertoires : tmp, new et cur. Le processus qui récupère les courriels place les courriels dans le répertoire tmp, le nom du fichier est généré automatiquement de manière à être unique. Une fois le message complètement reçu par le serveur de courriel (MTA), il est déplacé, par un système de link/unlink dans le répertoire new. Au passage du client de messagerie qui parcourt le répertoire new, il est à nouveau déplacé et est mis dans le répertoire cur. Le message n'a toujours pas été lu.
Dans le programme "outc.c" > la fonction "gestionCourriel", on déplace le sous-répertoire Maildir/tmp dans le sous-repertoire Maildir/new en utilisant la primitive rename
Ancien code
char fichier[MAX_CHEMIN];
sprintf(fichier,"%s/%s/%s/%ld_%010d_%010ld",dossier,id,MAILDIR_TMP,time(NULL),pid,messages);
FILE *f=fopen(fichier,"w");
if(f==NULL){
ecritureJournal(JOURNIV_ERREUR,JOURNAL_OUVERTURE,fichier); return; }
int nb=fwrite(donnees->corps,donnees->taille,1,f); if(nb!=1){
ecritureJournal(JOURNIV_ERREUR,JOURNAL_ECRITURE,fichier); return; }
fclose(f);
Nouveau code
char fichier[MAX_CHEMIN]; sprintf(fichier,"%s/%s/%s/%ld_%010d_%010ld",dossier,id,MAILDIR_TMP,time(NULL),pid,messages); FILE *f=fopen(fichier,"w"); if(f==NULL){
ecritureJournal(JOURNIV_ERREUR,JOURNAL_OUVERTURE,fichier); return; }
int nb=fwrite(donnees->corps,donnees->taille,1,f); if(nb!=1){
ecritureJournal(JOURNIV_ERREUR,JOURNAL_ECRITURE,fichier); return; }
fclose(f); char fichier_new[MAX_CHEMIN]; sprintf(fichier_new,"%s/%s/%s/%ld_%010d_%010ld",dossier,id,MAILDIR_NEW,time(NULL),pid,messages); rename(fichier, fichier_new);
Test sur la VM
- Se connecter au serveur : "ssh root@capbreton.plil.info"
- Se connecter à la VM : "ssh root@193.48.57.164" (password : "glopglopglop")
- Copier le programme dans la VM (à la racine) : "scp - r LisaJerome/ root@193.48.57.164:/
Après avoir créé la VM (xen) sur le serveur capbreton.plil.info (routable sur internet) et y avoir copié le prog, on s'aperçoit qu'il n'est pas possible de lancer les 2 serveurs SMTPin et SMTPout en même temps car un seul processus peut utiliser le port 25 à la fois. Il faut donc lancer les serveurs sur des interfaces diff (smtpout : eth0, smtpin : loopback).
On s'aperçoit que lorsqu'aucune interface n'est spécifiée, c'est l'interface loopback par défaut (-l).
On va donc modifier que out.c et son args.c...