كيفية قراءة ملفات 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.gitadd_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 الحقيقية.