Lesen Sie MSG-Dateien

Lesen Sie MSG-Dateien

mapi_message ist der Eingangspunkt für die Laden und Parschaft von Outlook MSG-Dateien. rufen Sie zu from_file() oder from_stream() Lesen Sie den vollständigen CFB-Kontaktor, extrahieren Sie alle MAPI Eigenschaften und zeigt sie durch typed accessor methods — keine Outlook-installation erforderlich ist.


Laden von einem Dateiweg

Gebrauch mapi_message::from_file() Mit A 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';
}

Kann ich von einem Stream laden?

Gebrauch mapi_message::from_stream() Wenn MSG-Daten aus einem Netzwerk-Socket kommen, wird eine Archiv oder irgendwelche 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';
}

Öffnen Sie immer den Strom mit std::ios::binary.Text-Mode Streams Übersetzungslinie Enden Sie Windows und verstößt den CFB-Kontaktor.


Zugang zu Messaging-Eigenschaften

mapi_message Er zeigt die häufigsten Nachrichtseigenschaften wie sogenannte Gitter:

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

Iterate Empfänger

message.recipients() zurückkehren a std::vector Gegenstände mit Empfänger display_name, email_address,und 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';
    }
}

Iterate Anlagen

message.attachments() zurückkehren a std::vector Einige Objekte - jede Exposition filename, mime_type, data, content_id,und 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()));
        }
    }
}

Zugang zu eingebetteten Nachrichten

Wann is_embedded_message() ist true, die Anlage enthält eine weitere MSG-Datei. Zugang durch 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"));
        }
    }
}

Tipps und beste Praktiken

  • immer durch std::ios::binary zu std::ifstream bei der Laden von MSG-Dateien.
  • Check html_body() vor body() - HTML-Nachrichten speichern ihre Inhalte in HTML Körper Eigentum und Verlassen body() und leeren.
  • from_file() laden alle Anlagendaten in die Speicher. Für große MSG-Dateien, berücksichtigen Sie Öffnen des Unterkonteners mit msg_reader Metadaten ohne vollständige Überprüfung Materialisierung von Bytes.
  • Die strict Parameter von from_file(path, strict) und from_stream(stream, strict) Default zu false, die kleinere strukturelle Abweichungen in den MSG-Dateien in der Realität tolerieren.
  • Empfangsobjekte exponieren recipient_type Zu unterscheiden To, Cc und Bcc Beiträge.

Gemeinsame Probleme

ThemaUrsacheFix
msg_exception auf einer gültigen DateiDatei ist kein authentisches OLE CFB-KontaktorÜberprüfen Sie mit cfb_reader::from_file() - wenn es auch ablässt, ist die Datei nicht ein gültiger MSG
body() Rückkehr der leeren StringNachrichten verwenden nur HTML-BereichGebrauch html_body() Stattdessen
recipients() ist leerMSG ohne EmpfängerZugang display_to über get_property_value() mit common_message_property_id::display_to
Stream Korruption auf WindowsStream öffnet ohne std::ios::binaryAdd zu std::ios::binary Flagge zu std::ifstream
Hocher Speicherverbrauch für große DateienAlle Anlagendaten werden vorne geladenGebrauch msg_reader für niedrige Zugangslive ohne vollständige Materialisierung

FAQ

Das macht from_file() Halten Sie die Datei offen?

No. Die Datei wird geöffnet, vollständig verstopft und geschlossen, bevor die Methode zurückkehrt. Sie können die Quelldatei nach der Anruf verplaufen oder löschen.

Wie kann ich sagen, ob ein Anschluss eine Datei oder ein integriertes MSG ist?

Anruf attachment.is_embedded_message().Rückkehr true für integrierte MSG-Dateien; false für regelmäßige Dateiangänge. Für eingebettete Nachrichten, den Nested Object zugreifen über attachment.embedded_message.

Was ist der Unterschied zwischen from_file() und benutzen msg_reader?

mapi_message::from_file() ist die hochwertige API — sie verbreitet die volle Nachricht und Er zeigt Eigenschaften wie Typfelder. msg_reader Der niedrigste Leser, der Zugang zur Rohkonteinstruktur von CFB und ist nützlich, wenn Sie überprüfen müssen Message-Layout ohne alle MAPI-Eigenschaften zu verlieren.

Sind Unicode und ANSI MSG Dateien beide unterstützt?

Ja ja. mapi_message Beide Unicode (Eigentyp) ptyp_stringund ANSI (ptyp_string8String Eigenschaften. unicode_strings() Rückkehr true für Nachrichten mit Unicode Eigenschaften gespeichert.


API Referenzabschnitt

Klasse / MethodeBeschreibung
mapi_message::from_file(path)Laden Sie eine MSG-Datei von einem std::filesystem::path
mapi_message::from_file(path, strict)Laden mit strengen Modus Option
mapi_message::from_stream(stream)Laden Sie MSG von einem std::istream
mapi_message::from_stream(stream, strict)Laden von Stream mit strengen Modus Option
mapi_message::subject()Rückkehr der Nachricht Subject String
mapi_message::body()Rückkehr zum Plain-Text-Bereich
mapi_message::html_body()Rückkehr des HTML-Bereichs (mit Freiheit, wenn nicht vorhanden)
mapi_message::sender_name()Rückgabe des Senders Display Name
mapi_message::sender_email_address()Rückkehr der Sender E-Mail-Adresse
mapi_message::internet_message_id()RFC 2822 Message-ID Header zurück
mapi_message::message_class()Zurück zur MAPI-Message-Klasse
mapi_message::recipients()Rückkehr der Empfängerliste
mapi_message::attachments()Rückkehr der Anlageliste
mapi_attachment::is_embedded_message()Genau, wenn das Anschluss ein integriertes MSG ist
mapi_message::unicode_strings()Genau, wenn die Nachricht Unicode-Stirn-Eigenschaften verwendet
 Deutsch