Как конвертировать EML в MSG с помощью C++

Как конвертировать EML в MSG с помощью C++

Aspose.Email FOSS for C++ supports bidirectional conversion between EML (RFC 5322 / В этом случае, если вы хотите использовать формат MIME) и MSG (Outlook MAPI). mapi_message::load_from_eml() Импортировать 1 файла, а затем mapi_message::save() писать его как MSG — и наоборот с mapi_message::from_file() Следует от mapi_message::save_to_eml().

Шаг 1 — Составление проекта

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)

Шаг 2 — Конвертировать EML в MSG (Путь файла)

mapi_message::load_from_eml() анализирует файл EML и раскрывает его свойства через Стандартный mapi_message Интерфейс - звонок save() Чтобы записать результат как MSG:

#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(
        std::filesystem::path("message.eml"));

    std::cout << "Subject: " << message.subject() << '\n';
    std::cout << "From:    " << message.sender_email_address() << '\n';

    message.save(std::filesystem::path("converted.msg"));
    std::cout << "Saved converted.msg\n";
}

Шаг 3 — Конвертировать EML в MSG (Потоки)

Используйте потоки перегрузки load_from_eml() когда данные EML поступают из сети разъем, буфер памяти или другой std::istream:

#include <fstream>
#include <filesystem>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream eml_stream("message.eml", std::ios::binary);
    const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(eml_stream);

    message.save(std::filesystem::path("converted.msg"));
}

Шаг 4 — Конвертировать MSG в EML

Загрузить существующий файл MSG с помощью mapi_message::from_file(),После этого сериализируйте его. Формат с save_to_eml():

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

    message.save_to_eml(std::filesystem::path("exported.eml"));
    std::cout << "Saved exported.eml\n";
}

Шаг 5 — Полный круглый тур (EML → MSG→ EML)

Следующий пример показывает, что субъект, тело, отправитель, получатель и приложение сохраняются в течение полного кругохода:

#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto msg_path = std::filesystem::path("roundtrip.msg");
    const auto eml_out  = std::filesystem::path("roundtrip.eml");

    // EML → MSG
    auto message = aspose::email::foss::msg::mapi_message::load_from_eml(
        std::filesystem::path("original.eml"));
    message.save(msg_path);

    // MSG → EML
    auto reloaded = aspose::email::foss::msg::mapi_message::from_file(msg_path);
    reloaded.save_to_eml(eml_out);

    std::cout << "Subject preserved: " << reloaded.subject() << '\n';
    std::cout << "Attachments: " << reloaded.attachments().size() << '\n';
}

Шаг 6 — Конвертировать в EML байты в памяти

Оба save() и save_to_eml() имеют нулевые перегрузки аргументов, которые возвращаются std::vector<std::uint8_t>, полезный для потокового результатов к сетевому соединению или База данных без прикосновения к файловой системе:

#include <filesystem>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(
        std::filesystem::path("message.eml"));

    // In-memory MSG bytes
    const auto msg_bytes = message.save();

    // In-memory EML bytes
    const auto eml_bytes = message.save_to_eml();
}

Общие проблемы и решения

load_from_eml() Взгляните на файл с валидным внешним видом. Проверьте использование файла RFC 5322 EML файлы, экспортируемые некоторыми инструментами, могут использовать простой LF. Библиотека Ожидается, что линии будут заканчиваться в соответствии со стандартами.

Недостающие приложения после конверсии. Подтвердить, что EML содержит стандартный MIME multipart/mixed или multipart/related Прикрепленные части. Внутри изображения ссылаются Via cid: Они являются приложением к MSG и должны присутствовать.

HTML тело потеряно после MSG → EML. HTML-контент сохраняется в ходе круглой поездки. Когда message.html_body() Не пусто, если только message.body() Населением в источник MSG, в EML будет содержаться только часть простого текста.

save_to_eml() Выход потока пустой. Открытый выход потоков с std::ios::binary.Потоки текстового режима коррумпируют структуру MIME в Windows.

Тема содержит ?= Кодирование артефактов . Это 2047 кодированных слов последовательности. В оригинале EML. Библиотека сохраняет их как-то. декодировать с RFC 2047 библиотекой Если вам нужен простой Unicode-тема.

Часто задаваемые вопросы

Сохраняются ли приложения в обоих направлениях конверсии?

И в обоих случаях, и в других случаях – все переходы через приставку. mapi_message списка приложений. бинарные приложения представлены в виде сырых байтов в mapi_attachment::data.

Сохраняет ли EML → MSG HTML тело?

Если в EML содержится text/html MIME часть, она хранится в HTML-корпусе MAPI собственности и возвращенные им message.html_body() После загрузки.

Могу ли я перевести партию в каталог файлов EML?

Да. Итерируйте директорию с std::filesystem::directory_iterator и звонок mapi_message::load_from_eml() На каждом .eml Путь, а потом спасение save():

#include <filesystem>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    for (const auto& entry : std::filesystem::directory_iterator("emails/"))
    {
        if (entry.path().extension() == ".eml")
        {
            auto msg = aspose::email::foss::msg::mapi_message::load_from_eml(entry.path());
            auto out = entry.path();
            out.replace_extension(".msg");
            msg.save(out);
        }
    }
}

Что сохраняется во время конверсии EML ↔ MSG?

Тема, тело в простом тексте, HTML-код, имя отправителя и адрес электронной почты, список получателей и все MIME приложения. IMAP флаги, рутинные заголовки за пределами основных транспортных заголовиков и данные, кодированные TNEF, не сохраняются.

И есть load_from_eml() Трейдеры в безопасности?

Каждый звонок к load_from_eml() Создает независимую mapi_message Вы - вы можно вызывать его из нескольких нитей одновременно, пока каждый ниток использует свою собственную Объективное сообщение .

Это тоже

 Русский