Hvordan man arbejder med vedhæftede filer i C++
Aspose.Email FOSS for C++ provides the mapi_attachment Klasse til at oprette vedhæftede filer fra rå bytes eller strømme, og den mapi_message Læs mere Forslag til vedhæftede artikler fra eksisterende MSG filer. Du kan tilføje vedhæftede filen, når du komponerer meddelelser og inspicere dem når du indlæser filer, herunder ved at opdage, om et bilag selv er en Det er budskabet.
Trin 1 - Opbyg projektet
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)Trin 2 – Tilføj et filvedhæftet fil fra byte
Brug af mapi_message::add_attachment() Tilføj binære data, når du skriver en besked. Giv filnavnet, de rå bytes som a std::vector<std::uint8_t>,Og så er der også den (helt) Type af indhold:
#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"));
}Trin 3 – Tilføj et vedhæftet fil fra en fil på disk
Læs filen i en bytevektor, og send den til 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"));
}Trin 4 – Læs vedhæftede filer fra en eksisterende MSG-fil
message.attachments() Tilbage til A const Reference til en vektor af vedhæftede objekter. Hver udstilling filename, mime_type, data (de rå bytes) og 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';
}
}Trin 5 – Opdag og få adgang til indlejrede meddelelser
Nogle MSG filer indeholder andre MSG-filer som vedhæftede filen (forudgående eller mødeindkaldelser). Brug af is_embedded_message() at opdage disse og få adgang til den indlejrede besked gennem 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";
}
}
}Trin 6 – Gem vedhæftede data til disk
Udtræk vedhæftede byte og skriv dem til en fil ved hjælp af standard C++-filstrømme:
#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';
}
}
}Almindelige problemer og rettelser
attachment.data Det er tomt for en kendt stor vedhæftning. Kontroller kilden til filen MSG faktisk indeholder vedhæftede data (ikke en OLE-link). MSG filer eksporteret fra nogle Mail-klienter kan gemme vedhæftede filer som eksterne referencer, som biblioteket ikke kan følge.
is_embedded_message() Tilbage true Men embedded_message er nullptr. Den vedhæftede emner angiver en indlejret MSG, men dataene var ikke læsbare. kilden MSG er gyldig og ikke truncated.
Gemme ekstraherede vedhæftninger fejler med en vejfejl. Nogle filer vedhæftes indeholde tegn, der er ugyldige på målfilsystemet (f.eks.., :, ? er Videnskab.dk » Sundhed attachment.filename Før du bygger udgangsbanen.
Store MSG filer forårsager høj hukommelsebrug. afmapi_message::from_file() Lade alle vedhæftede data til hukommelsen. For store filer skal du åbne den underliggende CFB-beholder med cfb_reader at få adgang til individuelle streams uden fuldt ud at materialisere alle vedhæftede filer.
add_attachment() Ikke fundet i sammensætningstidspunktet. Sørg for, at du bruger den rigtige Indbefatter det: "aspose/email/foss/msg/mapi_message.hpp".Metoden er medlem af aspose::email::foss::msg::mapi_message.
Ofte stillede spørgsmål
Hvilke MIME typer skal jeg bruge til vedhæftede filer?
Brug standard IANA MIME type til filformatet: "text/plain" for .txt, "application/pdf" for .pdf, "application/octet-stream" Som en generisk tilbagevenden til filer. MIME-typen gemmes som den attach_mime_tag Ejendomsmægleren er ejendomshaver.
Kan jeg vedhæfte den samme fil flere gange?
Ja, hver opfordring til add_attachment() En uafhængig fil er vedhæftet. duplikat filnavne er tilladt; de adskilles ved placering i bilagelisten.
Hvordan indstiller jeg Content-ID til inline billeder?
Pass indholds-ID-strengen som det fjerde argument til 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 Det er udstillet som attachment.content_id Når jeg læser tilbage.
er attachment.data En kopi eller en reference?
attachment.data er a std::vector<std::uint8_t> værdi, der er gemt inde i den mapi_message Hvis du åbner den, udløser det ikke yderligere I/O.
Kan jeg fjerne et vedhæftet fil, før jeg gemmer?
Den mapi_message API’en udsætter ikke en direkte fjern-tilslutningsmetode i versionen 0.1.0. Build a new message, copy the desired properties and attachments manually, og gemme det nye objekt.