Wie Sie MSG-Dateien in C++ lesen können

Wie Sie MSG-Dateien in C++ lesen können

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Funktionellen Anrufen . mapi_message::from_file() und mapi_message::from_stream() Laden Sie die vollständige Nachricht – Gegenstand, Körper, Sender, Empfänger und Anhänge – in eine In-Memory Objekt ohne Outlook oder COM-Abhängigkeit.

Schritt 1 - Planen Sie das Projekt

Clone das Repository und füge es zu deinem 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)

Schritt 2 - Inkludieren Sie den Header

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

Dieser einzige Header bietet mapi_message und alle Unterstützungsarten in der aspose::email::foss::msg Name der Welt.


Schritt 3 - Laden Sie eine Nachricht aus einem Datei-Path herunter

Gebrauch mapi_message::from_file() Wenn Sie eine haben, 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';
}

Schritt 4 - Laden Sie eine Nachricht aus einem Stream herunter

Gebrauch mapi_message::from_stream() zu entziehen von jedem std::istream - nützlich für Verarbeitung von MSG-Daten über ein Netzwerk oder aus einem In-Memory Buffer:

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

Öffnen Sie immer den Strom mit std::ios::binary Verhindern Windows Line-End Übersetzung von Korruption des CFB-Kontakts.


Schritt 5 - Iterate-Rezeptoren

message.recipients() zurückkehren a std::vector von den Empfängern, jeder mit display_name, email_address,und recipient_type Die Felder:

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

Schritt 6 - Iterate Anlagen

message.attachments() zurückkehren a std::vector Anschluss an die Objekte. jede Anlage Exponate filename, mime_type, data (die Rohbiten sind, content_id,Und die is_embedded_message() und Predigt:

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

Häufige Probleme und Lösungen

leere body() nach dem Laden. Einige Nachrichten speichern Text nur im HTML-Bereich. Immobilien - Check message.html_body() Wenn message.body() Eine leere String zurückgibt.

Stream öffnet ohne std::ios::binary. Windows, Text-Modus Übersetzungen CRLF-Sekventionen, still korrupte binäre CFB-Daten. immer MSG-File mit std::ios::binary.

msg_exception Sie werden für eine gültige Datei gestohlen. Überprüfen Sie, ob die Datei ein echter MSG ist Dateien, die durch einige Export-Tools gespeichert werden, können einfacher Text oder MIME sein und nicht durchgeführt werden kann mapi_message::from_file().

recipients() Ein leeres Vektor zurückkehrt. Ältere MSG-Dateien verpassen manchmal den Empfänger Tabelle, aber Speicher-Demonstration Empfänger in der display_to MAPI Eigentum. Zugriff auf sie über message.get_property_value() mit common_message_property_id::display_to und property_type_code::ptyp_string.

Große Anlagendaten im Gedächtnis. Diemapi_message::from_file() und from_stream() laden Sie die gesamte Nachricht mit allen Bytes der Anlagen. Für große Dateien öffnen Sie den Konteiner mit msg_reader und überprüfen Sie die Anschlussströme ohne vollständig und sie materialisieren.

Häufig gestellte Fragen

Was ist der Unterschied zwischen from_file() und from_stream()?

Beide produzieren eine identische mapi_message Das Objekt. from_file() akzeptiert A std::filesystem::path und öffnet die Datei intern. from_stream() Lesen von Jeder std::istream Sie geben - nützlich, wenn die MSG-Daten bereits in der Speicher oder Über einen Socket zu kommen.

Das macht from_file() Halten Sie die Datei nach der Lade öffnet?

No. Die Datei wird geöffnet, vollständig in die Speicher vertrieben und vor dem Schließen from_file() Sie können die Quelldatei sofort nach der Anrufe vertreiben oder löschen.

Kann ich MSG-Dateien lesen, die von Outlook auf macOS oder Linux erstellt wurden?

Das MSG-Format (OLE Compound File + MAPI Properties) ist überall übertragenbar. Betriebssysteme - jeder .msg Dateien, die von jeder Version von Outlook erstellt werden können geöffnet werden. mit mapi_message::from_file().

Wie lese ich den HTML-Bereich?

Anruf message.html_body().Wenn die Nachricht nur mit einem reinen Text-Bereich erstellt wurde, Das bringt eine leere String zurück. message.body() Rückkehr des Plain-Text-Bereichs.

Ist die strikte Mode der Standard?

mapi_message::from_file(path, strict) und from_stream(stream, strict) Akzeptieren Sie eine Optional strict Boolean: Das Default ist false,die kleinere Strukturen toleriert Abweichungen in den MSG-Dateien der realen Welt.

Siehe auch

 Deutsch