Как да работим с привързаности в C++

Как да работим с привързаности в C++

Aspose.Email FOSS for C++ provides the mapi_attachment Класа за създаване на приложки от сурови байти или потоци, и mapi_message Списък на приложението за четене на приложенията от съществуващите MSG файлове. можете да добавите приставки, когато съставяте съобщения и ги проверявате когато изтеглят файлове, включително откриване дали самата приложеност е вградена Посланието на MSG.

Стъпка 1 – Изграждане на проекта

git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.git
add_subdirectory(Aspose.Email-FOSS-for-Cpp)
target_link_libraries(your_target PRIVATE AsposeEmailFoss::AsposeEmailFoss)

Стъпка 2 — Добавяне на файл от битове

Използване mapi_message::add_attachment() да добавяте бинарни данни, когато съставяте съобщение. Да се даде името на филена, сурови байти като std::vector<std::uint8_t>,И на мими Тип на съдържание:

#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 - Добавяне на привързаност от файл към диск

Прочетете файла в байт вектор, след което го прехвърлете на 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 – Прочетете придружения от съществуващ MSG файл

message.attachments() Връща се в const Вектор на обекти за прикрепа. Всяка изложба filename, mime_type, data (наричането на сурови бутове) и 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 – Откриване и достъп до вградени съобщения

Някои MSG файлове съдържат други MSM файла като приложения (предвидени или среща покани). Използване is_embedded_message() да откриете тези и да получите достъп до несеното съобщение чрез 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 – Съхраняване на данни за придружаване към диска

Извлечете битове за приложното съдържание и ги напишете в файл, като използвате стандартни потоци на файлове 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';
        }
    }
}

Общи проблеми и фиксиране

attachment.data Празен е за известна широка привързаност. Проверявайте източника на MSG файла всъщност съдържа данните за приложението (не OLE връзка). MSG файлове, изнесени от някои Пощенски клиенти могат да съхраняват приложения като външни референции, които библиотеката не може да следва.

is_embedded_message() връщане true Но embedded_message е nullptr. и на заглавието на приложението показва вграден MSG, но данните не са проследими. Източникът MSG е валиден и не се закръжава.

Изтеглените приставки се изтриват с грешка по пътя. Някои филенови имена съдържат знаци, които са невалидни в целевата файлова система (например:., :, ? на Windows – санитарно обслужване attachment.filename преди да се изгради изходния път.

Големите MSG файлове причиняват висока употреба на паметта. Сърцетоmapi_message::from_file() Натоварва всички за големи файлове, отворите основния контейнер CFB с cfb_reader да се достъпи до индивидуални потоци, без пълна материализация на всички приспособления.

add_attachment() Не е открит по време на съставяне. Уверете се, че използвате правилното включва: "aspose/email/foss/msg/mapi_message.hpp".Методът е член на aspose::email::foss::msg::mapi_message.

Често задавани въпроси

Какви MIME типове трябва да използвам за приложки?

Използвайте стандартния тип IANA MIME за формат на файла: "text/plain" За .txt, "application/pdf" За .pdf, "application/octet-stream" като генеричен спад за бинарни файлове. тип MIME се съхранява като attach_mime_tag Карта на собствеността.

Мога ли да добавям същия файл няколко пъти?

Всеки призив за add_attachment() Прилагане на независим вход за приложението. дублиране разрешени са фајлови имена; те се различават по позиция в списъка с приложното приложение.

Как да задавам ИД на съдържанието за инлайн изображения?

Преместете съдържанието ID лента като четвърти аргумент за 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 Изложена е като attachment.content_id Когато се чете назад.

е attachment.data Копие или референт?

attachment.data е А std::vector<std::uint8_t> Съхранява се по стойност в рамките на mapi_message Притежаването му не предизвиква допълнителни I/O.

Мога ли да премахна приложението преди спестяване?

и на mapi_message API не показва пряк метод за премахване на връзката в версия 0.1.0. Build a new message, copy the desired properties and attachments manually, Спасяване на новия обект.

Виж също

 Български