Cómo trabajar con los accesorios en C++

Cómo trabajar con los accesorios en C++

Aspose.Email FOSS for C++ provides the mapi_attachment clase para crear adhesivos de los bajos crudos o corrientes, y el mapi_message Lista de adjetivos para la lectura de los adjectivos desde los archivos MSG existentes. puede agregar anexos al compilar mensajes y inspeccionarlos cuando cargar archivos, incluido el deteccion de si un anexo es en sí mismo un incorporado mensaje de MSG.

Paso 1 - Configurar el proyecto

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 - Añadir un fichero de Bytes

Uso mapi_message::add_attachment() para agregar datos binarios al compilar un mensaje. El nombre de los filenames, las bajas crudas como una std::vector<std::uint8_t>,Y el MIME Tipo de contenido:

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

int main()
{
    auto message = aspose::email::foss::msg::mapi_message::create(
        "Report", "Please review the attached report.");
    message.set_sender_name("Alice");
    message.set_sender_email_address("alice@example.com");
    message.add_recipient("bob@example.com", "Bob");

    // Attach a text file
    std::vector<std::uint8_t> text_data{'H', 'e', 'l', 'l', 'o'};
    message.add_attachment("notes.txt", text_data, "text/plain");

    // Attach a binary blob
    std::vector<std::uint8_t> bin_data{0x00, 0x01, 0x02, 0x03};
    message.add_attachment("data.bin", bin_data, "application/octet-stream");

    message.save(std::filesystem::path("report.msg"));
}

Paso 3 - Añadir un anexo de un archivo en el disco

Lea el archivo en un vector de byte y luego lo pasa a add_attachment():

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

int main()
{
    // Read a file into bytes
    std::ifstream file("document.pdf", std::ios::binary);
    std::vector<std::uint8_t> pdf_bytes(
        std::istreambuf_iterator<char>(file),
        std::istreambuf_iterator<char>{});

    auto message = aspose::email::foss::msg::mapi_message::create(
        "Document", "See attached PDF.");
    message.set_sender_name("Alice");
    message.set_sender_email_address("alice@example.com");
    message.add_recipient("bob@example.com", "Bob");
    message.add_attachment("document.pdf", pdf_bytes, "application/pdf");

    message.save(std::filesystem::path("with_pdf.msg"));
}

Paso 4 - Leer los adjuntos de un archivo MSG existente

message.attachments() Volver a const La referencia a un vector de objetos de adhesión. Cada exposición filename, mime_type, data (Los bajos crudos) y content_id:

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

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

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

Paso 5 - Detectar y acceder a mensajes envueltos

Algunos archivos de MSG contienen otros archivo de MSI como anexos (en adelante o invitaciones a reunirse). Uso is_embedded_message() para detectar estos y acceder al mensaje envuelto a través de embedded_message:

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

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

    for (const auto& attachment : message.attachments())
    {
        if (attachment.is_embedded_message() && attachment.embedded_message != nullptr)
        {
            const auto& inner = *attachment.embedded_message;
            std::cout << "Embedded subject: " << inner.subject() << '\n';
            std::cout << "Embedded from:    " << inner.sender_email_address() << '\n';

            // Save the embedded message as a standalone MSG
            inner.save(std::filesystem::path("embedded.msg"));
        }
        else
        {
            std::cout << "Regular attachment: " << attachment.filename
                      << " (" << attachment.data.size() << " bytes)\n";
        }
    }
}

Paso 6 - Salva los datos de adhesión al disco

Extraer los bajos de anexo y escribirlos en un archivo utilizando flujos de archivos estándar C++:

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

    const std::filesystem::path out_dir("attachments");
    std::filesystem::create_directories(out_dir);

    for (const auto& a : message.attachments())
    {
        if (!a.is_embedded_message())
        {
            const auto out_path = out_dir / a.filename;
            std::ofstream out(out_path, std::ios::binary);
            out.write(reinterpret_cast<const char*>(a.data.data()),
                      static_cast<std::streamsize>(a.data.size()));
            std::cout << "Saved: " << out_path << '\n';
        }
    }
}

Problemas y soluciones comunes

attachment.data Es vacío para un anexo conocido. Verificar el archivo de fuente MSG de hecho contiene los datos de anexo (no un enlace OLE). archivos MSG exportados desde algunos Los clientes de correo pueden almacenar anexos como referencias externas que la biblioteca no puede seguir.

is_embedded_message() Retorno true pero embedded_message Es el nullptr. El el encabezado de la ligazón indica un MSG incorporado, pero los datos no fueron parseables. La fuente MSG es válida y no truncada.

El ahorro de los adhesivos extraídos fallan con un error de ruta. Algunos filanomas de adhesivos contener los caracteres que sean inadecuados en el sistema de archivos al objetivo (por ejemplo,., :, ? En el Windows – Sanidad attachment.filename antes de construir el camino de salida.

Los grandes archivos MSG causan un alto uso de memoria. Elmapi_message::from_file() Carga todo para archivos grandes, abre el contenedor CFB subyacente con cfb_reader para acceder a los flujos individuales sin materializar completamente todos los adhesivos.

add_attachment() No se encuentra en el momento de compilación. Asegúrese de que está utilizando lo correcto. Incluye: "aspose/email/foss/msg/mapi_message.hpp".El método es un miembro de aspose::email::foss::msg::mapi_message.

Preguntas frecuentes

¿Qué tipos de MIME debería usar para los adhesivos?

Utilice el tipo de IANA MIME estándar para el formato de archivo: "text/plain" Para .txt, "application/pdf" Para .pdf, "application/octet-stream" como un fallback generico para El tipo de archivo MIME se almacena como el attach_mime_tag Propiedad de la MAP.

¿Puedo agregar el mismo archivo varias veces?

Cada uno de ellos llama a add_attachment() Añade una entrada de anexo independiente. duplicar Los filenames son permitidos; se distinguen por posición en la lista de anexos.

¿Cómo puedo configurar el ID de contenido para las imágenes en línea?

Pasar la barra de contenido como el cuarto argumento a mapi_attachment::from_stream():

auto att = aspose::email::foss::msg::mapi_attachment::from_bytes(
    "logo.png", png_bytes, "image/png", "<logo-cid@example.com>");

content_id Se exponen como attachment.content_id Cuando vuelve a leer.

Es attachment.data ¿Una copia o una referencia?

attachment.data Es una std::vector<std::uint8_t> valor de la misma dentro del mapi_message El acceso a la misma no desencadenará I/O adicional.

¿Puedo eliminar un anexo antes de ahorrar?

El mapi_message API no exhibe un método de remoción-atacamiento directo en la versión 0.1.0. Build a new message, copy the desired properties and attachments manually, y salvar el nuevo objeto.

Ver también

 Español