Hur man läser MSG-filer i C++

Hur man läser MSG-filer i C++

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Funktionella samtal . mapi_message::from_file() och mapi_message::from_stream() Ladda den fullständig meddelande – ämne, kropp, sändebud, mottagare och bifogade - i ett in-minneslag Objekt med ingen Outlook eller COM beroende.

Steg 1 – Ställ in projektet

Klonera lagret och lägg till det i din 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)

Steg 2 – Inkludera header

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

Denna enda header ger mapi_message och alla stödjande typer i aspose::email::foss::msg Namn på plats.


Steg 3 – Ladda upp ett meddelande från en filvägen

Användning mapi_message::from_file() När du har en 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';
}

Steg 4 – Ladda upp ett meddelande från en ström

Användning mapi_message::from_stream() att ta sig ur någon std::istream - Användbar för bearbetning av MSG-data som erhålls via ett nätverk eller från en 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';
}

Öppna alltid strömmen med std::ios::binary För att förhindra Windows line-end översättning från korruption av CFB-behållaren.


Steg 5 – Iteratreceptorer

message.recipients() Återkommer A std::vector av mottagande föremål, var och en med display_name, email_address,och recipient_type Fält är:

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

Steg 6 – Iterate Anslutningar

message.attachments() Återkommer A std::vector av anslutningsobjekt. varje anslutning Exponeringar filename, mime_type, data (och de råa byterna), content_id,och den is_embedded_message() förutspådde:

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

Vanliga problem och fixar

tomt body() efter laddning. Vissa meddelanden lagrar text endast i HTML-kroppen Fastighet - kontrollera message.html_body() När message.body() återställer en tom sträng.

Stream öppnas utan std::ios::binary. På Windows, text-mode strömmar översätta CRLF sekvenser, tyst korrumperar binära CFB-data. alltid öppna MSG filer med std::ios::binary.

msg_exception kastas för en giltig-looking fil. Kontrollera att filen är en äkta MSG (OLE Compound File). filer som sparas av vissa exportverktyg kan vara platt text eller MIME och kan inte fördrivas av mapi_message::from_file().

recipients() återställer en tom vector. Äldre MSG-filer missar ibland mottagaren tabell men lagrar visar mottagare i display_to MAPI ägande. åtkomst till den via message.get_property_value() med common_message_property_id::display_to och property_type_code::ptyp_string.

Stora data i minnet. -här är detmapi_message::from_file() och from_stream() ladda hela meddelandet inklusive alla bifogade byter. För stora filer öppnar du Konteinern med underliggande msg_reader och inspektera anslutningsströmmar utan fullständig materialisera dem.

Ofta ställda frågor

Vad är skillnaden mellan from_file() och from_stream()?

Båda producerar en identisk mapi_message och objekt. from_file() accepterar A std::filesystem::path och öppnar filen intern. from_stream() Läs från Alla std::istream Du ger – användbar när MSG-data redan är i minnet eller Kommer över en socket.

Gör det from_file() Håll filen öppen efter laddning?

Filen öppnas, helt parsedd i minnet och stängd innan den är klar. from_file() Du kan flytta eller ta bort källfilen omedelbart efter samtalet.

Kan jag läsa MSG-filer som skapats av Outlook på macOS eller Linux?

Ja. MSG-formatet (OLE Compound File + MAPI-egenskaper) är överförbart mellan olika delar av Operativsystem - alla .msg filer som produceras av någon version av Outlook kan öppnas med mapi_message::from_file().

Hur läser jag HTML-kroppen?

Ringa till message.html_body().Om meddelandet skapades med endast en platt text kropp, Detta ger tillbaka en tom sträng. message.body() återvänder den platttextkroppen.

Är strikt läge standard?

mapi_message::from_file(path, strict) och from_stream(stream, strict) accepterar en Optionellt strict Booean. det är en default false,som tolererar mindre strukturella Avvikelser i verkliga MSG-filer.

Se även

 Svenska