Читать файлы 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)Нагрузка МСГ с 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()Верно , если сообщение использует свойства струн Unicode .
 Русский