Kaip dirbti su priedais C++
Aspose.Email FOSS for C++ provides the mapi_attachment Klasė, skirta priedų kūrimui iš žalių bytų ar srautų ir mapi_message Priedų sąrašas skaityti priedus iš esamų MSG failų. Galite pridėti priedus, kai sudarote pranešimus ir juos tikrina kai įkeliate failus, įskaitant nustatymą, ar priedas pats yra įmontuotas Žinutė iš Šilutės.
1 žingsnis - Projekto sukūrimas
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 žingsnis - Pridėti failą iš baitų
Naudokite mapi_message::add_attachment() Binarinių duomenų įtraukimas, kai rašoma žinutė. Pateikite failų pavadinimą, žaliaviniai baitai kaip a std::vector<std::uint8_t>,ir uždarbio vietą. Turinio tipas:
#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 žingsnis - Pridėti priedą iš failų diske
Perskaitykite failą į byte vektorių, tada perduokite jį į 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 žingsnis - skaityti priedus iš esamo MSG failo
message.attachments() Grįžti į A const Nuoroda į priedų objektų vektorių. Kiekvienas eksponatas filename, mime_type, data (įskaitant ir žaliąsias) ir 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 žingsnis – aptikti ir pasiekti įterptųjų pranešimų
Kai kuriuose MSG failuose yra kitų MSG failų, kurie yra pridedami (perduodami arba kviečiami į susitikimus). Naudokite is_embedded_message() kad aptiktų šiuos ir prieitų įterptam pranešimui per 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 žingsnis - Išsaugoti priedų duomenis į diską
Išimkite priedų bajtus ir parašykite juos į failą, naudojant standartinius C++ failo srautus:
#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';
}
}
}Bendros problemos ir taisyklės
attachment.data Tuščia vieta žinomam dideliam prisirišimui. Patikrinkite šaltinį MSG failą iš tikrųjų yra priedų duomenų (ne OLE nuorodos). MSG failus eksportuoja iš kai kurių pašto klientai gali saugoti priedus kaip išorines nuorodas, kurių biblioteka negali sekti.
is_embedded_message() Grįžta true Tačiau embedded_message yra nullptr. Tų pridėtojo pavadinimo rodo įterptą MSG, tačiau duomenys nebuvo peržiūrimi. šaltinis MSG yra galiojantis ir nėra ištrintas.
Išsaugoti ištrauktas priedą nepavyksta su kelio klaida. Kai kurie failų pavadinimai turi simbolių, kurie tikslinėje failų sistemoje yra negaliojantys (pvz., :, ? yra V. Sanitizė attachment.filename Prieš pradedant statyti išėjimo kelią.
Didelės MSG failų dėžutės sukelia didelį atminties naudojimą. Štaimapi_message::from_file() Visiems pakrovė didelių failų, atidarykite pagrindinį CFB konteinerį su cfb_reader Galite pasiekti atskirus srautus, visiškai nesuteikiant visų priedų.
add_attachment() Rasta ne per surinkimo laiką. Įsitikinkite, kad naudojate teisingą Įskaitant : "aspose/email/foss/msg/mapi_message.hpp".Metodas yra narys aspose::email::foss::msg::mapi_message.
Dažnai užduodami klausimai
Kokius MIME tipus turėčiau naudoti priedams?
Naudokite standartinį IANA MIME tipą failų formatui: "text/plain" už .txt, "application/pdf" už .pdf, "application/octet-stream" Kaip generinis atgalinis žingsnis į Dvejetainiai failai. MIME tipas saugomas kaip attach_mime_tag Nuosavybės teisių gynėjas.
Ar galiu įtraukti tą patį failą kelis kartus?
Kiekvienas skambutis į add_attachment() Įrašas yra nepriklausomas.Duplikatai Leidžiami failų pavadinimai; jie skiriasi pagal vietą priedėlių sąraše.
Kaip nustatyti turinio ID inline vaizdams?
Perkelkite turinio ID eilutę kaip ketvirtąjį argumentą į 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 Jis eksponuojamas kaip attachment.content_id Kai perskaitysite atgal.
yra attachment.data Kopija ar nuoroda?
attachment.data yra a std::vector<std::uint8_t> Išsaugota vertė viduje mapi_message Prieiga prie jo nesukelia papildomų I/O.
Ar galiu pašalinti priedą prieš taupydamas?
Tų mapi_message API neatskleidžia tiesioginio pašalinimo-pririšimo metodo versijoje 0.1.0. Build a new message, copy the desired properties and attachments manually, Išsaugokite naują objektą.