قراءة ملفات 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 |