Hogyan kell dolgozni a C++ mellékletekkel
Aspose.Email FOSS for C++ provides the mapi_attachment A csatolások létrehozásához szükséges osztályok a nyers bájtokból vagy áramlatokből, és az mapi_message A mellékletek olvasásához szükséges listák A fájlok a meglévő MSG feldolgozási módból származnak. az üzenetek összeállításakor mellékletet adhat hozzá, és ellenőrizheti azokat fájlok betöltésekor, beleértve azt is, hogy egy melléklet önmagában beágyazott Üzenet a közönségnek.
1. lépés - A projekt beállítása
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)2. lépés - Fájl melléklet hozzáadása byte-ból
használja mapi_message::add_attachment() Bináris adatok tárolása az üzenet megfogalmazásakor. A fájlnév megadása, a nyers bájtok mint a std::vector<std::uint8_t>,És a helyed is. Tartalom típusa :
#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. lépés - Fájl hozzáadása a lemezhez
A fájlt egy byte vektorba kell olvasni, majd továbbítani a 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. lépés - A mellékletek olvasása egy meglévő MSG fájlból
message.attachments() Visszatér a const Vektorok a csatolási objektumokhoz. Minden kiállítás filename, mime_type, data (a nyers bájtok) és 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. lépés – Beágyazott üzenetek felismerése és elérése
Néhány MSG fájl más MSG-fájlt tartalmaz mellékletekként (előterjesztett vagy találkozó meghívók). használja is_embedded_message() hogy észleljük ezeket, és hozzáférjenek a beágyazott üzenethez az 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. lépés - Mentse a mellékletek adatait a lemezre
Kivonja a mellékletek bájtjait, és írja le őket egy fájlba standard C++-s feldolgozási áramkörökkel:
#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';
}
}
}Közös problémák és fixok
attachment.data A nagy ismeretű üres. Ellenőrizze a forrás MSG fájlt valójában tartalmazza a mellékletek adatait (nem OLE-hivatkozást). MSG fájlok exportálva néhány A levelezőprogramok külső hivatkozásokként tárolhatják a mellékleteiket, amelyeket a könyvtár nem tud követni.
is_embedded_message() Visszatérő true De embedded_message Az nullptr. A A mellékletfejléc beágyazott MSG-t jelez, de az adatok nem voltak olvashatóak. Ellenőrizze, hogy A forrás érvényes és nem vágott.
A mentett melléklet nem sikerül egy út hiba. Néhány fájlköteles olyan karaktereket tartalmaz, amelyek érvénytelenek a célfájlrendszerben (pl.., :, ? Azon Szanitisz - egészséges attachment.filename Mielőtt a kiviteli útvonalat megtervezné.
A nagy MSG fájlok magas memóriaköltséget okoznak. Amapi_message::from_file() összes Loads A nagy fájlokhoz nyissa meg a mögöttes CFB-tartályt a cfb_reader Az egyes áramlatok eléréséhez anélkül, hogy teljes mértékben materializálnánk az összes mellékletet.
add_attachment() Nem találtak összeállítási időben. Győződjön meg róla, hogy a megfelelő Ez magában foglalja: "aspose/email/foss/msg/mapi_message.hpp".A módszer tagja a aspose::email::foss::msg::mapi_message.
Gyakran ismételt kérdések
Milyen MIME típusokat kell használnom a mellékletekhez?
A fájlformátumhoz használja a standard IANA MIME típusú formátumot: "text/plain" A .txt, "application/pdf" A .pdf, "application/octet-stream" A generikus visszaeséshez hasonlóan a A MIME típusú fájlokat a attach_mime_tag A tulajdonosok.
Többször is felvehetem ugyanazt a fájlt?
Minden hívás a add_attachment() független mellékletbejegyzés. Duplikáció A fájlnevek megengedettek; a mellékletek listájában lévő pozíciójuk alapján különböztethetők meg.
Hogyan állíthatom be a tartalomazonosítót az inline képekhez?
A tartalomazonosító sor átadása a negyedik argumentumként 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 Kijelentették, hogy mint attachment.content_id Amikor visszaolvasom.
Az attachment.data Egy példány vagy egy hivatkozás?
attachment.data Az a std::vector<std::uint8_t> értékben tárolva a belső mapi_message A hozzáférés nem indítja el a további I/O-kat.
Eltávolíthatom a mellékletet, mielőtt megmenthetem?
A mapi_message Az API nem teszi ki a közvetlen eltávolítás-csatolás módszert a verzióban 0.1.0. Build a new message, copy the desired properties and attachments manually, mentse az új objektumot.