PSR SE2a4 2022/2023 G6 : Différence entre versions
| Ligne 19 : | Ligne 19 : | ||
| Réécriture du code<br/> | Réécriture du code<br/> | ||
| + | -> à compléter par @Bastien.Germond | ||
| Création code Maildir/tmp -> réception message (MTAext.c)<br/> | Création code Maildir/tmp -> réception message (MTAext.c)<br/> | ||
| Pour générer un identifiant unique, on utilise la librairie <libuuid> : #include <uuid/uuid.h> <br/> | Pour générer un identifiant unique, on utilise la librairie <libuuid> : #include <uuid/uuid.h> <br/> | ||
| Ligne 30 : | Ligne 31 : | ||
|      uuid_generate_random(binuuid); |      uuid_generate_random(binuuid); | ||
|      char *uuid = malloc(37);//Nb of characters for unique id |      char *uuid = malloc(37);//Nb of characters for unique id | ||
| − |      uuid_unparse_lower(binuuid, uuid);//lettre minuscule | + |      uuid_unparse_lower(binuuid, uuid);//unique id en lettre minuscule | 
| − | + | </pre> | |
| + | On définit ici un identifiant unique pour pouvoir suivre le mail envoyé (éviter toutes collisions ou perdition de données) | ||
| + | <pre> | ||
|      LOG_D("Mail UUID %s", uuid); |      LOG_D("Mail UUID %s", uuid); | ||
|      char tmp_path[256]; |      char tmp_path[256]; | ||
| Ligne 39 : | Ligne 42 : | ||
|      FILE *fptr; |      FILE *fptr; | ||
|      fptr = fopen(tmp_path, "w"); |      fptr = fopen(tmp_path, "w"); | ||
| − | + | </pre> | |
| + | |||
| + | <pre> | ||
|      if(fptr == NULL){ |      if(fptr == NULL){ | ||
|          LOG_E("Couldn't open Maildir tmp"); |          LOG_E("Couldn't open Maildir tmp"); | ||
|          exit(1); |          exit(1); | ||
|      } |      } | ||
| − | + | </pre> | |
| − |      fprintf(fptr, "From: %s\r\n", state->sender); | + | Ici, on utilise une fonction conditionnelle pour informer que l'on n'est pas parvenu à entrer dans le dossier de redirection de mail | 
| + | <pre> | ||
| + |      fprintf(fptr, "From: %s\r\n", state->sender);   | ||
|      fprintf(fptr, "To: %s\r\n", state->recipient); |      fprintf(fptr, "To: %s\r\n", state->recipient); | ||
| − |      fprintf(fptr, "%s\r\n", state->body);  | + |      fprintf(fptr, "%s\r\n", state->body); | 
|      fclose(fptr); |      fclose(fptr); | ||
| − | + | </pre> | |
| + | On transforme les informations stockées dans la structure "state" en format de mail avec la source, le destinataire et le corps. | ||
| + | <pre> | ||
|      char new_path[256]; |      char new_path[256]; | ||
|      sprintf(new_path, "/root/Maildir/new/%s", uuid); |      sprintf(new_path, "/root/Maildir/new/%s", uuid); | ||
| Ligne 59 : | Ligne 68 : | ||
| } | } | ||
| </pre> | </pre> | ||
| + | |||
| Test code MTAext.c : vérification<br/> | Test code MTAext.c : vérification<br/> | ||
| + | |||
| + | Le mail est composé d'une entête et d'un corps de mail | ||
| -> compilation/execution de réception de mails (envoyeur, receveur, corps de mail, UUID)<br/> | -> compilation/execution de réception de mails (envoyeur, receveur, corps de mail, UUID)<br/> | ||
Version du 17 mars 2023 à 11:26
Infrastructure
Le serveur est disponible sur `yamaha.germond.org` (193.48.57.161), le DNS est hébergé sur mon (bastien) infrastructure[1]
[1]
03/02/2023
Création VM : yamaha (IP : 193.48.57.161)
Lancement de la VM
Ouverture du projet beta
Découverte STMPin
10/02/2023
Réécriture du code
-> à compléter par @Bastien.Germond
Création code Maildir/tmp -> réception message (MTAext.c)
Pour générer un identifiant unique, on utilise la librairie <libuuid> : #include <uuid/uuid.h> 
https://stackoverflow.com/questions/51053568/generating-a-random-uuid-in-c
int processing_mail(struct smtp_state *state) {
    LOG_D("Processing mail...");
    uuid_t binuuid;// Unique ID in binary
    uuid_generate_random(binuuid);
    char *uuid = malloc(37);//Nb of characters for unique id
    uuid_unparse_lower(binuuid, uuid);//unique id en lettre minuscule
On définit ici un identifiant unique pour pouvoir suivre le mail envoyé (éviter toutes collisions ou perdition de données)
    LOG_D("Mail UUID %s", uuid);
    char tmp_path[256];
    sprintf(tmp_path, "/root/Maildir/tmp/%s", uuid);
    LOG_D("Writing mails at %s", tmp_path);
    FILE *fptr;
    fptr = fopen(tmp_path, "w");
    if(fptr == NULL){
        LOG_E("Couldn't open Maildir tmp");
        exit(1);
    }
Ici, on utilise une fonction conditionnelle pour informer que l'on n'est pas parvenu à entrer dans le dossier de redirection de mail
    fprintf(fptr, "From: %s\r\n", state->sender); 
    fprintf(fptr, "To: %s\r\n", state->recipient);
    fprintf(fptr, "%s\r\n", state->body);
    fclose(fptr);
On transforme les informations stockées dans la structure "state" en format de mail avec la source, le destinataire et le corps.
    char new_path[256];
    sprintf(new_path, "/root/Maildir/new/%s", uuid);
    LOG_D("Move mails at %s", new_path);
    rename(tmp_path, new_path);
    return 0;
}
Test code MTAext.c : vérification
Le mail est composé d'une entête et d'un corps de mail
-> compilation/execution de réception de mails (envoyeur, receveur, corps de mail, UUID)
