Преобразование EML и MSG

Преобразование EML и MSG

Aspose.Email FOSS for C++ converts bidirectionally between EML (RFC 5322 / MIME) и в том числе: MSG (Outlook MAPI) формат с использованием mapi_message.Путь преобразования: load_from_eml() → в памяти mapi_messagesave() для EML→MSG, и from_file() / from_stream()save_to_eml() для MSG→EML.


Преобразовать EML в MSG

Загрузить файл EML с помощью: mapi_message::load_from_eml(), затем сериализировать на MSG с save():

#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';
    message.save(std::filesystem::path("converted.msg"));
    std::cout << "Saved converted.msg\n";
}

load_from_eml() анализирует структуру MIME и заполняет объект MAPI, простой текст. body, HTML body , идентификатор отправителя, список получателей и все части приложений.


Преобразовать 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";
}

Преобразование на основе потока

Все четыре соответствующих метода принимают: std::istream / std::ostream перегрузки для: обработка в виде трубопровода без прикосновения к файловой системе:

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

int main()
{
    // EML → MSG via streams
    std::ifstream eml_in("message.eml", std::ios::binary);
    const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(eml_in);

    std::ofstream msg_out("converted.msg", std::ios::binary);
    message.save(msg_out);

    // MSG → EML via streams
    std::ifstream msg_in("converted.msg", std::ios::binary);
    const auto reloaded = aspose::email::foss::msg::mapi_message::from_stream(msg_in);

    std::ofstream eml_out("roundtrip.eml", std::ios::binary);
    reloaded.save_to_eml(eml_out);
}

Всегда открывать потоки с std::ios::binary.Текстовые потоки переводят окончания строк . на Windows, повреждая данные CFB.


Конверсия в памяти (байты)

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

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

    const std::vector<std::uint8_t> msg_bytes  = message.save();
    const std::vector<std::uint8_t> eml_bytes  = message.save_to_eml();

    // Write to a database, network socket, or other destination...
}

Перевод пакетной каталоги

Итерация каталога с: std::filesystem::directory_iterator преобразовать все .eml Файлы в один проход:

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

int main()
{
    const std::filesystem::path input_dir("emails/eml");
    const std::filesystem::path output_dir("emails/msg");
    std::filesystem::create_directories(output_dir);

    for (const auto& entry : std::filesystem::directory_iterator(input_dir))
    {
        if (entry.path().extension() != ".eml")
            continue;

        const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(
            entry.path());

        auto out_path = output_dir / entry.path().filename();
        out_path.replace_extension(".msg");
        message.save(out_path);

        std::cout << "Converted: " << entry.path().filename() << '\n';
    }
}

Советы и лучшие практики

  • Открыть все файлы с помощью: std::ios::binary как входные, так и выходные.
  • Предпочтительнее load_from_eml(path) по потоку перегрузки, когда у вас есть путь; путь Перегрузка обрабатывает открытие файлов внутренне и немного проще.
  • Используйте перегрузки байтов (save() и в том числе: save_to_eml() без арг) при передаче данных по трубопроводам. между службами, чтобы избежать временных файлов.
  • Субъект, тело, HTML-тело, отправитель, получатели и MIME приложения сохраняются в течение полного кругового перехода.
  • Знаки IMAP, заголовки маршрутизации и содержание с кодировкой TNEF не переносятся в процессе конверсии.

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

ВыпускПричина .Устранить
load_from_eml запускает действительный файлКончики линии, не относящиеся к CRLF в EMLУбедитесь, что EML использует RFC 5322 CRLF; некоторые инструменты экспорта пишут голую LF.
Отсутствуют приложения после EML → MSG.Нестандартное кодирование MIME-приложенияПроверка использования EML multipart/mixed с стандартным Content-Disposition: attachment
Пустое тело HTML после MSG → EMLИсточник MSG имеет только простой текст.Проверка . message.html_body(); если это пусто, то хранился только простой текст.
Выход потока поврежден .Открытие потока в текстовом режимеВсегда используйте: std::ios::binary
Тематические шоу. ?= последовательностиRFC 2047 кодированное слово в оригинальном EMLДекодировать с библиотекой RFC 2047; библиотека сохраняет закодированную форму.

FAQ

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

Да, А. text/html Часть MIME хранится в собственности тела HTML MAPI и доступна. через: message.html_body() после загрузки.

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

Да. Все части MIME-прикрепления проходят через mapi_message список прикреплений. Данные бинарного приложения доступны как: attachment.data (а) std::vector<std::uint8_t>).

Могу ли я одновременно преобразовать одну EML в несколько формат вывода?

Загрузить ЭМЛ один раз с помощью load_from_eml(), тогда позвоните обоим . save() и в том числе: save_to_eml() на одной и той же памяти mapi_message Объект.

- Это … load_from_eml() - Безопасно?

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

Что происходит с сообщениями без простого текста?

Если EML содержит только: text/html часть, message.body() возвращает пустую строку. и в том числе: message.html_body() Содержит HTML-контент. Оба сохранены через MSG сериализация.


Справочное резюме API

Класс / методОписание:
mapi_message::load_from_eml(path)Проанализировать файл EML в mapi_message
mapi_message::load_from_eml(stream)Проанализировать EML из std::istream
mapi_message::save(path)Сериализация mapi_message в файл MSG.
mapi_message::save(stream)Написать байты MSG на std::ostream
mapi_message::save()Возвращение МСГ в виде: std::vector<std::uint8_t>
mapi_message::from_file(path)Загрузить файл MSG в mapi_message
mapi_message::from_stream(stream)Нагрузка МСГ с std::istream
mapi_message::save_to_eml(path)Написать EML на путь файла
mapi_message::save_to_eml(stream)Написать байты EML на std::ostream
mapi_message::save_to_eml()Возвращение EML как: std::vector<std::uint8_t>
 Русский