Bagaimana untuk bekerja dengan lampiran dalam C++
Aspose.Email FOSS for C++ provides the mapi_attachment Kelas untuk mencipta lampiran daripada bajet kasar atau aliran, dan yang mapi_message Senarai lampiran untuk membaca lampir daripada fail yang sedia ada MSG. Anda boleh menambah lampiran apabila menyusun mesej dan memeriksa mereka apabila muat naik fail, termasuk mengesan sama ada lampiran itu sendiri merupakan Pesan yang dikeluarkan.
Langkah 1 – Menubuhkan projek
git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.gitadd_subdirectory(Aspose.Email-FOSS-for-Cpp)
target_link_libraries(your_target PRIVATE AsposeEmailFoss::AsposeEmailFoss)Langkah 2 - Tambah lampiran fail daripada byte
digunakan mapi_message::add_attachment() untuk menyambungkan data binari apabila mengkomputerkan mesej. Menyediakan nama fail, byte kasar sebagai a std::vector<std::uint8_t>,dan yang mempunyai tempat duduk. Jenis kandungan :
#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 - Tambah lampiran daripada fail pada Disk
Membaca fail ke dalam vektor byte, kemudian melayari kepada 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 daripada fail MSG yang sedia ada
message.attachments() Kembali kepada a const Perkara yang berkaitan dengan vektor objek. Setiap eksposur filename, mime_type, data (Keputusan yang dikeluarkan oleh Pihak Berkuasa) 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 mesej tertanam
Sesetengah fail MSG mengandungi lain MSG fail sebagai lampiran (diarah atau jemputan mesyuarat). digunakan is_embedded_message() untuk mengesan ini dan mengakses mesej yang disatukan 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 lampiran ke cakera
Mengekstrak byte lampiran dan tulis mereka ke dalam fail menggunakan aliran fail C++ standard:
#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';
}
}
}Isu Umum dan Penyelesaian
attachment.data yang kosong bagi sebuah pengiktirafan besar. Mengesahkan sumber fail MSG sebenarnya mengandungi data lampiran (bukan pautan OLE). MSG fail yang dieksport daripada beberapa klien e-mel mungkin menyimpan lampiran sebagai rujukan luaran yang tidak boleh diikuti oleh pustaka.
is_embedded_message() Kembali true tetapi embedded_message ialah nullptr. yang tajuk lampiran menunjukkan MSG yang telah dimasukkan, tetapi data tidak dapat dibaca. Sumber yang digunakan ialah sumber yang sah dan tidak disunat.
Menyimpan lampiran yang dikeluarkan gagal dengan kesilapan laluan. Beberapa nama fail yang disertakan mengandungi watak-watak yang tidak sah pada sistem fail sasaran (contohnya,., :, ? ialah Perkhidmatan. sanitasi attachment.filename sebelum membina laluan output.
Fail MSG yang besar menyebabkan penggunaan memori yang tinggi. Melayumapi_message::from_file() Semua loads untuk fail besar, buka wadah CFB yang mendasari dengan cfb_reader untuk mengakses aliran individu tanpa sepenuhnya mematikan semua lampiran.
add_attachment() Tidak didapati pada masa kompilasi. Pastikan anda menggunakan yang betul termasuk : "aspose/email/foss/msg/mapi_message.hpp".Kaedah ini merupakan ahli daripada aspose::email::foss::msg::mapi_message.
Soalan Lazim
Apa jenis MIME yang boleh saya gunakan untuk lampiran?
Gunakan standard IANA MIME jenis untuk format fail: "text/plain" untuk .txt, "application/pdf" untuk .pdf, "application/octet-stream" sebagai satu lagi kegagalan untuk fail binari. jenis MIME disimpan sebagai attach_mime_tag harta benda yang dimiliki.
Bolehkah saya melampirkan fail yang sama berulang kali?
Setiap panggilan kepada add_attachment() Masukkan entri lampiran yang bebas. duplikat Nama fail dibenarkan; mereka dibezakan oleh kedudukan dalam senarai lampiran.
Bagaimana saya menetapkan Content-ID untuk imej inline?
Mengalih keluar string ID kandungan sebagai argumen keempat kepada 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 telah dipaparkan sebagai attachment.content_id bila baca balik.
ialah attachment.data Salinan atau rujukan?
attachment.data ialah a std::vector<std::uint8_t> disimpan oleh nilai di dalam mapi_message Objek. mengaksesnya tidak akan memicu I/O tambahan.
Bolehkah saya memadam lampiran sebelum menyimpan?
yang mapi_message API tidak mendedahkan kaedah penghapusan-pelekat langsung dalam versi 0.1.0. Build a new message, copy the desired properties and attachments manually, dan menyimpan objek baru.