الميزات والوظائف

الميزات والوظائف

الميزات والوظائف

تغطي هذه الصفحة كل ميزة رئيسية من Aspose.Email FOSS for .NET مع أمثلة C# عملية.


قراءة ملفات MSG

تحميل ملف MSG من مسار أو تدفق والوصول إلى جميع خصائصه:

using System.IO;
using Aspose.Email.Foss.Msg;

using var stream = File.OpenRead("message.msg");
var message = MapiMessage.FromStream(stream);

Console.WriteLine(message.Subject);
Console.WriteLine(message.Body);
Console.WriteLine(message.HtmlBody);
Console.WriteLine(message.SenderName);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.MessageDeliveryTime);
Console.WriteLine(message.InternetMessageId);

استخدم strict: false للتحليل المتساهل لملفات MSG غير القياسية:

var message = MapiMessage.FromFile("message.msg", strict: false);

تحقق من ValidationIssues لمراجعة أي تحذيرات تنسيق دون إلقاء:

foreach (var issue in message.ValidationIssues)
    Console.WriteLine($"Warning: {issue}");

إنشاء ملفات MSG

قم بإنشاء بريد إلكتروني كامل باستخدام MapiMessage.Create() وتسلسله باستخدام Save():

using System.IO;
using Aspose.Email.Foss.Msg;

var message = MapiMessage.Create("Hello", "Body");
message.SenderName = "Alice";
message.SenderEmailAddress = "alice@example.com";
message.HtmlBody = "<p>Body</p>";
message.InternetMessageId = "<hello@example.com>";
message.MessageDeliveryTime = new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc);

message.AddRecipient("bob@example.com", "Bob");

using var output = File.Create("hello.msg");
message.Save(output);

Save() بدون وسائط تُعيد byte[]. Save(path) يكتب إلى مسار ملف مباشرة.


المستلمون

أضف المستلمين To، Cc، وBcc مع AddRecipient():

message.AddRecipient("alice@example.com", "Alice");
message.AddRecipient("bob@example.com", "Bob", MapiMessage.RecipientTypeCc);
message.AddRecipient("carol@example.com", "Carol", MapiMessage.RecipientTypeBcc);

تكرار المستلمين من رسالة محمَّلة:

foreach (var recipient in message.Recipients)
    Console.WriteLine($"{recipient.DisplayName} <{recipient.EmailAddress}>");

المرفقات

إضافة مرفقات ملفات أو تدفقات مع بيانات تعريف:

// From byte array
message.AddAttachment("report.pdf", pdfBytes, "application/pdf");

// From stream
using var attachStream = File.OpenRead("photo.png");
message.AddAttachment("photo.png", attachStream, "image/png");

// Inline image with Content-ID
message.AddAttachment("logo.png", logoBytes, "image/png", contentId: "logo@cid");

قراءة المرفقات من رسالة محمَّلة:

foreach (var attachment in message.Attachments)
{
    Console.WriteLine($"Filename: {attachment.Filename}");
    Console.WriteLine($"MIME type: {attachment.MimeType}");
    Console.WriteLine($"Size: {attachment.Data.Length} bytes");
    File.WriteAllBytes(attachment.Filename!, attachment.Data);
}

مرفقات الرسائل المضمنة

إرفاق واحدة MapiMessage داخل أخرى — شائع في سلاسل البريد الإلكتروني المُعاد توجيهها:

using Aspose.Email.Foss.Msg;

var parent = MapiMessage.Create("Outer", "Parent body");
var child = MapiMessage.Create("Inner", "Child body");
child.SenderEmailAddress = "inner@example.com";
parent.AddEmbeddedMessageAttachment(child, "inner.msg");

parent.Save("outer.msg");

قراءة مرفقات الرسائل المضمنة:

var loaded = MapiMessage.FromFile("outer.msg");
foreach (var attachment in loaded.Attachments)
{
    if (attachment.IsEmbeddedMessage)
    {
        Console.WriteLine($"Embedded: {attachment.EmbeddedMessage!.Subject}");
    }
}

تحويل EML و MIME

حمّل ملف RFC 5322 .eml إلى MapiMessage لتخزين متوافق مع Outlook:

using System.IO;
using Aspose.Email.Foss.Msg;

using var input = File.OpenRead("message.eml");
var message = MapiMessage.LoadFromEml(input);

using var msgOutput = File.Create("message.msg");
message.Save(msgOutput);

تحويل مرة أخرى إلى EML من ملف MSG:

var message = MapiMessage.FromFile("message.msg");
using var emlOutput = File.Create("roundtrip.eml");
message.SaveToEml(emlOutput);

