Cómo leer archivos MSG en C++

Cómo leer archivos MSG en C++

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Función de llamadas. mapi_message::from_file() y mapi_message::from_stream() Carga el mensaje completo — sujeto, cuerpo, enviador, destinatarios y anexos— en una memoria Objetos sin dependencia de Outlook o COM.

Paso 1 - Configurar el proyecto

Clone el repositorio y añade a su CMakeLists.txt:

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)

Paso 2 - Incluye el encabezado

#include "aspose/email/foss/msg/mapi_message.hpp"

Este único header proporciona mapi_message y todos los tipos de apoyo en el aspose::email::foss::msg El nombre.


Paso 3 - Cargar un mensaje de una ruta de archivo

Uso mapi_message::from_file() Cuando tienes una std::filesystem::path:

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

    std::cout << "Subject: " << message.subject() << '\n';
    std::cout << "From:    " << message.sender_name()
              << " <" << message.sender_email_address() << ">\n";
    std::cout << "Body:    " << message.body() << '\n';
}

Paso 4 - Cargar un mensaje de una corriente

Uso mapi_message::from_stream() para que se desprende de cualquier std::istream - Utilidad para procesamiento de datos MSG recibidos a través de una red o desde un buffer en memoria:

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

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    std::cout << "Subject: " << message.subject() << '\n';
}

Siempre abre el flujo con std::ios::binary Para evitar el fin de línea de Windows traducción de la corrupción del contenedor CFB.


Paso 5 - Recipientes de Iterate

message.recipients() Volver a std::vector de los objetos recibientes, cada uno con display_name, email_address,y, recipient_type Los campos:

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

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.recipients().size(); ++i)
    {
        const auto& r = message.recipients()[i];
        std::cout << "[" << (i + 1) << "] "
                  << r.display_name << " <" << r.email_address << ">"
                  << " type=" << r.recipient_type << '\n';
    }
}

Paso 6 - Atacimientos de Iterate

message.attachments() Volver a std::vector de los objetos de adhesión. cada adhesión Exposiciones filename, mime_type, data (Los bajos crudos), content_id,Y el is_embedded_message() Pregunta de:

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

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.attachments().size(); ++i)
    {
        const auto& a = message.attachments()[i];
        std::cout << "[" << (i + 1) << "] "
                  << a.filename << "  mime=" << a.mime_type
                  << "  bytes=" << a.data.size()
                  << "  embedded=" << (a.is_embedded_message() ? "yes" : "no")
                  << '\n';
    }
}

Problemas y soluciones comunes

vacío body() Después de la carga. Algunos mensajes almacenan texto sólo en el cuerpo HTML Propiedad - Verificaciones message.html_body() Cuando message.body() Devolver una línea vacía.

El flujo se abre sin std::ios::binary. En Windows, el texto-modo fluye en la traducción Sequencias de CRLF, silenciosamente corrompendo datos binarios CFB. siempre abrir los archivos MSG con std::ios::binary.

msg_exception Se lanza para un archivo de aspecto válido. Verificar el archivo es un MSG genuino Los archivos guardados por algunas herramientas de exportación pueden ser texto plano o MIME y No se puede compartir por mapi_message::from_file().

recipients() Devolver un vector vacío. Los archivos MSG más antiguos a veces omitan al destinatario tabla pero almacena los receptores de la display_to MAPI propiedad. Acceso a través de message.get_property_value() con common_message_property_id::display_to y property_type_code::ptyp_string.

Datos de gran anexo en la memoria. Elmapi_message::from_file() y from_stream() cargar toda la mensaje incluidos todos los bajos de anexo. para archivos grandes, abre el Contenedores con msg_reader y inspeccionar los flujos de adhesivos sin ser completamente materializándolos.

Preguntas frecuentes

¿Cuál es la diferencia entre from_file() y from_stream()?

Ambos producen una identidad mapi_message El objeto. from_file() acepta a std::filesystem::path y abre el archivo internamente. from_stream() Lea de cualquier std::istream que proporciona, útil cuando los datos de MSG ya están en memoria o llegando a través de una sopa.

¿Qué hace from_file() ¿Tener el archivo abierto después de la carga?

No. El archivo se abre, completamente parsado en la memoria y cerrado antes de que el archivio sea abierto. from_file() Puedes mover o borrar el archivo de fuente inmediatamente después de la llamada.

¿Puedo leer los archivos MSG creados por Outlook en macOS o Linux?

El formato MSG (OLE Compound File + MAPI) es portátil a través de la Sistemas de operación: cualquier .msg Se puede abrir cualquier archivo producido por una versión de Outlook. con mapi_message::from_file().

¿Cómo puedo leer el cuerpo HTML?

llamadas message.html_body().Si el mensaje se creó con un solo cuerpo de texto plano, Esto devolve una línea vacía. message.body() devolver el cuerpo del texto.

¿Es el modo estricto la default?

mapi_message::from_file(path, strict) y from_stream(stream, strict) Acceptar una Opcional strict La devaluación es false,que toleran minoritariamente la estructura Desconfianza en los archivos MSG del mundo real.

Ver también

 Español