Conversió de LME i MSG

Conversió de LME i MSG

Aspose.Email FOSS for C++ converts bidirectionally between EML (RFC 5322 / MIME) i de la MSG (Outlook MAPI) formats utilitzant mapi_message.La ruta de conversió és: load_from_eml() → en memòria mapi_messagesave() per EML→MSG, i from_file() / from_stream()save_to_eml() per MSG→EML.


Converteix EML en MSG

Carregar un fitxer EML amb: mapi_message::load_from_eml(), després serialitzar a MSG amb 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() analisa l’estructura MIME i omplea el subjecte de MAPI, text sencer. cos, HTML body, identitat del remitent, llista de destinataris i totes les parts d’anunci.


Converteix MSG en EML

Carregar un fitxer MSG amb mapi_message::from_file(), llavors trucar 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";
}

Conversió basada en flux

Tots els quatre mètodes pertinents accepten: std::istream / std::ostream sobrecarrega per a: Processament de tipus pipeline sense tocar el sistema de fitxers:

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

Sempre en un flux obert amb std::ios::binary. Els flux de text traduir els finals de línia en Windows, corrompt dades CFB binàries.


Conversió en memòria (Bytes)

save() i de la save_to_eml() ambdues tenen sobrecarres d’argument zero que retornen: std::vector<std::uint8_t>.Utilitza-les per evitar totes les entrades i sortides del sistema de fitxers:

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

Conversió de directori per batxeres

Iterar un directori amb: std::filesystem::directory_iterator Convertir tots els .eml Arxius en un pas:

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

Consells i millors pràctiques

  • Obrir tots els flux de fitxers amb: std::ios::binary tant la entrada com l’exportació.
  • Preferir load_from_eml(path) sobre la sobretaxa de corrent quan tens un camí; el camí La sobrecarrega gestiona l’obertura de fitxers internament i és una mica més senzilla.
  • Utilitzar els bytes de sobrecarrega (save() i de la save_to_eml() sense args) quan es fa la canonada de dades. entre serveis per evitar arxius temporals.
  • El subjecte, el cos, HTML, remitent, destinatari i MIME s’han preservat durant tot el viatge.
  • Les banderes IMAP, els encabezaments d’enrutament i el contingut codificat per TNEF no es transfereixen a través de la conversió.

Problemàtiques comuns

EdicióCausaCorrecció
load_from_eml llança un fitxer vàlidTerminals de línia no CRLF en EMLAssegurar que EML utilitzi RFC 5322 CRLF; algunes eines d’exportació escriuen LF en blanc
Falta d’apadhs després de LME → MSGEncodatge no estàndard de l’apunt MIMEVerificar els usos de l’EML multipart/mixed amb norma Content-Disposition: attachment
Empatit cos HTML després de MSG → EMLFonte MSG té només text en format sencer.Compte de pagament message.html_body(); si està buit, només s’ha emmagatzemat text en format ordinari.
La sortida de flux està corrompuda.Stream obert en mode de textUtilitzar sempre: std::ios::binary
Espectacles de temes ?= seqüènciesRFC 2047 codificada-palabra en EML originalDecodificar amb una biblioteca RFC 2047; la biblioteca conserva el formulari codificat.

FAQ

L’EML → MSG conserva el cos HTML?

Sí, una. text/html La part MIME s’emmagatzema en la propietat de cos HTML del MAPI i és accessible. per mitjà de: message.html_body() després de la càrrega.

Els ataixaments es conserven en les dues direccions?

Sí. Totes les parts de l’acoplament MIME es transporten a través del sistema d’enllaç Mime i la seva part posterior s’ha de fer circular per un canal de sortida. mapi_message llista de lligats. Les dades de l’apunt binari estan disponibles com a: attachment.data (a) std::vector<std::uint8_t>).

Puc convertir un sol EML en múltiples formats de sortida simultàniament?

Si, carrega l’EML una vegada amb load_from_eml(), llavors crida’ls a tots dos . save() i de la save_to_eml() en la mateixa memòria interna. mapi_message objecte.

És load_from_eml() Segur per a fil?

Cada trucada crea un independent mapi_message Instança. Molts fils poden cridar a la pàgina de l’exemple. load_from_eml() simultàniament sempre que cada fil utilitzi el seu propi objecte de sortida.

Què passa amb els missatges sense text sencer?

Si l’EML conté només una text/html part, message.body() Retorna una cadena buida. i de la message.html_body() amb el contingut HTML. Ambdues estan conservades a través de MSG serialització.


Resum de referència d’API

Classe / mètodeDescripció
mapi_message::load_from_eml(path)Anàlisi d’un fitxer EML en un mapi_message
mapi_message::load_from_eml(stream)Anàlisi EML d’un std::istream
mapi_message::save(path)Serialitzar mapi_message a un fitxer de MSG.
mapi_message::save(stream)Escriure bytes de MSG a un std::ostream
mapi_message::save()Retorna el GMS com a: std::vector<std::uint8_t>
mapi_message::from_file(path)Carregar un fitxer MSG en una mapi_message
mapi_message::from_stream(stream)Carrega de GMS des d’un std::istream
mapi_message::save_to_eml(path)Escriure EML en una ruta de fitxer
mapi_message::save_to_eml(stream)Escriure bytes EML a un std::ostream
mapi_message::save_to_eml()Retorna EML com a std::vector<std::uint8_t>
 Català