Come lavorare con gli allegati in C++
Aspose.Email FOSS for C++ provides the mapi_attachment Classe per la creazione di appendici di rifiuti o di scorie, e il mapi_message Elenco di allegati per la lettura - da file MSG esistenti. È possibile aggiungere allegati durante la composizione dei messaggi e ispezionarli quando si caricano i file, compreso il rilevamento se un allegato è di per sé un Il messaggio di un’altra.
Passo 1 - Impostare il progetto
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)Passo 2 – Aggiungi un allegato di file da byte
utilizzo mapi_message::add_attachment() per allegare dati binari quando si compone un messaggio. Fornisci il nome del file, i byte grezzi come a std::vector<std::uint8_t>,e il suo posto. Tipo di contenuto:
#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"));
}Passo 3 – Aggiungi un allegato da un file sul disco
Leggere il file in un vector di byte, quindi passarlo 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"));
}Passo 4 - Leggere allegati da un file MSG esistente
message.attachments() Ritorno a const Un vectore di oggetti di allegato. Ogni esposizione filename, mime_type, data (i rami di rame) e 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';
}
}Passo 5 – Rilevazione e accesso ai messaggi incorporati
Alcuni file contenenti altri file contengono allegati (invitazioni a riunioni o di trasferimento). utilizzo is_embedded_message() per rilevarli e accedere al messaggio incastonato attraverso 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";
}
}
}Passo 6 - Salva i dati di allegato al disco
Estraendo i byte di allegato e scrivendoli in un file utilizzando flussi standard di file C++:
#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';
}
}
}Problemi comuni e risoluzioni
attachment.data è vuoto per un grande appendice conosciuto. Verifica la fonte del file MSG contiene i dati di allegato (non un collegamento OLE). MSG file esportati da alcuni I client di posta elettronica possono memorizzare allegati come riferimenti esterni che la raccolta non può seguire.
is_embedded_message() Ritorno true Ma embedded_message è nullptr. Il l’intestazione dell’allegato indica un MSG incorporato, ma i dati non sono stati visibili. La fonte MSG è valida e non truncata.
Salva allegato estratto fallisce con un errore di percorso. Alcuni file di allegato contenere caratteri non validi nel sistema di file di destinazione (ad es.., :, ? è Sanità - Sanitizzazioni attachment.filename prima di costruire il percorso di uscita.
I file di grandi dimensioni causano un uso elevato della memoria. dimapi_message::from_file() Carica tutti dati di allegato nella memoria. Per i file più grandi aprire il contenitore CFB sottostante con cfb_reader per accedere a singoli flussi senza materializzare completamente tutti gli allegati.
add_attachment() Non trovata nel tempo di compilazione. Assicurati di utilizzare il giusto Include anche: "aspose/email/foss/msg/mapi_message.hpp".Il metodo è un membro di aspose::email::foss::msg::mapi_message.
Domande frequenti
Quali tipi di MIME dovrei usare per gli allegati?
Utilizzare il tipo standard IANA MIME per il formato del file: "text/plain" per .txt, "application/pdf" per .pdf, "application/octet-stream" Come un fallback per file binari. Il tipo MIME viene memorizzato come il attach_mime_tag Proprietà di proprietà.
Posso collegare lo stesso file più volte?
Ogni chiamata a add_attachment() Inserisci un’immagine indipendente. duplicare I nomi dei file sono consentiti; si distinguono per posizione nell’elenco di allegati.
Come impostare l’ID di contenuto per le immagini inline?
Passare la stringa ID del contenuto come quarto argomento a 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 È esposto come attachment.content_id Quando si legge di nuovo.
è attachment.data Una copia o un riferimento?
attachment.data è a std::vector<std::uint8_t> Il valore che si trova all’interno del mapi_message L’accesso a questo non attiva ulteriori I/O.
Posso rimuovere un allegato prima di salvare?
Il mapi_message L’API non espone un metodo di rimozione-attaccamento diretto nella versione 0.1.0. Build a new message, copy the desired properties and attachments manually, e salvare il nuovo oggetto.