Portail / Sujets autour de la programmation / Programmation C/C++ sous Linux / Utilisation des courriels(Sommaire)

Analyse de courriels.

Mise à jour du 07/05/2024.

De plus en plus de documents "officiels" (à défaut d'être légaux) transitent désormais par la messagerie électronique. Si pour les organismes émetteurs cela constitue une économie importante au regard de l'envoi de courrier "papier", cela pose pour chacun d'entre nous la question de l'archivage et de la recherche de ces courriels. Or, un courriel est totalement contenu (pièces jointes comprises) dans un flux textuel répondant au format de la RFC2822. Il est donc tentant de conserver ces courriels sous forme de fichiers texte (extension par défaut (.eml)). Cet article montre comment retrouver le contenu d'un courriel depuis cette forme.

Choix de composant et d'architecture.

Plutôt que d'écrire le code de cet analyseur en partant de rien, nous allons de nouveau utiliser la librairie vmime déjà abordée dans l'article Envoi de courriels. Pour rappel, cette librairie est écrite en C++ et encapsule la plupart des objets dans des pointeurs "intelligents".

Nous avons intégrer les classes de cette librairie dans notre propre librairie emailafin de simplifier les cas d'utilisation et le développement de notre analyseur. Nous supposons connues les bases de la RFC2822 et notamment l'agrégation de plusieurs fragments de natures différentes (multipart) pour composer un courriel.

Réalisation.

Nous avons réaliser un prototype nommé p40. Ce prototype analyse un courriel sous forme d'un fichier EML et restitue sur la console les fragments qui le constituent.

Ce prototype utilise 3 librairies dynamiques :

  1. vmime ;
  2. jmp ;
  3. email.

En dehors du code de vérification et d'affichage des parties, le coeur se résume à une seule ligne :

try {
    string dir = "/tmp";
    //string dir = "";
    email = Email::loadEml(1, emlFile, headers, dir, true);
}
catch(const std::exception& error) {
    cerr << "Echec de chargement du fichier [" << emlFile << "] : " << error.what() << endl;
    return 4;
}

Si le paramètre dir est une chaîne vide, aucune enregistrement de pièce jointe sur disque ne sera effectué. Si le dernier paramètre vaut false, aucun objet embarqué dans un document HTML ne sera enregistré sur disque.

Le code source est disponible via ce lien.

Rédaction par Jean-Marie Piatte (1983-2021)