Як перетворити 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() Імпортувати а EML файли, потім 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 (File Path)

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 (Stream)

Використовуйте потоки перевантаження 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(), а потім серіалізувати в EML Формат з 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() Завантажити файли на EML. Перевірка файлу використовує RFC 5322 CRLF кінцівки лінії. EML файли, експортовані деякими інструментами можуть використовувати голу LF. Бібліотека Очікується, що закінчуються стандартні лінії.

Відсутні прикмети після EML → MSG конвертації. Підтвердити 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.

Тема містить ?= Кодирування артефактів . RFC 2047 - кодовані послідовності слів в оригінальному EML. Бібліотека зберігає їх як-це. декоди з RFC 2047 бібліотеки Якщо вам потрібен Unicode.

Часті запитання

Чи зберігаються прикріплення в обох напрямках конверсії?

Як EML → MSG і MS G → EM L перетворення несуть всі MIME додаток через mapi_message Список прикметників.Бінарні додавання представлені як сирі байти в mapi_attachment::data.

Чи EML → MSG зберегти HTML тіло?

Якщо EML містить a 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 Ви – ви Можна викликати його з декількох ниток одночасно, якщо кожен із них використовує свою власну. Повідомлення об’єкта.

Це також

 Українська