Kako raditi s priponama u C++

Kako raditi s priponama u C++

Aspose.Email FOSS for C++ provides the mapi_attachment Klase za stvaranje priponki iz sirovih bajta ili struja, i mapi_message Prilog za čitanje priloga iz postojećih datoteka MSG. Možete dodati priloge prilikom sastavljanja poruka i pregledavati ih prilikom učitavanja datoteka, uključujući otkrivanje je li prilog sam po sebi ugrađen u datotekama Posjetitelj poruke.

Korak 1 - Uspostavite projekt

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 datoteke od bajta

Koristite mapi_message::add_attachment() Prilagođavanje binarnih podataka prilikom sastavljanja poruke. Pružanje imena datoteke, sirovi bajti kao a std::vector<std::uint8_t>,i na mjestu gdje je mjesto Vrsta 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 datoteke na disku

Pročitajte datoteku u bajt vektoru, a zatim ga prenesite na 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 – Pročitajte priloge iz postojeće MSG datoteke

message.attachments() Povratak A const referencija na vektor vezanih objekata. Svaki izlaganje filename, mime_type, data (u slučaju žutog bijeta) 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 – Otkrivanje i pristup ugrađenim porukama

Neke datoteke sadrže druge datotekama kao priloge (predati ili pozive na sastanke). Koristite is_embedded_message() kako bi ih otkrili i pristupili nestanoj poruci kroz 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 o priponama na disku

Izvadite priloge bajta i napišite ih u datoteku pomoću standardnih C++ file streams:

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

Zajednička pitanja i popravci

attachment.data Prazno je za poznato-veliko prianjanje. Provjerite izvor datoteke MSG zapravo sadrži podatke o prilozima (ne OLE poveznicu). MSG datoteke izvezene iz nekih Poštanski klijenti mogu pohraniti priloge kao vanjske reference koje knjižnica ne može pratiti.

is_embedded_message() Povratak true ali embedded_message je nullptr. O Prilog glave označava ugrađeni MSG, ali podaci nisu bili čitljivi. izvor je valjan i nije trunciran.

Uspostavljanje izvlačenog prijenosa ne uspijeva s pogreškom puta. Neki od primjera datoteke sadrže znakove koji su nevažeći u ciljanom datotečnom sustavu (npr.., :, ? On je Vijesti > Sanitisa attachment.filename Prije nego što se izgradi put.

Velike datoteke uzrokuju veliku potrošnju memorije. Svijetmapi_message::from_file() Sve u Load Priloga podataka u memoriju. Za velike datoteke otvorite podložni CFB spremnik s cfb_reader pristup pojedinačnim tokovima bez potpuno materijaliziranja svih priloga.

add_attachment() Nije pronađeno u vrijeme sastavljanja. Provjerite da li koristite ispravne uključuju: "aspose/email/foss/msg/mapi_message.hpp".Metoda je članica aspose::email::foss::msg::mapi_message.

Često postavljana pitanja

Koje vrste MIME trebam koristiti za priloge?

Za format datoteke koristite standardni tip IANA MIME: "text/plain" za .txt, "application/pdf" za .pdf, "application/octet-stream" kao generički povratak za binarne datoteke. tip MIME pohranjen je kao attach_mime_tag U vlasništvu je.

Mogu li više puta dodati istu datoteku?

Svaki poziv na add_attachment() Prilazi neovisni prilog. duplikat Imena datoteka su dopuštena; razlikuju se po poziciji na popisu priloženih.

Kako postaviti ID sadržaja za slike u liniji?

Prenosite nizu ID sadržaja kao četvrti argument na 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 Izložena je kao attachment.content_id Kad se čita natrag.

je attachment.data Kopija ili referenca?

attachment.data A je std::vector<std::uint8_t> Skladištena vrijednost unutar mapi_message Pristupanje njemu ne pokreće dodatne I/O.

Mogu li ukloniti priponu prije štednje?

O mapi_message API ne otkriva način izravnog uklanjanja povezivanja u verziji 0.1.0. Build a new message, copy the desired properties and attachments manually, i spasiti novi objekt.

Također

 Hrvatski