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.gitadd_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.