Como trabalhar com anexos em C++
Aspose.Email FOSS for C++ provides the mapi_attachment Classe para criar anexos de bytes ou fluxos brutos, e o mapi_message Lista de anexos para leitura dos arquivos existentes. Você pode adicionar anexos ao compilar mensagens e inspecioná-los quando carregar arquivos, incluindo a detecção de se um anexo é em si mesmo um A mensagem é a mensagens.
Passo 1 – Crie o projeto
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 – Adicionar um anexo de arquivo a partir de bytes
Usar mapi_message::add_attachment() Aplicar dados binários ao escrever uma mensagem. Fornecer o nome do arquivo, os bytes brutos como a std::vector<std::uint8_t>,e o seu lugar. Tipo de Conteúdo:
#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 – Adicionar um anexo a partir de um arquivo no disco
Leia o arquivo em um vector de byte, depois passe-o para 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 — Leia anexos de um arquivo MSG existente
message.attachments() Retorno a const referência a um vetor de objetos de ligação. Cada exposição filename, mime_type, data (os bits brutos) 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 – Detectar e acessar mensagens incorporadas
Alguns arquivos de MSG contêm outros arquivo deMSG como anexos (convites para reuniões ou encaminhamentos). Usar is_embedded_message() para detectá-los e acessar a mensagem embutida através de 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 – Salvar dados de anexos para o disco
Extraia bytes de anexo e escreva-os em um arquivo usando fluxos padrão de arquivos 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';
}
}
}Problemas Comuns e Soluções
attachment.data É um vazio para uma grande adesão conhecida. Verificar a fonte do arquivo MSG contém os dados de anexo (não um link OLE). MSG arquivos exportados a partir de alguns Clientes de correio podem armazenar anexos como referências externas que a biblioteca não pode seguir.
is_embedded_message() Retorno true Mas embedded_message É nullptr. O O cabeçalho do anexo indica um MSG incorporado, mas os dados não foram visíveis. A fonte MSG é válida e não truncada.
Salvar anexos extraídos falha com um erro de caminho. Alguns arquivos de anexo contêm caracteres que são inválidos no sistema de arquivos alvo (por exemplo,., :, ? É VINCULAR - SANTIDADE attachment.filename antes de construir o caminho de saída.
Arquivos grandes causam alto uso de memória. Omapi_message::from_file() Carregar tudo arquivos grandes, abra o contêiner CFB subjacente com um cfb_reader para acessar fluxos individuais sem materializar completamente todos os anexos.
add_attachment() Não encontrado no momento da compilação. Certifique-se de que você está usando o correto Inclui o: "aspose/email/foss/msg/mapi_message.hpp".O método é um membro do aspose::email::foss::msg::mapi_message.
Perguntas Frequentes
Quais tipos de MIME devo usar para anexos?
Use o tipo IANA MIME padrão para o formato de arquivo: "text/plain" Para o .txt, "application/pdf" Para o .pdf, "application/octet-stream" Como um falso retrocesso para arquivos binários. O tipo MIME é armazenado como o attach_mime_tag Propriedade de propriedade.
Posso anexar o mesmo arquivo várias vezes?
Cada chamada para add_attachment() Apresentação de um anexo independente. duplicar nomes de arquivos são permitidos; eles são distinguidos por posição na lista de anexos.
Como configurar o Content-ID para imagens inline?
Passar a cadeia de ID de conteúdo como o quarto argumento para 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 É exposto como attachment.content_id Quando lemos de volta.
É attachment.data Uma cópia ou uma referência?
attachment.data É a std::vector<std::uint8_t> armazenado pelo valor dentro da mapi_message Acesso a ele não desencadeia I/O adicionais.
Posso remover um anexo antes de salvar?
O mapi_message API não expõe um método de remoção-atribuição direta na versão 0.1.0. Build a new message, copy the desired properties and attachments manually, e salvar o novo objeto.