چگونه با فرمت ها در C++ کار کنیم

چگونه با فرمت ها در C++ کار کنیم

Aspose.Email FOSS for C++ provides the mapi_attachment کلاس برای ایجاد attachments از بیتی یا جریان های خام، و mapi_message لیست اضافه کردن برای خواندن شامل شده ها از فایل های موجود 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() برای اضافه کردن داده های باینری در هنگام نوشتن یک پیام. به عنوان یک فایل، بیتی های خام را به صورت a ارائه دهید. 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() بازگشت به A 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 شامل سایر فایل ها (PLOOKHOLDERS_1}) به عنوان فرمت هایی (موردی یا دعوت نامه ملاقات). استفاده کنید 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 و برای آن که به اندازه ای بی خبر باشد، خالی است. بررسی منبع فایل در واقع شامل داده های متصل (نه لینک OLE) است. MSG فایل هایی که از برخی مشتریان ایمیل ممکن است شامل شده ها را به عنوان اشاره های خارجی که کتابخانه نمی تواند دنبال کند، ذخیره کنند.

is_embedded_message() بازگشت true اما embedded_message است nullptr. این در این مقاله به عنوان یک صفحه نمایش داده شده است که نشان می دهد MSG، اما اطلاعات قابل مشاهده نبود. منبع MSG قابل اجرا است و نه قطع شده.

ذخیره کردن متصلات خارج شده با خطای مسیر ناکام می شود. برخی از فایل های مرتبط شامل شخصیت هایی که در سیستم فایل هدف غیرفعال هستند (به عنوان مثال،., :, ? ای سلامت - Sanitise 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" به عنوان یک Fallback برای فایل های باینری: نوع MIME به عنوان attach_mime_tag مالکیت را به دست می آورند.

آیا می توانم فایل را چند بار اضافه کنم؟?

هر یک از تماس ها به add_attachment() یک صفحه مستقل را اضافه کنید. duplicate نام فایل ها اجازه داده می شود؛ آنها با موقعیت در لیست فرمت های اضافه به نظر می رسد.

چگونه برای تصاویر در خط تنظیمات را تنظیم کنم؟?

ارسال رده رمزگذاری محتوا به عنوان معادله چهارم به 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 A است 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, و هدف جدید را حفظ کنید.

همچنین ببینید

 فارسی