Kako raditi sa prilozima u C++

Kako raditi sa prilozima u C++

Aspose.Email FOSS for C++ provides the mapi_attachment klasa za kreiranje priloga od sirovih bajtova ili tokova, i mapi_message lista priloga za čitanje priloga od postojećih MSG fajlova. Možete dodavati priloge prilikom sastavljanja poruka i pregledati ih prilikom učitavanja fajlova, uključujući otkrivanje da li je prilog sam po sebi ugrađen MSG poruka.

Korak 1 — Postavljanje projekta

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)

Korak 2 — Dodavanje fajl priloga iz bajtova

Koristite mapi_message::add_attachment() za prikačivanje binarnih podataka prilikom sastavljanja poruke. Obezbedite ime fajla, sirove bajtove kao a std::vector<std::uint8_t>, i MIME tip sadržaja:

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

Korak 3 — Dodavanje priloga iz fajla na disku

Pročitajte fajl u vektor bajtova, zatim ga prosledite 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"));
}

Korak 4 — Čitanje priloga iz postojećeg MSG fajla

message.attachments() vraća const referencu na vektor objekata priloga. Svaki izlaže filename, mime_type, data (sirove bajtove), i 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';
    }
}

Korak 5 — Detektovanje i pristup ugrađenim porukama

Neki MSG fajlovi sadrže druge MSG fajlove kao priloge (prosleđene ili pozivi za sastanak). Koristite is_embedded_message() da biste ih otkrili i pristupili ugnježdenoj poruci putem 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";
        }
    }
}

Korak 6 — Sačuvajte podatke priloga na disk

Ekstrahujte bajtove priloga i upišite ih u fajl koristeći standardne C++ tokove fajlova:

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

Uobičajeni problemi i rešenja

attachment.data je prazan za poznati veliki prilog. Proverite izvorni MSG fajl zaista sadrži podatke priloga (nije OLE veza). MSG fajlovi izvezeni iz nekih mail klijenti mogu čuvati priloge kao spoljne reference koje biblioteka ne može pratiti.

is_embedded_message() vraća true ali embedded_message je nullptr. The zaglavlje priloga ukazuje na ugrađeni MSG, ali podaci nisu bili parsirani. Proverite da izvorni MSG je validan i nije skraćen.

Čuvanje izvučenog priloga ne uspeva zbog greške u putanji. Neki nazivi fajlova priloga sadrže znakove koji su nevažeći na odredišnom sistemu fajlova (npr.,)., :, ? na Windows). Saniraj attachment.filename pre izgradnje izlaznog puta.

Veliki MSG fajlovi uzrokuju visoku potrošnju memorije. mapi_message::from_file() učitava sve podatke priloga u memoriju. Za velike fajlove, otvorite osnovni CFB kontejner pomoću cfb_reader da pristupite pojedinačnim tokovima bez potpunog materializovanja svih priloga.

add_attachment() nije pronađeno prilikom kompilacije. Uverite se da koristite ispravno uključite: "aspose/email/foss/msg/mapi_message.hpp". Metoda je član aspose::email::foss::msg::mapi_message.

Često postavljana pitanja

Koje MIME tipove treba da koristim za priloge?

Koristite standardni IANA MIME tip za format fajla: "text/plain" za .txt, "application/pdf" za .pdf, "application/octet-stream" kao generički rezervni mehanizam za binarni fajlovi. Tip MIME se čuva kao attach_mime_tag MAPI svojstvo.

Da li mogu da priložim istu datoteku više puta?

Da. Svaki poziv na add_attachment() dodaje nezavisnu stavku priloga. Duplikat imena fajlova su dozvoljena; razlikuju se po položaju u listi priloga.

Kako da postavim Content-ID za inline slike?

Prosledite string ID‑a sadržaja kao četvrti argument 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 je izloženo kao attachment.content_id prilikom ponovnog čitanja.

Da li je attachment.data kopija ili referenca?

attachment.data je std::vector<std::uint8_t> smešten po vrednosti unutar mapi_message objekta. Pristupanje mu ne izaziva dodatni I/O.

Mogu li da uklonim prilog pre nego što ga sačuvam?

Ovaj mapi_message API ne izlaže direktnu metodu za uklanjanje priloga u verziji 0.1.0. Build a new message, copy the desired properties and attachments manually, i sačuvajte novi objekat.

Vidi takođe

 Српски