Lezen van MSG-bestanden

MSG-bestanden lezen

mapi_message is het toegangspunt voor het laden en parseren van Outlook MSG-bestanden. Eén enkele aanroep van from_file() of from_stream() leest de volledige CFB-container, haalt alle MAPI-eigenschappen op en stelt ze beschikbaar via typede accessor-methoden — er is geen Outlook-installatie vereist.


Laden vanaf een bestandspad

Gebruik mapi_message::from_file() met een 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';
}

Laden vanaf een stream

Gebruik mapi_message::from_stream() wanneer MSG-data afkomstig is van een netwerksocket, een archief, of een std::istream:

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

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

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

Open de stream altijd met std::ios::binary. Tekst-modus streams vertalen regeleinden op Windows en beschadigen de CFB-container.


Toegang tot berichteigenschappen

mapi_message exposeert de meest voorkomende berichtkenmerken als benoemde getters:

#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"));

    // Core properties
    std::cout << "Subject:          " << message.subject() << '\n';
    std::cout << "Sender name:      " << message.sender_name() << '\n';
    std::cout << "Sender email:     " << message.sender_email_address() << '\n';
    std::cout << "Internet msg-id:  " << message.internet_message_id() << '\n';
    std::cout << "Message class:    " << message.message_class() << '\n';

    // Body — check html_body() first; fall back to plain body()
    const auto& body = message.html_body().empty()
        ? message.body()
        : message.html_body();
    std::cout << "Body length: " << body.size() << " chars\n";
}

Itereer ontvangers

message.recipients() retourneert een std::vector van ontvangerobjecten met display_name, email_address en recipient_type:

#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"));

    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';
    }
}

Itereer bijlagen

message.attachments() retourneert een std::vector van bijlageobjecten. Elk exposeert filename, mime_type, data, content_id en is_embedded_message():

#include <filesystem>
#include <fstream>
#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"));

    for (const auto& a : message.attachments())
    {
        std::cout << a.filename
                  << "  " << a.mime_type
                  << "  " << a.data.size() << " bytes"
                  << "  embedded=" << (a.is_embedded_message() ? "yes" : "no")
                  << '\n';

        if (!a.is_embedded_message())
        {
            std::ofstream out("extracted_" + a.filename, std::ios::binary);
            out.write(reinterpret_cast<const char*>(a.data.data()),
                      static_cast<std::streamsize>(a.data.size()));
        }
    }
}

Toegang tot ingesloten berichten

Wanneer is_embedded_message() is true, bevat de bijlage een ander MSG-bestand. Toegang daartoe via attachment.embedded_message:

#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"));

    for (const auto& a : message.attachments())
    {
        if (a.is_embedded_message() && a.embedded_message != nullptr)
        {
            const auto& inner = *a.embedded_message;
            std::cout << "Embedded subject: " << inner.subject() << '\n';
            inner.save(std::filesystem::path("embedded.msg"));
        }
    }
}

Tips en best practices

  • Geef altijd std::ios::binary door aan std::ifstream bij het laden van MSG-bestanden.
  • Controleer html_body() vóór body() — HTML-alleen berichten slaan hun inhoud op in de HTML body-eigenschap en laten body() leeg.
  • from_file() laadt alle bijlage-gegevens in het geheugen. Bij grote MSG-bestanden kun je overwegen de onderliggende container te openen met msg_reader om metadata te inspecteren zonder de bijlage-bytes volledig te materialiseren.
  • De strict-parameter van from_file(path, strict) en from_stream(stream, strict) standaard naar false, waarbij kleine structurele afwijkingen in MSG-bestanden uit de praktijk worden getolereerd.
  • Recipient-objecten bieden recipient_type om To-, Cc- en Bcc-items te onderscheiden.

Veelvoorkomende problemen

ProbleemOorzaakOplossing
msg_exception op een geldig ogend bestandBestand is geen echte OLE CFB-containerVerifieer met cfb_reader::from_file() — als het ook een fout geeft, is het bestand geen geldige MSG
body() retourneert een lege stringBericht gebruikt alleen HTML bodyGebruik html_body() in plaats daarvan
recipients() is leegOudere MSG zonder een ontvangerstabelToegang tot display_to via get_property_value() met common_message_property_id::display_to
Stream-corruptie op WindowsStream geopend zonder std::ios::binaryVoeg std::ios::binary-vlag toe aan std::ifstream
Hoge geheugengebruik voor grote bestandenAlle bijlagegegevens worden vooraf geladenGebruik msg_reader voor low-level toegang zonder volledige materialisatie

FAQ

Houdt from_file() de bestandshandle open?

Nee. Het bestand wordt geopend, volledig geparseerd en gesloten voordat de methode terugkeert. Je kunt het bronbestand verplaatsen of verwijderen nadat de oproep is voltooid.

Hoe kan ik zien of een bijlage een bestand is of een ingebedde MSG?

Roep attachment.is_embedded_message() aan. Retourneert true voor ingebedde MSG-bestanden; false voor reguliere bestandsbijlagen. Voor ingebedde berichten kun je het geneste object benaderen via attachment.embedded_message.

Wat is het verschil tussen from_file() en het gebruik van msg_reader?

mapi_message::from_file() is de high-level API — het parseert het volledige bericht en stelt eigenschappen beschikbaar als getypeerde velden. msg_reader is de low-level lezer die toegang geeft tot de ruwe CFB-containerstructuur en nuttig is wanneer je de berichtlay-out wilt inspecteren zonder alle MAPI-eigenschappen te parseren.

Worden Unicode- en ANSI-MSG-bestanden beide ondersteund?

Ja. mapi_message verwerkt zowel Unicode (eigenschapstype ptyp_string) als ANSI (ptyp_string8) tekenreeks-eigenschappen. unicode_strings() retourneert true voor berichten die zijn opgeslagen met Unicode-eigenschappen.


API Reference Samenvatting

Klasse / MethodeBeschrijving
mapi_message::from_file(path)Laad een MSG-bestand vanaf een std::filesystem::path
mapi_message::from_file(path, strict)Laad met de optie strikte modus
mapi_message::from_stream(stream)Laad MSG van een std::istream
mapi_message::from_stream(stream, strict)Laad van stream met strict mode-optie
mapi_message::subject()Retourneer de onderwerpstring van het bericht
mapi_message::body()Retourneer de plain-text body
mapi_message::html_body()Retourneer de HTML body (leeg als niet aanwezig)
mapi_message::sender_name()Retourneer de sender display name
mapi_message::sender_email_address()Retourneer het e-mailadres van de afzender
mapi_message::internet_message_id()Retourneer de RFC 2822 Message-ID-header
mapi_message::message_class()Retourneer de MAPI-berichtklasse-string
mapi_message::recipients()Retourneer de lijst met ontvangers
mapi_message::attachments()Geef de bijlagelijst terug
mapi_attachment::is_embedded_message()True als bijlage een ingebedde MSG is
mapi_message::unicode_strings()True als bericht Unicode-tekenreeks-eigenschappen gebruikt

Zie ook

 Nederlands