Miten työskennellä liitteiden kanssa C++: ssä

Miten työskennellä liitteiden kanssa C++: ssä

Aspose.Email FOSS for C++ provides the mapi_attachment Luokka liitteiden luomiseen raaka-aitoista tai virtauksista ja siitä, että mapi_message Lisäaineita lukemiseen liitteiden luetteloon olemassa olevista MSG tiedostoista. Voit lisätä liitteitä viestien kirjoittamisessa ja tarkistaa ne tiedostojen lataamisen yhteydessä, mukaan lukien sen havaitseminen, onko liite itse upotettu Viestiä on tullut.

Vaihe 1 – Projekti on luotu

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)

Vaihe 2 – Lisää tiedosto liitetiedostona byteistä

Käytä mapi_message::add_attachment() Binääri-tietojen liittäminen viestin kirjoittamisen yhteydessä. Näytä tiedostonimi, raaka-bytejä a std::vector<std::uint8_t>,ja sen asukkaat Sisällön tyyppi :

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

Vaihe 3 – Lisää liite tiedostosta levylle

Lue tiedosto byte-vektoriksi ja siirrä se sitten 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"));
}

Vaihe 4 – Lue liitteet olemassa olevasta MSG tiedostosta

message.attachments() Takaisin a const viittaus vektorin kiinnitysobjekteihin. Jokainen näyttely filename, mime_type, data (Ryöjä bytejä) ja 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';
    }
}

Vaihe 5 – Tunnista ja käytä upotettuja viestejä

Jotkut MSG tiedostot sisältävät muita MSG -tiedostoja liitteinä (lähetettyjä tai kokouspyyntöjä). Käytä is_embedded_message() Näiden tietojen löytämiseksi ja niitettyjen viestien käyttämiseen 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";
        }
    }
}

Vaihe 6 – Tallenna liitetiedot levylle

Poista liitetiedostot ja kirjoita ne tiedostoon käyttämällä C++-tiedoston virtoja:

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

Yleisiä ongelmia ja korjauksia

attachment.data on tyhjä tunnetulle suurelle kiinnitykselle. Tarkista tiedoston lähde MSG sisältävät liitetiedot (ei OLE-linkkiä). MSG tiedostot, jotka on viety joistakin Sähköpostiohjelmat voivat tallentaa liitteitä ulkoisiksi viittauksiksi, joita kirjasto ei voi seurata.

is_embedded_message() palautetta true Mutta embedded_message on nullptr. Sillä liitteen otsikko osoittaa upotetun MSG, mutta tietoja ei ollut luettavissa. Tarkista, että lähde MSG on pätevä eikä ole katkaistu.

Poistettu liitetiedosto ei tallenna polkuvirheen kanssa. Joitakin tiedostoja kiinnitetään sisältävät merkkejä, jotka ovat virheellisiä kohdetiedostojärjestelmässä (esim.., :, ? on Terveys - terveys attachment.filename ennen kuin tuotantoputki on rakennettu.

Suuri tiedosto aiheuttaa suurta muistin käyttöä. - onmapi_message::from_file() Kaikki ladattavat liitetiedostoja muistiin. Suurille tiedostoille avaa taustalla oleva CFB-säiliö cfb_reader Yksittäisten virtojen käyttö ilman kaikkien liitteiden täydellistä materialisointia.

add_attachment() Ei löytynyt kokoonpanon aikana. Varmista, että käytät oikeaa Sisältää : "aspose/email/foss/msg/mapi_message.hpp".Menetelmä on jäsenenä aspose::email::foss::msg::mapi_message.

Usein kysytyt kysymykset

Mitä MIME tyyppejä minun pitäisi käyttää liitteisiin?

Käytä standardia IANA MIME tiedostomuotoa varten: "text/plain" puolesta .txt, "application/pdf" puolesta .pdf, "application/octet-stream" Joten, kuten yleinen palautuminen binary tiedostoja. MIME tyyppi tallennetaan attach_mime_tag Omistusoikeus on omaisuutta.

Voinko liittää saman tiedoston useita kertoja?

Jokainen soitto on add_attachment() Lisätään erillinen liite.Kerrotaan Tiedostojen nimet ovat sallittuja; ne erotetaan sijainnin mukaan liitteiden luettelossa.

Miten määritän sisältö-ID:n inline-kuviin?

Siirrä sisältö-ID-sarja neljäntenä argumenttina 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 Se on esillä kuin attachment.content_id Kun luen takaisin.

on attachment.data Kopio vai viittaus?

attachment.data on a std::vector<std::uint8_t> arvoa sisällä olevassa mapi_message Objekti. Sen käyttö ei käynnistä lisäI/O:ta.

Voinko poistaa liitteen ennen tallentamista?

Sillä mapi_message API ei paljasta suoraa poista-liitäntämenetelmää versiossa 0.1.0. Build a new message, copy the desired properties and attachments manually, ja tallentaa uusi objekti.

Katso myös

 Suomi