Introduzione

Aspose.Email FOSS per C++ è una nuova libreria open-source per leggere, creare e convertire file Outlook MSG, messaggi RFC 5322 EML e i contenitori Compound File Binary (CFB) su cui si basa il formato MSG. È scritta in C++17, non ha dipendenze runtime esterne e si compila su Linux, macOS e Windows tramite CMake — non vi è alcuna dipendenza COM né percorsi di codice specifici per piattaforma.

I file Outlook MSG compaiono costantemente nei lavori di integrazione aziendale — pipeline di archiviazione, strumenti di migrazione, esportazioni per conformità — ma leggerli senza Outlook stesso ha di solito richiesto l’automazione COM su Windows o una libreria commerciale. Aspose.Email FOSS per C++ ti offre un’alternativa portabile: una classe mapi_message di alto livello per la lettura e la creazione quotidiana dei messaggi, più classi di livello inferiore msg_reader, msg_document e cfb_reader per l’accesso diretto al formato contenitore sottostante quando ne hai bisogno.

La libreria è distribuita come sorgente C++17 sotto licenza MIT e aggiunta a un progetto come sottodirectory CMake, esponendo il target AsposeEmailFoss — non è necessaria alcuna registrazione al gestore di pacchetti né binari precompilati.


Caratteristiche principali

Leggi file Outlook MSG

Apri un file .msg con msg_reader::from_file() o msg_reader::from_stream(). Per accedere direttamente a archivi e stream di un messaggio, avvolgi il lettore in un msg_document con msg_document::from_reader().

#include "aspose/email/foss/msg/msg_reader.hpp"
#include "aspose/email/foss/msg/msg_document.hpp"
#include <filesystem>

namespace aef = aspose::email::foss;

auto reader = aef::msg::msg_reader::from_file(
    std::filesystem::path("message.msg"), /*strict=*/false);
auto document = aef::msg::msg_document::from_reader(reader);

Crea messaggi programmaticamente

mapi_message::create() crea un nuovo messaggio in memoria a partire da un oggetto e un corpo. Imposta il mittente, aggiungi i destinatari e allega payload binari o di testo prima di salvare con save().

#include "aspose/email/foss/msg/mapi_message.hpp"
#include <filesystem>

namespace aef = aspose::email::foss;

auto message = aef::msg::mapi_message::create(
    "Quarterly status update", "Hello team,\n\nRollout summary attached.");
message.set_sender_name("Build Agent");
message.set_sender_email_address("build.agent@example.com");
message.add_recipient("alice@example.com", "Alice Example");
message.add_recipient("carol@example.com", "Carol Example",
    aef::msg::mapi_message::recipient_type_cc);
message.add_attachment("report.txt", std::vector<std::uint8_t>{'o', 'k'}, "text/plain");
message.save(std::filesystem::path("output.msg"));

Converti tra MSG ed EML

mapi_message::save_to_eml() scrive il messaggio corrente come file EML RFC 5322, e mapi_message::load_from_eml() lo legge nuovamente. Entrambe le direzioni conservano l’oggetto, il mittente, i destinatari e gli allegati, così un messaggio può passare tra MSG ed EML senza Outlook.

auto message = aef::msg::mapi_message::from_file(
    std::filesystem::path("message.msg"), /*strict=*/false);
message.save_to_eml(std::filesystem::path("message.eml"));

auto restored = aef::msg::mapi_message::load_from_eml(std::filesystem::path("message.eml"));
restored.save(std::filesystem::path("restored.msg"));

Ispeziona le proprietà del messaggio e gli allegati

Un mapi_message caricato espone direttamente i suoi campi di intestazione standard — subject(), sender_name(), sender_email_address(), message_class() e internet_message_id() — insieme a recipients() e attachments() come vettori di mapi_recipient e mapi_attachment. Per i campi MAPI senza accessor dedicato, get_property_value() legge qualsiasi proprietà tramite il suo common_message_property_id e property_type_code.

