Как да превърнем EML в MSG в C++
Aspose.Email FOSS for C++ supports bidirectional conversion between EML (RFC 5322 / MIME и MSG (Outlook MAPI) формати. mapi_message::load_from_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.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(),След това серийно към 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";
}Пълен кръг (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() 0 аргументи за надтоварване, което се връща 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 ЕМЛ файлове, изнесени от някои инструменти могат да използват само LF. Библиотеката Очаква се стандартно-съответстващи линии завършвания.
Изчезнали приставки след EML → MSG конверсия. Потвърдете, че EML съдържа стандартни MIME multipart/mixed или multipart/related Връзка към изображенията.Inline images referenced чрез 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 библиотека Ако имате нужда от еднокодния предмет.
Често задавани въпроси
Съхраняват ли се прилозите и в двете посоки на конверсията?
И EML → MSG и MSM → EMR конвертират всички MIME приставки през 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 Пример – Вие Може да се обажда от няколко нива едновременно, докато всяка нишка използва своя собствена. Съобщение за обекта.