Cara bekerja dengan attachments dalam C++

Cara bekerja dengan attachments dalam C++

Aspose.Email FOSS for C++ provides the mapi_attachment Kelas untuk membuat attachment dari bajet mentah atau aliran, dan mapi_message Daftar Isi untuk Membaca Adenom dari file yang ada. Anda dapat menambahkan lampiran saat menyusun pesan dan memeriksa mereka saat mengunggah file, termasuk mendeteksi apakah lampiran itu sendiri merupakan Pesan yang diberikan.

Langkah 1 – Buat Proyek

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)

Langkah 2 – Tambahkan File dari Bytes

Menggunakan mapi_message::add_attachment() Menggunakan data biner saat menulis pesan. Menampilkan nama file, raw bytes sebagai a std::vector<std::uint8_t>,Dan juga yang berhak untuk Jenis Konten :

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

Langkah 3 – Menambahkan lampiran dari file pada Disk

Baca file ke dalam sebuah vector byte, lalu pasang ke 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"));
}

Langkah 4 — Baca lampiran dari file yang ada MSG

message.attachments() Kembali ke a const Referensi ke vektor objek yang terikat. Setiap eksposur filename, mime_type, data (Baca juga: Perbedaan Batik dan 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';
    }
}

Langkah 5 – Mendeteksi dan Mengakses Pesan Tertanam

Beberapa file MSG berisi file lain MSG sebagai lampiran (diproses atau undangan pertemuan). Menggunakan is_embedded_message() untuk mendeteksi ini dan mengakses pesan yang terpasang melalui 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";
        }
    }
}

Langkah 6 – Simpan Data Tautan ke Disk

Ekstrak byte lampiran dan tulisnya ke dalam file menggunakan alur file C++ standar:

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

Masalah umum dan fixes

attachment.data yang kosong untuk suatu keterikatan besar. Periksa sumber file MSG sebenarnya berisi data lampiran (bukan link OLE). MSG file yang diekspor dari beberapa klien email dapat menyimpan lampiran sebagai referensi eksternal yang tidak dapat diikuti oleh pustaka.

is_embedded_message() Kembali true Namun embedded_message adalah nullptr. yang header lampiran menunjukkan MSG yang tertanam, tetapi data tidak dapat dibaca. Sumber yang digunakan adalah sumber yang valid dan tidak di-truncated.

Menyelamatkan pengekstrakan yang tidak berhasil dengan kesalahan jalur. Beberapa file yang disertakan berisi karakter yang tidak valid pada sistem file target (misalnya,., :, ? adalah Jendela. kesehatan attachment.filename Sebelum mengatur jalur output.

File besar menyebabkan penggunaan memori yang tinggi. yangmapi_message::from_file() Semua loads Untuk file besar, buka wadah CFB yang mendasari dengan cfb_reader untuk mengakses aliran individu tanpa sepenuhnya materialisasikan semua lampiran.

add_attachment() Tidak ditemukan pada waktu kompilasi. Pastikan Anda menggunakan yang benar termasuk : "aspose/email/foss/msg/mapi_message.hpp".Metode ini adalah anggota dari aspose::email::foss::msg::mapi_message.

Pertanyaan yang Sering Diajukan

Jenis MIME apa yang harus saya gunakan untuk lampiran?

Gunakan standar IANA MIME untuk format file: "text/plain" Untuk .txt, "application/pdf" Untuk .pdf, "application/octet-stream" sebagai suatu genetik untuk file biner. jenis MIME disimpan sebagai attach_mime_tag Properti yang dimiliki.

Bisakah saya menambahkan file yang sama beberapa kali?

Setiap panggilan untuk add_attachment() Ada yang tidak terikat. duplikasi Nama file diizinkan; mereka dibedakan oleh posisi dalam daftar lampiran.

Bagaimana cara mengatur Content-ID untuk gambar inline?

Mengirimkan string ID konten sebagai argumen keempat untuk 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 Terungkap sebagai attachment.content_id Ketika membaca kembali.

adalah attachment.data Sebuah salinan atau referensi?

attachment.data adalah a std::vector<std::uint8_t> disimpan oleh nilai dalam mapi_message Akses ke objek tidak memicu I/O tambahan.

Dapatkah saya menghapus lampiran sebelum menyimpan?

yang mapi_message API tidak mengekspos metode penghapusan-pengikat langsung dalam versi 0.1.0. Build a new message, copy the desired properties and attachments manually, dan menyelamatkan objek baru.

Demikian juga

 Bahasa Indonesia