Cum să lucrați cu atașamente în C++

Cum să lucrați cu atașamente în C++

Aspose.Email FOSS for C++ provides the mapi_attachment Clasa pentru crearea atașamentelor de la butoane sau fluxuri brute, şi mapi_message Lista de atașamente pentru citirea ataşamentelor din fișierele existente MSG. Puteți adăuga atașamente atunci când compuneți mesaje și le puteți inspecta atunci când încărcaţi fişiere, inclusiv pentru a detecta dacă ataşamentul în sine este un Mesaj de la Călărași.

Pasul 1 – Crearea proiectului

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)

Pasul 2 – Adăugați un atașament de fișier din byte

folosesc mapi_message::add_attachment() pentru a atașa date binare atunci când compuneți un mesaj. Furnizați numele de fișier, byte-urile brute ca a std::vector<std::uint8_t>,şi de către locatarul Tipul de conținut:

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

Pasul 3 – Adăugați o atașare dintr-un fișier pe disc

Citiţi fişierul într-un vector de byte, apoi treceţi la 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"));
}

Pasul 4 – Citiți atașamentele dintr-un fișier existent MSG

message.attachments() Întoarce a const referinţă la un vector de obiecte ataşate. Fiecare expunere filename, mime_type, data (în cazul în care se aplică la butoanele brute) ș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';
    }
}

Pasul 5 – Detectarea și accesarea mesajelor încorporate

Unele fișiere conțin alte fișierele ca atașamente (înapoi sau invitații la întâlnire). folosesc is_embedded_message() pentru a le detecta şi accesa mesajul încorporat prin intermediul 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";
        }
    }
}

Pasul 6 – Salvați datele atașate pe disc

Extrageți byte de atașament și scrieți-le într-un fișier folosind fluxurile standard de fișiere C++:

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

Probleme comune și soluții

attachment.data este gol pentru o amplă ataşare cunoscută. Verificați sursa fișierului MSG conţine de fapt datele ataşate (nu un link OLE). MSG fişiere exportate din unele Clienții poștă pot stoca atașamente ca referințe externe pe care biblioteca nu le poate urmări.

is_embedded_message() întoarce true Dar embedded_message este nullptr. Ți în capul atașamentului se indică un MSG încorporat, dar datele nu au fost citibile. sursa MSG este valabilă și nu a fost trunchiată.

Salvarea atașamentului extras nu reușește cu o eroare de cale. Câteva fișiere de atașament conţin caractere care sunt nevalide în sistemul de fişiere ţintă (de exemplu,., :, ? este Sănătate – Sanitize attachment.filename înainte de a construi calea de ieșire.

Fișierele mari MSG provoacă utilizarea mare a memoriei.mapi_message::from_file() Toate încărcăturile pentru fişiere mari, deschideţi containerul CFB cu cfb_reader pentru a accesa fluxurile individuale fără materializarea completă a tuturor atașamentelor.

add_attachment() Nu a fost găsit în timpul compilării. Asigurați-vă că utilizați corect include : "aspose/email/foss/msg/mapi_message.hpp".Metoda este un membru al aspose::email::foss::msg::mapi_message.

Întrebări frecvente

Ce tipuri de MIME ar trebui să folosesc pentru atașamente?

Utilizați standardul IANA MIME tip pentru formatul de fișier: "text/plain" pentru .txt, "application/pdf" pentru .pdf, "application/octet-stream" Ca un generic de retrogradare pentru fişierele binare. tipul MIME este stocat ca fiind attach_mime_tag Proprietatea de proprietate.

Pot atașa același fișier de mai multe ori?

Fiecare apel la add_attachment() Se adaugă o intrare de atașament independent. duplicat sunt permise; ele se disting prin poziția din lista atașamentelor.

Cum setez Content-ID pentru imaginile inline?

Pasă șirul ID de conținut ca al patrulea argument la 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 Este expusă ca attachment.content_id Când citesc înapoi.

este attachment.data O copie sau o referință?

attachment.data este a std::vector<std::uint8_t> stocate în interiorul valorii mapi_message Accesarea acestuia nu declanşează o I/O suplimentară.

Pot elimina o atașare înainte de a salva?

Ți mapi_message API nu expune o metodă de eliminare directă a atașamentului în versiunea 0.1.0. Build a new message, copy the desired properties and attachments manually, Salvați noul obiect.

Aşa că

 Română