كيفية قراءة ملفات 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() تحميل The الرسالة الكاملة - الموضوع، الجسم، المرسلين، المستلمين والمرفقات - في ذاكرة الكائنات التي لا تعتمد على 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)

الخطوة 2 - إدراج العنوان

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

هذا العنوان الوحيد يوفر mapi_message وكل من يقدم الدعم في aspose::email::foss::msg اسم الفضاء .


الخطوة 3 - تحميل الرسالة من مسار الملفات

استخدام mapi_message::from_file() عندما يكون لديك A 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.


الخطوة الخامسة: إيترات المكونات

message.recipients() عودة أ std::vector من الأشياء المأخوذة، كل منها مع display_name, email_address,و ، و recipient_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 - إيترايد الارتباطات

message.attachments() عودة أ 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. في Windows ، تنتقل النماذج النصية إلى النمط تابعات 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 أو Linux؟?

نعم. تنسيق MSG (OLE المكون ملف + خصائص MAPI) قابلة للنقل عبر نظام التشغيل - أي .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 الحقيقية.

انظر أيضا

 العربية