LoadFromEml() يقبل أيضًا مسار string أو byte[]. SaveToEml() بدون وسائط تُعيد byte[]. يتم الحفاظ على الموضوع، النص، نص HTML، المرسل، المستلمين، وجميع المرفقات (بما في ذلك الصور المضمنة باستخدام Content-ID) عبر جولات كاملة من EML ↔ MSG.


الوصول إلى خاصية MAPI

MapiPropertyCollection يوفر وصولًا مكتوبًا إلى خصائص MAPI عبر SetProperty() و GetPropertyValue(). استخدم قيم تعداد CommonMessagePropertyId للخصائص القياسية:

using Aspose.Email.Foss.Msg;

var message = MapiMessage.FromFile("sample.msg");

// Named convenience properties
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderName);
Console.WriteLine(message.MessageDeliveryTime);

// Iterate all MAPI property keys
foreach (var key in message.IterPropertyKeys())
    Console.WriteLine($"0x{(ushort)key.PropertyId:X4} / {key.PropertyType}");

الوصول إلى حاوية CFB

ملفات Outlook MSG مبنية على تنسيق ملف مركب ثنائي (CFB). CfbReader يكشف شجرة الدليل الكاملة للفحص واستخراج البيانات:

using System.Text;
using Aspose.Email.Foss.Cfb;

using var reader = CfbReader.FromFile("message.msg");

// Iterate all top-level children
foreach (var entry in reader.IterChildren(CfbConstants.RootStreamId))
    Console.WriteLine($"{(entry.IsStorage() ? "Storage" : "Stream")}: {entry.Name}");

// Navigate to a specific stream by path
var entry2 = reader.ResolvePath(["__substg1.0_0037001E"]);
if (entry2 is not null)
{
    var data = reader.GetStreamData(entry2.StreamId);
    Console.WriteLine(Encoding.Unicode.GetString(data));
}

إنشاء وتسلسل مستند CFB من الصفر باستخدام CfbWriter:

using System.Text;
using Aspose.Email.Foss.Cfb;

var document = new CfbDocument();
document.Root.AddStream(new CfbStream("Notes", Encoding.UTF8.GetBytes("hello")));
var storage = document.Root.AddStorage(new CfbStorage("DataStore"));
storage.AddStream(new CfbStream("Payload", Encoding.UTF8.GetBytes("content")));

byte[] bytes = CfbWriter.ToBytes(document);
File.WriteAllBytes("output.cfb", bytes);

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

  • استخدم using أو Dispose() على MapiMessage و CfbReader لإطلاق مقابض الملفات
  • تحقق من message.ValidationIssues بعد التحميل لاكتشاف تنسيق MSG غير القياسي
  • معلمة strict في FromFile() / FromStream() تتحكم في تحمل الأخطاء — استخدم strict: false للتحليل المتساهل للملفات من أنظمة الطرف الثالث
  • MapiMessage.Create() ينتج رسائل سلاسل Unicode بشكل افتراضي؛ اضبط unicodeStrings: false لتوافق ANSI القديم
  • SaveToEml() بدون وسائط تُعيد byte[] — وهو ملائم لتدفقات العمل في الذاكرة

المشكلات الشائعة

المشكلةالسببالإصلاح
CfbException عند التحميلملف CFB/MSG غير صالحتحقق من أن الملف هو Outlook MSG
Body فارغ بعد التحميلالمحتوى مخزن بصيغة HTML فقطتحقق من message.HtmlBody بدلاً من ذلك
0 مرفقات بعد LoadFromEmlملف EML لا يحتوي على أجزاء Content-Disposition: attachmentالأجزاء المضمنة (Content-ID فقط) تظهر أيضًا في Attachments

ملخص مرجع API

ClassDescription
MapiMessageتمثيل رسالة MSG عالي المستوى
MapiAttachmentمرفق أو رسالة مدمجة على MapiMessage
MapiRecipientمتلقي على MapiMessage
MapiPropertyإدخال خاصية MAPI واحدة
MapiPropertyCollectionحقيبة خصائص MAPI ذات نوع
CommonMessagePropertyIdتعداد معرفات خصائص MAPI القياسية
MsgReaderقارئ بنية MSG منخفض المستوى
MsgWriterكاتب بنية MSG منخفض المستوى
CfbReaderقارئ حاوية CFB الثنائية
CfbWriterكاتب حاوية CFB الثنائية
CfbDocumentمستند CFB في الذاكرة للبناء
CfbStorageعقدة تخزين في مستند CFB
CfbStreamعقدة تدفق في مستند CFB
 العربية