Как да превърнем EML в MSG в C++

Как да превърнем 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.git
add_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 Пример – Вие Може да се обажда от няколко нива едновременно, докато всяка нишка използва своя собствена. Съобщение за обекта.

Виж също

 Български