Преобразуване на 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_messagesave() за 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>
 Български