Omdannelse af EML og MSG

Omdannelse af EML og MSG

Aspose.Email FOSS for C++ converts bidirectionally between EML (RFC 5322 / MIME) og: MSG (Outlook MAPI) formater ved hjælp af mapi_message.Konverteringsbanen er: load_from_eml() → i-memori mapi_messagesave() for EML→MSG og from_file() / from_stream()save_to_eml() for MSG→EML.


Konvertere EML til MSG

Lade en EML-fil med mapi_message::load_from_eml(), der derefter serialiseres til MSG med 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() analyserer MIME-strukturen og fylder MAPI-objektet, almindelig tekst body, HTML-body, afsenderidentitet, modtagerliste og alle vedhæftede dele.


Konvertere MSG til EML

Lade en MSG-fil med mapi_message::from_file(),Så ring. 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";
}

Strømbaseret konvertering

Alle fire relevante metoder accepterer: std::istream / std::ostream overbelastning for Pipeline-formet behandling uden at berøre filsystemet:

#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);
}
  • Altid åbne strømme med… std::ios::binary.Tekst-mode strømme oversætte linjeendelser på Windows, der ødelægger binære CFB-data.

Omregning i hukommelse (byte)

save() og: save_to_eml() begge har nul-argument overbelastninger returnering std::vector<std::uint8_t>.Brug disse for at undgå alle ind- og udgangssystemer:

#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...
}

Batch-katalogkonvertering

Iterere en mappe med: std::filesystem::directory_iterator at konvertere alle .eml - Filer i ét kort:

#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';
    }
}

Tips og bedste praksis

  • Åbn alle filstrømme med: std::ios::binary både input og output.
  • Foretrækker load_from_eml(path) over strømmen overbelastning, når du har en sti; vejen Overbelastning håndterer filåbningen internt og er lidt enklere.
  • Brug byte overbelastninger (save() og: save_to_eml() uden arg) ved rørledning af data mellem tjenesterne for at undgå midlertidige filer.
  • Emne, body, HTML-body, afsender, modtagere og MIME vedhæftede filer bevares alle gennem den fulde rundrejse.
  • IMAP-flag, rutningshæders og TNEF-kodet indhold overføres ikke gennem konvertering.

Almindelige problemer

Udgave:Årsagen til detteForklaret
load_from_eml kasserer på en gyldig filIkke-CRLF linjeendinger i EMLSikre, at EML bruger RFC 5322 CRLF; nogle eksportværktøjer skriver bare LF
Fraværende vedhæftede dele efter EML → MSGIkke-standard MIME vedhæftede kodningVerificer EML-brug multipart/mixed med standard Content-Disposition: attachment
Tøm HTML-legemet efter MSG → EMLKilde MSG har kun almindelig tekst i kroppen.Kontrollering message.html_body();Hvis der er tale om en enkelt tekst, skal det være tilfældet med et andet ordsprog.
Strømudgang er korruptStrømmet åbnet i teksttilstandBrug altid: std::ios::binary
Emne viser ?= SekvenserRFC 2047 kodet ord i den oprindelige EMLDekode med et RFC 2047 bibliotek; biblioteket bevarer den kodede form.

FAQ

Bevarer EML → MSG HTML-legemet?

Ja, det er en. text/html MIME-delen er gemt i HTML’s body-egenskab og kan tilgås. via: message.html_body() efter indlæsning.

Er vedhæftninger bevaret i begge retninger?

Ja. Alle MIME-tilbehør dele er gennemført i den mapi_message liste over tilsluttede dokumenter. Binære vedhæftede data er tilgængelige som: attachment.data (a) std::vector<std::uint8_t>).

Kan jeg konvertere en enkelt EML til flere udgangsformater samtidigt?

Lad EML’en op med en gang. load_from_eml(),Så ring til begge to. save() og: save_to_eml() på samme in-memory mapi_message - Det er en genstand.

er: load_from_eml() - Trådsikker?

Hver samtale skaber en uafhængig mapi_message Der kan være flere tråde, der ringer til en ny enhed. load_from_eml() samtidig, så længe hver tråd bruger sit eget udgangsobjekt.

Hvad sker der med beskeder uden tekst?

Hvis EML kun indeholder en text/html del, message.body() returnerer en tom streng og: message.html_body() Begge dele er bevaret gennem MSG. Serialisering.


API-referenceoversigt

Klasse/metodeBeskrivelse:
mapi_message::load_from_eml(path)Analyser en EML-fil til et mapi_message
mapi_message::load_from_eml(stream)Analyser EML fra en std::istream
mapi_message::save(path)Serialisering mapi_message til en MSG-fil
mapi_message::save(stream)Skriv MSG-byte til en std::ostream
mapi_message::save()Tilbagefør MSG som: std::vector<std::uint8_t>
mapi_message::from_file(path)Lade en MSG-fil ind i et mapi_message
mapi_message::from_stream(stream)Last af MSG fra en std::istream
mapi_message::save_to_eml(path)Skriv EML til en filvej
mapi_message::save_to_eml(stream)Skriv EML-byte til en std::ostream
mapi_message::save_to_eml()Tilbagevis EML som: std::vector<std::uint8_t>
 Dansk