Citirea fişierelor MSG

Citirea fişierelor MSG

mapi_message este punctul de intrare pentru încărcarea și analizarea fișierelor Outlook MSG. Un singur Apel la: from_file() sau de: from_stream() Citește întregul container CFB, extrage toate MAPI-urile. proprietăți, și le expune prin metode de accesori tipate nu Outlook instalație necesar.


Încărcare de pe o cale a fișierului

Utilizare: mapi_message::from_file() cu o 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';
}

Sarcina de la un flux

Utilizare: mapi_message::from_stream() atunci când datele MSG ajung de la un socket de rețea, o arhiva, sau orice alt 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';
}

Întotdeauna deschide fluxul cu: std::ios::binary. Fluxuri în mod text traduc linie Terminări pe Windows şi coruperea container CFB.


Proprietăți de accesare a mesajelor

mapi_message expune cele mai comune proprietăți de mesaj ca gettere denumite:

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

Recepționari iterați

message.recipients() returnează un std::vector de obiectele destinatarilor cu: display_name, email_address, și 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';
    }
}

Atasamente iterate

message.attachments() returnează un std::vector Fiecare expuse filename, mime_type, data, content_id, și 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()));
        }
    }
}

Acces la mesaje încorporate

Când ? is_embedded_message() este: true, anexa conține un alt fișier MSG. Accesul prin: 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"));
        }
    }
}

Sfaturi şi cele mai bune practici

  • Întotdeauna treci. std::ios::binary la … în std::ifstream la încărcarea fișierelor MSG.
  • Verifică. html_body() înainte de body() Mesajele numai HTML îşi stochează conţinutul în sistemul de date. Proprietatea corpului HTML și lasă-l să plece body() E goală.
  • from_file() Pentru fişiere MSG mari, ia în considerare: deschiderea recipientului de la bază cu: msg_reader să inspecteze metadatele fără a le verifica pe deplin; materializarea baiti de atașament.
  • În ceea ce priveşte strict parametru de from_file(path, strict) și de: from_stream(stream, strict) încadrări la false, care tolerează abateri structurale minore în fișiere MSG reale.
  • Obiecte de primire expune recipient_type pentru a distinge articolele To, Cc și Bcc.

Probleme comune

Numărul de dateCauzaFixare
msg_exception pe un fișier care arată validFișierul nu este un container OLE CFB autenticVerificaţi cu: cfb_reader::from_file() dacă arunca, fişierul nu este un MSG valabil.
body() returnă o șiră goală.Mesajul folosește doar corpul HTMLUtilizare: html_body() în schimbul
recipients() este goală.GMS mai vechi fără tabel de recepțieAccesul display_to prin intermediul get_property_value() cu: common_message_property_id::display_to
Corupție de flux pe WindowsCurent deschis fără std::ios::binaryAdăugați std::ios::binary Pavilionul către std::ifstream
Utilizare mare a memoriei pentru fișiere mariToate datele atașate sunt încărcate în avans.Utilizare: msg_reader pentru acces la nivel scăzut fără materializare completă

FAQ

- Da. Nu, nu e aşa. from_file() Să ţin dosarul deschis?

Nu. Fișierul este deschis, complet analizat și închis înainte ca metoda să se întoarcă. Puteți muta sau șterge fișierul sursă după apel.

Cum pot să spun dacă un atașament este un fișier sau o MSG încorporată?

Sună-mă. attachment.is_embedded_message().Retourări true pentru fișierele integrate de MSG; false Pentru mesaje încorporate, accesați obiectul nestat. prin intermediul attachment.embedded_message.

Care este diferenţa între: from_file() și folosirea msg_reader?

mapi_message::from_file() este API de nivel înalt parsează întregul mesaj și expune proprietățile ca câmpuri tipate. msg_reader este cititorul de nivel scăzut care dă acces la structura de recipient CFB brut și este util atunci când aveți nevoie pentru a inspecta Mesajul de layout fără parsing toate proprietățile MAPI.

Fișierele Unicode și ANSI MSG sunt suportate?

  • Da, am fost. mapi_message se ocupă atât Unicode (tip de proprietate ptyp_string) și ANSI (ptyp_string8) proprietăți de șir. unicode_strings() rambursări true pentru mesaje stocate cu proprietăți Unicode.

Rezultatele de la data aplicării.

Clasa / metodaDescriere:
mapi_message::from_file(path)Încărcați un fișier MSG de la o std::filesystem::path
mapi_message::from_file(path, strict)Sarcină cu opțiunea de mod strict
mapi_message::from_stream(stream)Încărcătura de MSG din un std::istream
mapi_message::from_stream(stream, strict)Sarcina de la flux cu opțiunea strictă mod
mapi_message::subject()Întoarce șirul de subiect al mesajului
mapi_message::body()Întoarce corpul textului simplu
mapi_message::html_body()Întoarce corpul HTML (goală dacă nu este prezentă)
mapi_message::sender_name()Întoarce numele de afișare al expeditorului
mapi_message::sender_email_address()Întoarce adresa de e-mail a expeditorului
mapi_message::internet_message_id()Întoarceți știrul RFC 2822 de mesaj-ID
mapi_message::message_class()Întoarce șirul de mesaje MAPI
mapi_message::recipients()Întoarce lista de destinatar
mapi_message::attachments()Întoarce lista atașamentelor
mapi_attachment::is_embedded_message()Adevărat dacă atașamentul este un MSG încorporat.
mapi_message::unicode_strings()E adevărat dacă mesajul folosește proprietăți de șir Unicode
 Română