Как конвертировать 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.gitadd_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 Вы - вы можно вызывать его из нескольких нитей одновременно, пока каждый ниток использует свою собственную Объективное сообщение .