Čtení souborů MSG

Čtení souborů MSG

mapi_message je vstupní bod pro načtení a analýzu souborů Outlook MSG. Jediný Zavolej na: from_file() nebo: from_stream() čte celý CFB kontejner, extrahuje všechny MAPI vlastnosti, a vystavuje je pomocí typovaných přístupových metod žádná instalace programu Outlook je to nutné.


Naložení ze cesty souboru

Použití: mapi_message::from_file() s výjimkou: 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';
}

Náklad z proudu

Použití: mapi_message::from_stream() při příjezdu dat MSG z síťového zásuvku, a archiv, nebo jakékoli jiné 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';
}

Vždy otevřete proud s std::ios::binary. Textové toky překládání řádku Konečky na Windows a poškodit CFB kontejner.


Vlastnosti přístupu k zprávám

mapi_message odhaluje nejčastější vlastnosti zpráv jako jmenované gettery:

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

Iterované příjemce

message.recipients() vrací a std::vector Objekty příjemce s display_name, email_address,a) 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';
    }
}

Iterované přílohy

message.attachments() vrací a std::vector Každá z nich odhaluje, že se objevily další důkazy. filename, mime_type, data, content_id,a) 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()));
        }
    }
}

Přístup k vestavěným zprávám

Kdy? is_embedded_message() je: true, příloha obsahuje další soubor MSG. Přístup přes: 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"));
        }
    }
}

Tipy a nejlepší postupy

  • Vždycky projít. std::ios::binary na … std::ifstream při načítání souborů s MSG.
  • Ček. html_body() předchozí body() Zprávy pouze s HTML ukládají svůj obsah v systému. HTML body vlastnost a odchod body() prázdný.
  • from_file() Pro velké soubory MSG zvažte: otevření podkladového obalu s msg_reader pro kontrolu metadát bez úplného materializace bajtů připojených.
  • Úřad pro bezpečnost a ochranu zdraví strict parametry: from_file(path, strict) a) from_stream(stream, strict) Způsoby, které jsou v rozporu s false, které tolerují menší strukturální odchylky v reálných souborech MSG.
  • Objekty příjemce odhalí recipient_type rozlišovat údaje To, Cc a Bcc.

Obvyklé problémy

Výše:Příčina:Opravy
msg_exception na platně vypadající souborSoubor není originální kontejner OLE CFB .Ověřte se cfb_reader::from_file() pokud také hodí, soubor není platný MSG
body() vrací prázdný řetězZpráva používá pouze HTML těloPoužití: html_body() místo toho …
recipients() je prázdný.Starší MSG bez tabulky příjemcůPřístup display_to přes: get_property_value() s: common_message_property_id::display_to
Zkažení přenosu na WindowsProud otevřen bez: std::ios::binaryPřidání: std::ios::binary Vlajka na: std::ifstream
Vysoká spotřeba paměti pro velké souboryVšechny údaje o přílohách jsou načteny předem.Použití: msg_reader pro přístup na nízké úrovni bez plného zpracování

FAQ

- Ano. from_file() - Nechat otevřené držadlo souboru?

Ne. Soubor je otevřen, zcela analyzován a uzavřený před návratem metody. Můžete přesunout nebo odstranit zdrojový soubor po volání.

Jak poznám, jestli je příloha soubor nebo vestavěný MSG?

Zavolej . attachment.is_embedded_message().- Vrátky . true pro vložené soubory MSG; false pro běžné soubory připojené. Pro vložené zprávy, přístup k vestavěnému objektu přes: attachment.embedded_message.

Jaký je rozdíl mezi from_file() a používání: msg_reader?

mapi_message::from_file() je high-level API analyzuje celou zprávu a odhalí vlastnosti jako typované pole. msg_reader je nízkonávěrný čteč, který dává přístup k surové konstrukci kontejneru CFB a je užitečný, když potřebujete zkontrolovat rozložení zprávy bez analýzy všech vlastností MAPI.

Jsou soubory Unicode a ANSI MSG podporovány?

  • Ano, jsem. mapi_message Obsahuje jak Unicode (typ vlastností ptyp_string) a ANSI (ptyp_string8) vlastností řetězců. unicode_strings() výnosy true pro zprávy uložené s vlastnostmi Unicodu.

Souhrnná referenční informace API

Třída / metodaPopis:
mapi_message::from_file(path)Naložit soubor MSG z std::filesystem::path
mapi_message::from_file(path, strict)Náklad s možností přísného režimu
mapi_message::from_stream(stream)Náklad MSG z std::istream
mapi_message::from_stream(stream, strict)Náklad z proudu s volbou přísného režimu
mapi_message::subject()Vrátit řetězce předmětu zprávy .
mapi_message::body()Vrátit textový materiál
mapi_message::html_body()Zpětná položka (nejsou-li obsažena)
mapi_message::sender_name()Zpětný název odesílatele
mapi_message::sender_email_address()Zpětná adresa odesílatele .
mapi_message::internet_message_id()Vrátit název RFC 2822 ID zprávy
mapi_message::message_class()Vrátit řetěz třídy MAPI zprávy
mapi_message::recipients()Vrátit seznam příjemců
mapi_message::attachments()Vrátit seznam přidělených položek .
mapi_attachment::is_embedded_message()Pravda, pokud je připojený vestavěný MSG.
mapi_message::unicode_strings()Pravda , pokud zpráva používá vlastnosti řetězců Unicodu .
 Čeština