Kā strādāt ar pielikumiem C++

Kā strādāt ar pielikumiem C++

Aspose.Email FOSS for C++ provides the mapi_attachment klase pievienojumu izveidei no neapstrādātiem baitiem vai straumēm, un mapi_message pievienojumu saraksts pievienojumu lasīšanai no esošiem MSG failiem. Jūs varat pievienot pievienojumus, sastādot ziņas, un tos pārbaudīt ielādējot failus, ieskaitot noteikšanu, vai pievienojums pats ir iegultais MSG ziņa.

Step 1 — Iestatīt projektu

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)

Step 2 — Pievienot faila pielikumu no baitiem

Izmantojiet mapi_message::add_attachment() lai pievienotu bināros datus, sastādot ziņu. Norādiet faila nosaukumu, raw bytes kā std::vector<std::uint8_t>, un MIME satura veids:

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

Step 3 — Pievienot pielikumu no faila uz diska

Ielasiet failu baitvektorā, pēc tam nododiet to 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"));
}

Step 4 — Nolasīt pielikumus no esoša MSG faila

message.attachments() atgriež const atsauce uz vektoru ar pievienojumu objektiem. Katrs atklāj filename, mime_type, data (neapstrādātie baiti), un 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';
    }
}

5. solis — Noteikt un piekļūt iegultajiem ziņojumiem

Daži MSG faili satur citus MSG failus kā pievienojumus (pārsūtītus vai sanāksmes ielūgumus). Izmantojiet is_embedded_message() lai noteiktu šos un piekļūtu iegultajam ziņojumam caur 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";
        }
    }
}

6. solis — Saglabāt pievienojuma datus diskā

Izgūstiet pievienojuma baitus un ierakstiet tos failā, izmantojot standarta C++ failu straumes:

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

Biežāk sastopamās problēmas un to risinājumi

attachment.data ir tukšs zināmai lielai pielikumam. Pārbaudiet avota MSG failu patiesībā satur pielikuma datus (nevis OLE saiti). MSG faili, kas eksportēti no kāda e-pasta klienti var saglabāt pielikumu kā ārējās atsauces, kurām bibliotēka nevar sekot.

is_embedded_message() atgriež true bet embedded_message ir nullptr. Tas pielikuma galvene norāda uz iegultu MSG, bet dati nebija parsējami. Pārbaudiet, ka avota MSG ir derīgs un nav apgriezts.

Izgūto pielikumu saglabāšana neizdodas, radās ceļa kļūda. Daži pievienojuma failu nosaukumi satur rakstzīmes, kas ir nederīgas mērķa failu sistēmā (piemēram,., :, ? uz Windows). Attīrīt attachment.filename pirms izveidot izvades ceļu.

Lieli MSG faili izraisa augstu atmiņas patēriņu. mapi_message::from_file() ielādē visus pievienošanas datus atmiņā. Lieliem failiem atveriet pamatējo CFB konteineru ar cfb_reader lai piekļūtu atsevišķām straumēm, nevis pilnībā materializējot visus pielikumus.

add_attachment() nav atrasts kompilācijas laikā. Pārliecinieties, ka izmantojat pareizo iekļaut: "aspose/email/foss/msg/mapi_message.hpp". Metode ir locekle aspose::email::foss::msg::mapi_message.

Biežāk uzdotie jautājumi

Kādus MIME tipus man vajadzētu izmantot pielikumiem?

Izmantojiet standarta IANA MIME tipu faila formātam: "text/plain" priekš .txt, "application/pdf" priekš .pdf, "application/octet-stream" kā vispārīgs rezerves variants priekš binārie faili. MIME tips tiek saglabāts kā attach_mime_tag MAPI īpašība.

Vai varu pievienot to pašu failu vairākas reizes?

Jā. Katrs izsaukums uz add_attachment() pievieno neatkarīgu piesaistes ierakstu. Dublikāts failu nosaukumi ir atļauti; tie tiek atšķirti pēc to pozīcijas pievienojumu sarakstā.

Kā iestatīt Content-ID iekļautajiem attēliem?

Padodiet satura ID virkni kā ceturto argumentu. 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 tiek atklāts kā attachment.content_id lasot atpakaļ.

Ir attachment.data kopija vai atsauce?

attachment.data ir std::vector<std::uint8_t> glabāts kā vērtība iekš mapi_message objekta. Piekļūšana tam neizraisa papildu I/O.

Vai varu noņemt pielikumu pirms saglabāšanas?

Šis mapi_message API nepakļauj tiešu remove-attachment metodi versijā 0.1.0. Build a new message, copy the desired properties and attachments manually, un saglabājiet jauno objektu.

Skatīt arī

 Latviešu