Hvordan arbeide med vedlegg i C++

Hvordan arbeide med vedlegg i C++

Aspose.Email FOSS for C++ provides the mapi_attachment Klasseklasse for å lage vedlegg fra rå bytes eller strømmer, og den mapi_message Liste over lesere for å lese vedlegg fra eksisterende MSG filer. Du kan legge til vedlegg når du komponerer meldinger og inspisere dem når du laster inn filer, inkludert å oppdage om et vedlegg selv er en innebygd fil Snakk med oss!.

Trinn 1 – Sett opp prosjektet

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)

Trinn 2 – Legg til et filvedlegg fra byte

Bruker mapi_message::add_attachment() å legge til binære data når du komponerer en melding. Angi filnavn, rå bytes som a std::vector<std::uint8_t>,og den som er Innholdstype :

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

Trinn 3 – Legg til et vedlegg fra en fil på Disk

Les filen til en bytevektor, og deretter passere den til 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"));
}

Trinn 4 – Les vedlegg fra en eksisterende MSG fil

message.attachments() Tilbake til A const referanse til en vektor av vedleggsobjekter. Hver eksponering filename, mime_type, data (de rå bytene) og 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';
    }
}

Trinn 5 – Oppdag og få tilgang til innebygde meldinger

Noen MSG filer inneholder andre MSG-filer som vedlegg (forhåndsvisninger eller møteinvitasjoner). Bruker is_embedded_message() for å oppdage disse og få tilgang til det nestede meldingen gjennom 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";
        }
    }
}

Trinn 6 – Lagre vedleggsdata til disk

Utdrag vedleggsbytes og skriv dem til en fil ved hjelp av standard C++-filstrømmer:

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

Vanlige problemer og løsninger

attachment.data Det er tomt for en kjent stor tilknytning. Sjekk kilden til MSG filen faktisk inneholder vedleggsdataene (ikke en OLE-kobling). MSG filer eksportert fra noen e-postklienter kan lagre vedlegg som eksterne referanser som biblioteket ikke kan følge.

is_embedded_message() Tilbake true Men embedded_message er nullptr. Den vedleggshodet angir en innebygd MSG, men dataene var ikke lesbare. kilden MSG er gyldig og ikke truncated.

Lagring av ekstrahert vedlegg mislykkes med en veifeil. Noen filtyper vedlegg inneholder tegn som er ugyldige på målfilesystemet (f.eks., :, ? er Helse - Sanitise attachment.filename Før du bygger utgangsveien.

Store MSG filer forårsaker høy hukommelsebruk. - ermapi_message::from_file() Lastet alle vedleggsdata til minnet. For store filer åpner du den underliggende CFB-beholderen med en cfb_reader Å få tilgang til individuelle strømmer uten å materialisere alle vedlegg fullt ut.

add_attachment() Ikke funnet i sammensatte tid. Sørg for at du bruker riktig Inkluderer også: "aspose/email/foss/msg/mapi_message.hpp".Metoden er medlem av aspose::email::foss::msg::mapi_message.

Ofte stilte spørsmål

Hvilke MIME typer skal jeg bruke for vedlegg?

Bruk standard IANA MIME type for filformatet: "text/plain" For .txt, "application/pdf" For .pdf, "application/octet-stream" Som en generisk tilbakevending for binære filer. MIME-typen lagres som den attach_mime_tag Eiendomsmegling av eiendomsrett.

Kan jeg legge til samme fil flere ganger?

Hver eneste samtale til add_attachment() En uavhengig oppføring av vedlegg. Duplikat Filnavn er tillatt; de skiller seg ut etter posisjon i vedleggslisten.

Hvordan angir jeg innholds-ID for inline bilder?

Pass innholds-ID-strengen som det fjerde argumentet til 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 Den er utstilt som attachment.content_id Når jeg leser tilbake.

er attachment.data Kopi eller referanse?

attachment.data er a std::vector<std::uint8_t> Lagret av verdi i den mapi_message Å få tilgang til objektet utløser ikke ytterligere I/O.

Kan jeg fjerne et vedlegg før du sparer?

Den mapi_message API-en avslører ikke en direkte fjerne vedleggsmetode i versjonen 0.1.0. Build a new message, copy the desired properties and attachments manually, og lagre det nye objektet.

Se også

 Norsk