Hoe te werken met bijlagen in C++

Hoe te werken met bijlagen in C++

Aspose.Email FOSS for C++ provides the mapi_attachment Class voor het maken van attachments van ruwe bytes of stromen, en de mapi_message Bijlage voor het lezen van bijlagen van bestaande MSG bestanden. U kunt bijlagen toevoegen wanneer u berichten composeert en deze inspecteren bij het laden van bestanden, inclusief het detecteren of een bijlage zelf een ingebedde Het bericht van de plaats.

Stap 1 - Het project opzetten

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)

Stap 2 — Een bestandsafsluiting toevoegen van bytes

Gebruiken mapi_message::add_attachment() Binaire gegevens toevoegen bij het samenstellen van een bericht. Geef de bestandsnaam, de ruwe bytes als a std::vector<std::uint8_t>,En de plaatshouder. Type inhoud :

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

Stap 3 - Voeg een bijlage toe van een bestand op de schijf

Lees het bestand in een byte-vector en stuur het vervolgens door naar de 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"));
}

Stap 4 — Lees bijlagen van een bestaand MSG bestand

message.attachments() Terug naar A const verwijzing naar een vector van gehecht objecten. Elke expositie filename, mime_type, data (de ruwe bytes) en 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';
    }
}

Stap 5 - Detecteren en toegang tot ingebedde berichten

Sommige MSG bestanden bevatten andere MSG-bestanden als bijlagen (verzonden of vergadering uitnodigingen). Gebruiken is_embedded_message() om deze te detecteren en toegang tot de ingesloten boodschap via 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";
        }
    }
}

Stap 6 - Bewaar de bijlagegegevens op de schijf

Extraheren van bijlagen bytes en schrijf ze in een bestand met behulp van standaard C++-bestandsstromen:

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

Veelvoorkomende problemen en oplossingen

attachment.data Het is leeg voor een grote bekende hechting. Controleer de bron van het bestand MSG bevat de bijlagegegevens (niet een OLE-link). MSG bestanden die uit sommige Mailclients kunnen bijlagen opslaan als externe verwijzingen die de bibliotheek niet kan volgen.

is_embedded_message() terugkeren true maar embedded_message is het nullptr. De bijlageheader geeft een ingebedde MSG aan, maar de gegevens waren niet leesbaar. de bron MSG is geldig en niet gesneden.

Het opslaan van geëxtraheerde bijlagen mislukt met een path error. Sommige attachment filenamen bevatten tekens die ongeldig zijn op het bestandssysteem van de doelgroep (bijv.., :, ? is Winkels - Sanitair attachment.filename Voordat u de uitgangspad bouwt.

Grote MSG bestanden veroorzaken een hoog geheugenverbruik. - hetmapi_message::from_file() Loads alle bijlagegegevens in het geheugen. Voor grote bestanden, opent u de onderliggende CFB-containers met een cfb_reader om toegang te krijgen tot individuele stromen zonder alle bijlagen volledig te materialiseren.

add_attachment() Niet gevonden op compilatietijd. Zorg ervoor dat u de juiste Inclusief : "aspose/email/foss/msg/mapi_message.hpp".De methode is een lid van de aspose::email::foss::msg::mapi_message.

Veelgestelde vragen

Welke MIME types moet ik gebruiken voor bijlagen?

Gebruik de standaard IANA MIME type voor het bestandsformaat: "text/plain" voor .txt, "application/pdf" voor .pdf, "application/octet-stream" Als een generieke fallback voor binaire bestanden. Het type MIME wordt opgeslagen als de attach_mime_tag Het eigendom van de woning.

Kan ik hetzelfde bestand meerdere keren bijvoegen?

Ja, elke oproep naar add_attachment() een onafhankelijke bijlage invoert. Duplicate bestandsnamen zijn toegestaan; ze worden onderscheiden door de positie in de lijst met bijlagen.

Hoe stel ik de Content-ID voor inline beelden in?

De inhouds-ID-streng als het vierde argument doorgeven aan de 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 Het wordt blootgesteld als attachment.content_id Als ik terug lees.

is het attachment.data Een kopie of een referentie?

attachment.data is een std::vector<std::uint8_t> opgeslagen door waarde binnen de mapi_message object. Het openen van het apparaat veroorzaakt geen extra I/O.

Kan ik een bijlage verwijderen voordat ik spaar?

De mapi_message API onthult geen directe verwijder-aanhangingsmethode in versie 0.1.0. Build a new message, copy the desired properties and attachments manually, en het nieuwe object opslaan.

Zie ook

 Nederlands