قراءة ملفات MSG

قراءة ملفات MSG

mapi_message هو نقطة الدخول لتحميل وتسجيل ملفات Outlook MSG. اتصل بـ from_file() أو from_stream() قراءة حاوية CFB الكاملة ، استخراج جميع MAPI الخصائص، وتعرضها من خلال أساليب المرفقات المكتوبة — لا تثبيت Outlook مطلوباً .


تحميل من مسار ملف

استخدام 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';
}

تحميل من سلك

استخدام mapi_message::from_stream() عندما تصل بيانات MSG من شبكة سكيت، فإن الأرشيف أو أي شيء آخر. std::istream:

#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 << "Subject: " << message.subject() << '\n';
}

دائما فتح البث مع std::ios::binary.خط الترجمة النصية-الطريقة التي تدفقها الخط انتهاء على ويندوز وتفسير حاوية CFB.


ملفات رسالة الوصول

mapi_message يظهر خصائص الرسالة الأكثر شيوعا باسم المضغوطات:

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

    // Core properties
    std::cout << "Subject:          " << message.subject() << '\n';
    std::cout << "Sender name:      " << message.sender_name() << '\n';
    std::cout << "Sender email:     " << message.sender_email_address() << '\n';
    std::cout << "Internet msg-id:  " << message.internet_message_id() << '\n';
    std::cout << "Message class:    " << message.message_class() << '\n';

    // Body — check html_body() first; fall back to plain body()
    const auto& body = message.html_body().empty()
        ? message.body()
        : message.html_body();
    std::cout << "Body length: " << body.size() << " chars\n";
}

إيترايد المقاييس

message.recipients() عودة أ std::vector من الأشياء التي يتلقىها مع display_name, email_address,و ، و recipient_type:

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

    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';
    }
}

إيترايدات

message.attachments() عودة أ std::vector من أدوات التعبير: كل عرض filename, mime_type, data, content_id,و ، و is_embedded_message():

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

    for (const auto& a : message.attachments())
    {
        std::cout << a.filename
                  << "  " << a.mime_type
                  << "  " << a.data.size() << " bytes"
                  << "  embedded=" << (a.is_embedded_message() ? "yes" : "no")
                  << '\n';

        if (!a.is_embedded_message())
        {
            std::ofstream out("extracted_" + a.filename, std::ios::binary);
            out.write(reinterpret_cast<const char*>(a.data.data()),
                      static_cast<std::streamsize>(a.data.size()));
        }
    }
}

الوصول إلى الرسائل المدمجة

عندما is_embedded_message() هو true, يحتوي المرفق على ملف MSG آخر. الوصول إليها من خلال attachment.embedded_message:

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

    for (const auto& a : message.attachments())
    {
        if (a.is_embedded_message() && a.embedded_message != nullptr)
        {
            const auto& inner = *a.embedded_message;
            std::cout << "Embedded subject: " << inner.subject() << '\n';
            inner.save(std::filesystem::path("embedded.msg"));
        }
    }
}

نصائح وأفضل الممارسات

  • دائماً اجتاز std::ios::binary إلى std::ifstream عند تحميل ملفات MSG.
  • التحقق html_body() قبل body() - رسائل HTML فقط تخزين محتوياتها في HTML الجسم الممتلكات والترك body() الفراغ .
  • from_file() تحميل جميع ملفات الارتباط في ذاكرة.لألفات MSG الكبيرة، فكر في فتح الحاوية تحت المرفق مع msg_reader - إجراء فحص كامل لبيانات الميتا دون مادة المرفقات بيوت.
  • وَالْمُتَّقِينَ strict المعلمات من from_file(path, strict) و from_stream(stream, strict) الافتراضات إلى false, تحمل الانحرافات الهيكلية الصغيرة في ملفات MSG الحقيقية.
  • الكائنات المكتسبة المعرضة recipient_type لتمييز إلى، Cc، و Bcc الإدخالات.

القضايا المشتركة

مسألةسببتصحيح
msg_exception على ملف يبدو صالحاًالملفات ليست حاوية OLE CFB الحقيقيةتحقق مع cfb_reader::from_file() - إذا كان يلقي أيضًا ، فإن الملف ليس MSG صالحًّا.
body() عودة شريط فارغالرسالة تستخدم HTML فقط الجسماستخدام html_body() بدلاً من ذلك
recipients() هو فارغMSG بدون جدول مستلمالوصول display_to عبر get_property_value() مع common_message_property_id::display_to
تداول الفساد على ويندوزالبث مفتوح بدون std::ios::binaryإضافة std::ios::binary العلم إلى std::ifstream
الذاكرة العالية المستخدمة للملفات الكبيرةيتم تحميل جميع بيانات الإرفاق إلى الأماماستخدام msg_reader منخفضة المستوى دون مادة كاملة

FAQ

يُفعل from_file() هل تريد أن تبقى الملفات مفتوحة؟?

لا. يتم فتح الملف، وتسجيل كامل، وإغلاق قبل الطريقة العودة.يمكنك نقل أو حذف المجلد المصدر بعد المكالمة.

كيف يمكنني معرفة ما إذا كان المرفق هو ملف أو MSG مدمج؟?

مكالمة attachment.is_embedded_message().عودة true ملفات MSG المدمجة؛; false للملفات العادية.للمسائل المدمجة، الوصول إلى الكائن المكسور عبر attachment.embedded_message.

ما الفرق بين from_file() واستخدامها msg_reader?

mapi_message::from_file() هو API عالية المستوى - فإنه يقطع الرسالة الكاملة و يظهر الخصائص مثل الحقول المسمى. msg_reader من المستوى المنخفض القارئ الذي يعطي الوصول إلى هيكل حاوية CFB الخام ومفيد عند الحاجة إلى فحص إرسال رسالة دون تمييز جميع خصائص MAPI.

هل يتم دعم ملفات Unicode و ANSI MSG؟?

نعم . mapi_message يتعامل مع كل من Unicode (نوع الممتلكات) ptyp_string* و أنسى (ptyp_string8• الخصائص المنسوجة. unicode_strings() العودة true للرسائل يتم تخزينها مع خصائص Unicode.


إشارة API

الفئة / الطريقةوصف
mapi_message::from_file(path)تحميل ملف MSG من A std::filesystem::path
mapi_message::from_file(path, strict)تحميل مع خيار وضع صارم
mapi_message::from_stream(stream)تحميل MSG من واحد std::istream
mapi_message::from_stream(stream, strict)تحميل من البث مع خيار وضع صارم
mapi_message::subject()إرجاع الرسالة الموضوع شريط
mapi_message::body()إعادة جسم النص المسطح
mapi_message::html_body()إعادة جسم HTML (مباشر إذا لم يكن موجودًا)
mapi_message::sender_name()إرجاع اسم العرض للرسالة
mapi_message::sender_email_address()إرجاع عنوان البريد الإلكتروني المرسلة
mapi_message::internet_message_id()إعادة سر الرسالة RFC 2822
mapi_message::message_class()إرجاع شريط فئة الرسالة MAPI
mapi_message::recipients()إرجاع قائمة المستلمين
mapi_message::attachments()إرجاع قائمة المرفقات
mapi_attachment::is_embedded_message()صحيح إذا كان المرفق هو MSG مدمج
mapi_message::unicode_strings()صحيح إذا كانت الرسالة تستخدم خصائص شريط Unicode
 العربية