چگونه فایل های MSG را در C++ بخوانیم

چگونه فایل های MSG را در C++ بخوانیم

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single تماس های عملکردی. mapi_message::from_file() و mapi_message::from_stream() بارگذاری به پیام کامل – موضوع، بدن، فرستنده، گیرنده و پیوست ها – به یک حافظه بدون وابستگی به Outlook یا COM.

مرحله اول: برنامه را تنظیم کنید

کلون کردن مخزن و اضافه کردن آن به خودتان CMakeLists.txt:

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)

مرحله دوم: شامل عنوان

#include "aspose/email/foss/msg/mapi_message.hpp"

این عنوان واحد ارائه می دهد mapi_message و همه ی حمایت کنندگان در این aspose::email::foss::msg نامی است.


مرحله 3 - ارسال پیام از یک فایل مسیر

استفاده از mapi_message::from_file() وقتی شما یک std::filesystem::path:

#include <filesystem>
#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"));

    std::cout << "Subject: " << message.subject() << '\n';
    std::cout << "From:    " << message.sender_name()
              << " <" << message.sender_email_address() << ">\n";
    std::cout << "Body:    " << message.body() << '\n';
}

مرحله 4 - ارسال پیام از یک جریان

استفاده از mapi_message::from_stream() از هر چیزی به هم می ریزد std::istream مفید برای پردازش داده های MSG دریافت شده از طریق یک شبکه یا از یک حافظه در حفاری:

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    std::cout << "Subject: " << message.subject() << '\n';
}

همیشه با جریان را باز کنید. std::ios::binary جلوگیری از Windows Line-End ترجمه از فساد مخزن CFB.


مرحله 5 - مواد مخدر

message.recipients() بازگشت به A std::vector هر یک از اشیاء، با display_name, email_addressrecipient_type میدان ها :

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.recipients().size(); ++i)
    {
        const auto& r = message.recipients()[i];
        std::cout << "[" << (i + 1) << "] "
                  << r.display_name << " <" << r.email_address << ">"
                  << " type=" << r.recipient_type << '\n';
    }
}

مرحله 6 - اتصال Iterate

message.attachments() بازگشت به A std::vector هر گونه پیوند، هر یک از آن ها نمایش ها filename, mime_type, data (برای مثال، بوته های خام), content_id,و آن را is_embedded_message() پیشگویی :

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.attachments().size(); ++i)
    {
        const auto& a = message.attachments()[i];
        std::cout << "[" << (i + 1) << "] "
                  << a.filename << "  mime=" << a.mime_type
                  << "  bytes=" << a.data.size()
                  << "  embedded=" << (a.is_embedded_message() ? "yes" : "no")
                  << '\n';
    }
}

مشکلات رایج و راه‌حل‌ها

خالی body() بعد از بارگذاری. برخی از پیام ها فقط متن را در بدن HTML ذخیره می کنند. املاک و مستغلات چک کنید message.html_body() زمانی که message.body() یک ردیف خالی را بازگردانید.

جریان بدون باز شدن std::ios::binary. در ویندوز، جریان های متن به حالت ترجمه می شود. CRLF ردیف، به آرامی فساد داده های CFB دوگانه. همیشه باز فایل MSG با std::ios::binary.

msg_exception برای یک فایل قابل اجرا استفاده کنید. بررسی فایل یک MSG واقعی است. فایل های ذخیره شده توسط برخی از ابزارهای صادرات ممکن است متن صاف یا MIME و نمی توان از طریق mapi_message::from_file().

recipients() یک وکتور خالی را بازگردانید. فایل های MSG قدیمی تر گاهی اوقات گیرنده را نادیده می گیرد. در این نمایشگاه، میزبان ها را به نمایش می گذارند. display_to مگابایت: دسترسی به آن از طریق message.get_property_value() با common_message_property_id::display_to و property_type_code::ptyp_string.

اطلاعات بزرگ در حافظه. در این مطلب به شما پیشنهاد می کنیمmapi_message::from_file() و from_stream() برای فایل های بزرگ، کل پیام را با تمام بایت های پیوست وارد کنید. حاوی مواد مخدر با msg_reader و جریان های پیوندی را بدون کامل بررسی کنید. آنها را مادی سازی می کنند.

سوالات متداول

تفاوت بین چه چیزی است؟ from_file() و from_stream()?

هر دو یکسان را تولید می کنند. mapi_message موضوعی است. from_file() پذیرفته شده A std::filesystem::path فایل را به صورت داخلی باز کنید. from_stream() خواندن از هر کدام std::istream شما ارائه می دهید – مفید زمانی که داده های MSG در حال حاضر در حافظه یا به سوکت می رسد.

آیا می from_file() پس از بارگذاری فایل را باز نگه دارید.?

فایل باز می شود، به طور کامل در حافظه بسته و قبل از آن بسته می شوند. from_file() بازگشت: شما می توانید فایل منبع را بلافاصله پس از تماس منتقل یا حذف کنید.

آیا می توانم فایل های MSG را که توسط Outlook در macOS یا لینوکس ایجاد شده است، بخوانم؟?

بله، فرمت MSG (OLE Compound File + MAPI Properties) قابل حمل است. سیستم های عملیاتی - هر .msg فایل های تولید شده توسط هر نسخه از Outlook می تواند باز شود. با mapi_message::from_file().

چگونه بدن HTML را بخوانیم؟?

تماس تلفنی message.html_body().اگر پیام با یک جسم متن مستقیم ایجاد شده باشد،, این یک ردیف خالی را باز می گرداند. message.body() بازگرداندن جسم متن مستقیم.

آیا حالت سختی پیش فرض است؟?

mapi_message::from_file(path, strict) و from_stream(stream, strict) پذیرش یک اختیاری strict بوتاکس: این فرضیه است false,که در ساختار کوچک تر قابل تحمل است. از بین بردن فایل های MSG در دنیای واقعی.

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

 فارسی