Comment lire les fichiers MSG en C++

Comment lire les fichiers MSG en C++

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Fonction de la charte. mapi_message::from_file() et mapi_message::from_stream() chargé le message complet — sujet, corps, envoyé, destinataires et annexes — dans une mémoire Objets sans dépendance Outlook ou COM.

Étape 1 - Démarrer le projet

Clonez le répertoire et ajoutez-le à votre CMakeLists.txt:

git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.git
add_subdirectory(Aspose.Email-FOSS-for-Cpp)
target_link_libraries(your_target PRIVATE AsposeEmailFoss::AsposeEmailFoss)

Étape 2 – Inclure le titre

#include "aspose/email/foss/msg/mapi_message.hpp"

Cette seule rubrique fournit mapi_message et tous les types de support dans le aspose::email::foss::msg Nom du domaine.


Étape 3 - Télécharger un message d’un fichier de route

Utiliser mapi_message::from_file() Lorsque vous avez un std::filesystem::path:

#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto message = aspose::email::foss::msg::mapi_message::from_file(
        std::filesystem::path("sample.msg"));

    std::cout << "Subject: " << message.subject() << '\n';
    std::cout << "From:    " << message.sender_name()
              << " <" << message.sender_email_address() << ">\n";
    std::cout << "Body:    " << message.body() << '\n';
}

Étape 4 – Télécharger un message d’un courant

Utiliser mapi_message::from_stream() Pour se débarrasser de n’importe quel std::istream Utiles pour Traitement des données MSG reçues par le biais d’un réseau ou d’un buffer en mémoire :

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    std::cout << "Subject: " << message.subject() << '\n';
}

Toujours ouvrir le courant avec std::ios::binary Pour éviter la fin de ligne Windows Translation de la corruption du conteneur CFB.


Étape 5 - Recipients de l’itérate

message.recipients() Retour à A std::vector des objets, chacun avec display_name, email_address,et recipient_type Les champs :

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.recipients().size(); ++i)
    {
        const auto& r = message.recipients()[i];
        std::cout << "[" << (i + 1) << "] "
                  << r.display_name << " <" << r.email_address << ">"
                  << " type=" << r.recipient_type << '\n';
    }
}

Étape 6 - L’attractions de l’Iterate

message.attachments() Retour à A std::vector - les objets de l’adhésion. chaque attachement Expositions filename, mime_type, data (Les bits de la crème), content_id,Et le is_embedded_message() Prédictions :

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.attachments().size(); ++i)
    {
        const auto& a = message.attachments()[i];
        std::cout << "[" << (i + 1) << "] "
                  << a.filename << "  mime=" << a.mime_type
                  << "  bytes=" << a.data.size()
                  << "  embedded=" << (a.is_embedded_message() ? "yes" : "no")
                  << '\n';
    }
}

Problèmes courants et solutions

vide body() Après le chargement. Certains messages stockent le texte uniquement dans le corps HTML Propriété : vérifier message.html_body() Quand message.body() Il revient une ligne vide.

Le courant s’ouvre sans std::ios::binary. Windows, les flux de mode texte traduisent CRLF séquences, silencieusement corrompre les données CFB binaires. toujours ouvrir les fichiers MSG avec std::ios::binary.

msg_exception J’ai jeté un fichier valide. Vérifier que le fichier est un MSG authentique (File composé OLE). Les fichiers sauvés par certains outils d’exportation peuvent être le texte plain ou MIME et ne peut être pardonné par mapi_message::from_file().

recipients() Il revient un vecteur vide. Les fichiers MSG plus anciens omettent parfois le destinataire table mais stock de récepteurs dans le display_to MAPI propriété.Accédez à travers message.get_property_value() avec common_message_property_id::display_to et property_type_code::ptyp_string.

Les données de grande ampleur dans la mémoire. - Lemapi_message::from_file() et from_stream() chargez l’ensemble du message, y compris tous les bytes d’ajout. Pour de grands fichiers, ouvrez le Contenu de base avec msg_reader et inspecter les flux d’adhésion sans complètement les matérialiser.

Questions fréquentes

Quelle est la différence entre from_file() et from_stream()?

Les deux produisent une identité mapi_message objets . from_file() accepter A std::filesystem::path ouvrir le fichier à l’intérieur. from_stream() Lire de Aucun std::istream vous fournissez – utile lorsque les données MSG sont déjà en mémoire ou Arrivée sur un socket.

Le fait from_file() Garder le fichier ouvert après la charge ?

Le fichier est ouvert, entièrement pars dans la mémoire et fermé avant de se faire passer. from_file() Vous pouvez déplacer ou supprimer le fichier source immédiatement après la convocation.

Puis-je lire les fichiers MSG créés par Outlook sur macOS ou Linux?

Le format MSG (OLE Compound File + MAPI) est portable à travers les Système d’exploitation : tout .msg Un fichier produit par n’importe quelle version d’Outlook peut être ouvert. avec mapi_message::from_file().

Comment lire le corps HTML ?

Appel à message.html_body().Si le message a été créé avec un seul corps de texte plain, Il revient une ligne vide. message.body() Retourner le corps de texte.

La mode stricte est-elle la défaut ?

mapi_message::from_file(path, strict) et from_stream(stream, strict) Accepter un Optionnel strict Le défaut est false,qui tolère les structures minoritaire Les déviations dans les fichiers MSG du monde réel.

Voir aussi

 Français