#include "aspose/email/foss/msg/mapi_message.hpp"
#include "aspose/email/foss/msg/common_message_property_id.hpp"
#include "aspose/email/foss/msg/property_type_code.hpp"
#include <iostream>

namespace aef = aspose::email::foss;

template <typename E>
constexpr auto to_underlying(E value) noexcept {
    return static_cast<std::underlying_type_t<E>>(value);
}

auto message = aef::msg::mapi_message::from_file(
    std::filesystem::path("message.msg"), /*strict=*/false);

std::cout << "Subject: " << message.subject() << '\n';
std::cout << "From: " << message.sender_name()
           << " <" << message.sender_email_address() << ">\n";
std::cout << "Recipients: " << message.recipients().size() << '\n';

for (const auto& attachment : message.attachments()) {
    std::cout << "- " << attachment.filename
               << " (" << attachment.mime_type << ", "
               << attachment.data.size() << " bytes)\n";
}

const auto display_cc = message.get_property_value(
    to_underlying(aef::msg::common_message_property_id::display_cc),
    to_underlying(aef::msg::property_type_code::ptyp_string));

Accesso a contenitori CFB a basso livello

I file MSG sono archiviati all’interno di un contenitore Compound File Binary (CFB) — il formato di storage strutturato utilizzato anche dai formati binari legacy di Office. cfb_reader apre il contenitore grezzo e ne espone direttamente l’albero delle directory: storage_ids() e stream_ids() elencano ogni voce, directory_entry_count() riporta il totale e header() restituisce la disposizione dei settori del contenitore. Questo è utile quando hai bisogno di dati MAPI che il mapi_message API non espone.

#include "aspose/email/foss/cfb/cfb_reader.hpp"
#include <iostream>

namespace aef = aspose::email::foss;

auto cfb = aef::cfb::cfb_reader::from_file(std::filesystem::path("message.msg"));
std::cout << "Directory entries: " << cfb.directory_entry_count() << '\n';
std::cout << "Storages: " << cfb.storage_ids().size() << '\n';
std::cout << "Streams: " << cfb.stream_ids().size() << '\n';

Avvio rapido

Aggiungi la libreria al tuo progetto:

git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.git
# CMakeLists.txt
add_subdirectory(Aspose.Email-FOSS-for-Cpp)
target_link_libraries(your_target PRIVATE AsposeEmailFoss::AsposeEmailFoss)

Quindi crea un messaggio, salvalo come MSG e convertilo in EML:

#include "aspose/email/foss/msg/mapi_message.hpp"
#include <filesystem>
#include <vector>
#include <cstdint>

namespace aef = aspose::email::foss;

int main() {
    auto message = aef::msg::mapi_message::create("Hello from C++", "Body text here");
    message.set_sender_name("Alice");
    message.set_sender_email_address("alice@example.com");
    message.add_recipient("bob@example.com", "Bob");
    message.add_attachment("note.txt", std::vector<std::uint8_t>{'a', 'b', 'c'}, "text/plain");
    message.save(std::filesystem::path("hello.msg"));

    auto loaded = aef::msg::mapi_message::from_file(
        std::filesystem::path("hello.msg"), /*strict=*/false);
    loaded.save_to_eml(std::filesystem::path("hello.eml"));

    return 0;
}

Formati supportati

FormatoEstensioneLeggiScrivi
Messaggio Outlook (MSG).msg✓✓
EML (RFC 5322 / MIME).eml✓✓
Compound File Binary (CFB).cfb✓✓

Open source e licenze

Aspose.Email FOSS per C++ è rilasciato sotto licenza MIT. Il codice sorgente completo è disponibile su aspose-email-foss/Aspose.Email-FOSS-for-Cpp, e l’uso commerciale è consentito senza royalty. La libreria non ha dipendenze runtime oltre a un compilatore C++17 e CMake 3.26 o versioni successive.


Guida introduttiva

Risorse correlate