Четене на MSG файлове

Четене на MSG файлове

mapi_message е входната точка за зареждане и анализиране на Outlook MSG файлове. Един единствен Обади се на: from_file() или с други: from_stream() чете пълния CFB контейнер, извлича всички MAPI свойства, и ги излага чрез типизирани методи за достъп няма Outlook инсталация Необходими.


Зареждане от пътека на файл

Използване на: mapi_message::from_file() с а 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';
}

Заредени от поток

Използване на: mapi_message::from_stream() когато MSG данни пристигат от мрежов сокет, и архив или друг 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';
}

Винаги отваряй поток с: std::ios::binary.Текстови редове превод на линия Свършва на Windows и разгражда CFB контейнера.


Свойства на съобщенията за достъп

mapi_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"));

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

Итеративни получатели

message.recipients() връща a std::vector от получаващи обекти с display_name, email_address, и 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';
    }
}

Итеративни приложения

message.attachments() връща a std::vector Всяка от тях разкрива многобройни обекти. filename, mime_type, data, content_id, и 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()));
        }
    }
}

Достъп до вградени съобщения

Кога? is_embedded_message() е в: true, приложението съдържа друг файл MSG. Достъп до него чрез: 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"));
        }
    }
}

Съвети и най-добри практики

  • Винаги преминавам. std::ios::binary в) към std::ifstream при зареждане на файлове с MSG.
  • Проверка. html_body() преди това body() Съобщенията, съдържащи само HTML, съхраняват своето съдържание в системата за електронно съобщение. HTML имот на тялото и оставят body() Празно е.
  • from_file() За големи MSG файлове, помислете за: отваряне на подлежащата контейнер с: msg_reader да проверява метаданните без напълно материализиращи байтове за прикрепване.
  • Съветът на ЕС strict параметър на from_file(path, strict) и в) from_stream(stream, strict) Неизпълнение на изискванията за false, толериращи малки структурни отклонения в реални файлове на MSG.
  • Обществени обекти на получателя. recipient_type да се различават вписванията To, Cc и Bcc.

Общи проблеми

ИзданиеПричина за товаРемонтиране
msg_exception в файл с валиден видФайлът не е истински контейнер на OLE CFBПроверете с: cfb_reader::from_file() ако също хвърли, файлът не е валиден MSG.
body() връща празен редСъобщение използва само HTML корпусИзползване на: html_body() вместо това.
recipients() е празен.По-стари МСГ без таблица за получателиДостъп до информация display_to чрез: get_property_value() с: common_message_property_id::display_to
Поквара на потока в WindowsПоток отворен без std::ios::binaryДобавяне std::ios::binary Флаг към std::ifstream
Високо потребление на памет за големи файловеВсички данни за приложенията са заредени предварително.Използване на: msg_reader за достъп на ниско ниво без пълно материализиране

FAQ

- Да, нали? from_file() Да държим файловата дръжка отворена?

Не. Файлът се отваря, напълно анализира и затваря преди метода да бъде върнат. Можете да преместите или изтриете източния файл след обаждането.

Как да кажа дали приложеният файл е вграден или MSG?

Обади се. attachment.is_embedded_message().Връщане на парични средства true за вградени файлове на MSG; false за обичайни файлови приложения. За вградени съобщения, достъп до гнезден обект чрез: attachment.embedded_message.

Каква е разликата между: from_file() и използване на msg_reader?

mapi_message::from_file() е API на високо ниво разглежда цялото съобщение и излага свойствата като типизирани полета. msg_reader е читателят на ниско ниво, който дава достъп до структурата на суровия контейнер CFB и е полезен, когато трябва да инспектирате разпределение на съобщенията без анализиране на всички свойства MAPI.

Поддържат ли се файловете Unicode и ANSI MSG?

  • Да, много добре. mapi_message обработва както Unicode (тип на свойството ptyp_string) и ANSI (ptyp_string8) свойства на струните. unicode_strings() Доходи за отпускане на данъци true за съобщения съхранявани с свойства на Unicode.

Снимка на API референтна информация

Клас / методОписание на състоянието
mapi_message::from_file(path)Зареждане на MSG файл от std::filesystem::path
mapi_message::from_file(path, strict)Натоварване с опция строго режим
mapi_message::from_stream(stream)Натоварване на MSG от std::istream
mapi_message::from_stream(stream, strict)Натоварване от поток с опция строго режим
mapi_message::subject()Върнете поредицата на темата за съобщението
mapi_message::body()Връщане на тялото с обикновен текст
mapi_message::html_body()Връщане на HTML тялото (празно, ако не е налице)
mapi_message::sender_name()Връщане на името за показване на изпратителя
mapi_message::sender_email_address()Върнете адреса на изпращача.
mapi_message::internet_message_id()Връщане на заглавието RFC 2822 Message-ID
mapi_message::message_class()Връщане на MAPI класовия ред съобщения
mapi_message::recipients()Връщане на списъка с получателите
mapi_message::attachments()Връщане на списъка с приложения
mapi_attachment::is_embedded_message()Включено в системата за управление на емисиите (MSG)
mapi_message::unicode_strings()True ако съобщението използва Unicode string свойства
 Български