Преобразуване на 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-телото, изпращачът и получателите са запазени през пълното завъртане.
- 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 и е достъпна. чрез: 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() И двете са запазени чрез 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() | Връщане на MSG като: std::vector<std::uint8_t> |
mapi_message::from_file(path) | Зареждане на файл MSG в mapi_message |
mapi_message::from_stream(stream) | Натоварване на MSG от 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> |