Преобразование 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_message → save() для 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> |