Kaip dirbti su priedais C++

Kaip dirbti su priedais C++

Aspose.Email FOSS for C++ provides the mapi_attachment Klasė, skirta priedų kūrimui iš žalių bytų ar srautų ir mapi_message Priedų sąrašas skaityti priedus iš esamų MSG failų. Galite pridėti priedus, kai sudarote pranešimus ir juos tikrina kai įkeliate failus, įskaitant nustatymą, ar priedas pats yra įmontuotas Žinutė iš Šilutės.

1 žingsnis - Projekto sukūrimas

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)

2 žingsnis - Pridėti failą iš baitų

Naudokite mapi_message::add_attachment() Binarinių duomenų įtraukimas, kai rašoma žinutė. Pateikite failų pavadinimą, žaliaviniai baitai kaip a std::vector<std::uint8_t>,ir uždarbio vietą. Turinio tipas:

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

3 žingsnis - Pridėti priedą iš failų diske

Perskaitykite failą į byte vektorių, tada perduokite jį į 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"));
}

4 žingsnis - skaityti priedus iš esamo MSG failo

message.attachments() Grįžti į A const Nuoroda į priedų objektų vektorių. Kiekvienas eksponatas filename, mime_type, data (įskaitant ir žaliąsias) ir 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 žingsnis – aptikti ir pasiekti įterptųjų pranešimų

Kai kuriuose MSG failuose yra kitų MSG failų, kurie yra pridedami (perduodami arba kviečiami į susitikimus). Naudokite is_embedded_message() kad aptiktų šiuos ir prieitų įterptam pranešimui per 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 žingsnis - Išsaugoti priedų duomenis į diską

Išimkite priedų bajtus ir parašykite juos į failą, naudojant standartinius C++ failo srautus:

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

Bendros problemos ir taisyklės

attachment.data Tuščia vieta žinomam dideliam prisirišimui. Patikrinkite šaltinį MSG failą iš tikrųjų yra priedų duomenų (ne OLE nuorodos). MSG failus eksportuoja iš kai kurių pašto klientai gali saugoti priedus kaip išorines nuorodas, kurių biblioteka negali sekti.

is_embedded_message() Grįžta true Tačiau embedded_message yra nullptr. Tų pridėtojo pavadinimo rodo įterptą MSG, tačiau duomenys nebuvo peržiūrimi. šaltinis MSG yra galiojantis ir nėra ištrintas.

Išsaugoti ištrauktas priedą nepavyksta su kelio klaida. Kai kurie failų pavadinimai turi simbolių, kurie tikslinėje failų sistemoje yra negaliojantys (pvz., :, ? yra V. Sanitizė attachment.filename Prieš pradedant statyti išėjimo kelią.

Didelės MSG failų dėžutės sukelia didelį atminties naudojimą. Štaimapi_message::from_file() Visiems pakrovė didelių failų, atidarykite pagrindinį CFB konteinerį su cfb_reader Galite pasiekti atskirus srautus, visiškai nesuteikiant visų priedų.

add_attachment() Rasta ne per surinkimo laiką. Įsitikinkite, kad naudojate teisingą Įskaitant : "aspose/email/foss/msg/mapi_message.hpp".Metodas yra narys aspose::email::foss::msg::mapi_message.

Dažnai užduodami klausimai

Kokius MIME tipus turėčiau naudoti priedams?

Naudokite standartinį IANA MIME tipą failų formatui: "text/plain".txt, "application/pdf".pdf, "application/octet-stream" Kaip generinis atgalinis žingsnis į Dvejetainiai failai. MIME tipas saugomas kaip attach_mime_tag Nuosavybės teisių gynėjas.

Ar galiu įtraukti tą patį failą kelis kartus?

Kiekvienas skambutis į add_attachment() Įrašas yra nepriklausomas.Duplikatai Leidžiami failų pavadinimai; jie skiriasi pagal vietą priedėlių sąraše.

Kaip nustatyti turinio ID inline vaizdams?

Perkelkite turinio ID eilutę kaip ketvirtąjį 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 Jis eksponuojamas kaip attachment.content_id Kai perskaitysite atgal.

yra attachment.data Kopija ar nuoroda?

attachment.data yra a std::vector<std::uint8_t> Išsaugota vertė viduje mapi_message Prieiga prie jo nesukelia papildomų I/O.

Ar galiu pašalinti priedą prieš taupydamas?

mapi_message API neatskleidžia tiesioginio pašalinimo-pririšimo metodo versijoje 0.1.0. Build a new message, copy the desired properties and attachments manually, Išsaugokite naują objektą.

Taip pat

 Lietuvių