إدارة مرفقات الرسائل
معالجة المرفقات في Outlook
إنشاء وحفظ ملفات رسائل Outlook (MSG) يشرح كيفية إنشاء وحفظ الرسائل، وكيفية إنشاء ملفات MSG مع المرفقات. توضح هذه المقالة كيفية إدارة مرفقات Microsoft Outlook باستخدام Aspose.Email. يتم الوصول إلى المرفقات من ملف رسالة وحفظها على القرص باستخدام MapiMessage فئة المرفقات الخاصية. الـ المرفقات خاصية هي مجموعة من النوع MapiAttachmentCollection فئة.
التحقق من نوع المرفق (مضمن أم عادي)
المرفقات المدمجة والعادية تخدم أغراضًا مختلفة. المرفقات المدمجة مدمجة بصريًا في رسالة البريد الإلكتروني وعادةً ما تكون صورًا أو ملفات وسائط. بينما المرفقات العادية هي ملفات منفصلة مرفقة بالبريد ويمكن أن تشمل أنواعًا مختلفة من الملفات. الـ MapiAttachment.IsInline خاصية الـ MapiAttachment الفئة تحصل على قيمة تشير ما إذا كان المرفق مضمّنًا أو عاديًا.
يستخرج مثال الشيفرة التالي ويعرض معلومات حول كل مرفق في كائن MapiMessage المحمَّل، بما في ذلك أسماء العرض الخاصة بهم وما إذا كانوا مرفقات مضمنة أم لا.
var message = MapiMessage.Load(fileName);
foreach (var attach in message.Attachments)
{
Console.WriteLine($"{attach.DisplayName} : {attach.IsInline}");
}
التحقق من نوع المرفق (IsReference)
الـ MapiAttachment الفئة تشمل الـ IsReference خاصية تسمح للمطورين بتحديد المرفقات المرجعية في رسالة. باستخدام مثال الشيفرة التالي، يمكنك التحقق مما إذا كان المرفق مرفقًا مرجعيًا:
foreach (var attachment in msg.Attachments)
{
if (attachment.IsReference)
{
// Process reference attachment
}
}
حفظ المرفقات من ملفات MSG
لحفظ المرفقات من ملف MSG:
- التكرار عبر الـ MapiAttachmentCollection المجموعة واحصل على المرفقات الفردية.
- لحفظ المرفقات، استدعِ طريقة Save() من فئة MapiAttachment.
يوضح المقتطف البرمجي التالي كيفية حفظ المرفقات إلى القرص المحلي.
// Create an instance of MapiMessage from file
MapiMessage message = MapiMessage.FromFile(dataDir + fileName);
// Iterate through the attachments collection
foreach (MapiAttachment attachment in message.Attachments)
{
// Save the individual attachment
attachment.Save(dataDir + attachment.FileName);
}
استخراج المرفقات من ملفات MSG المهيئة كـ RTF
بالنسبة للرسائل المهيأة كـ RTF، يمكن استخدام الشيفرة التالية للتفريق واستخراج المرفقات التي تكون إما مدمجة أو تظهر كأيقونة في جسم الرسالة. يوضح المقتطف البرمجي التالي كيفية تحديد واستخراج مرفق مدمج من ملف MSG مهيأ كـ RTF.
var eml = MapiMessage.Load("MSG file with RTF Formatting.msg");
foreach (var attachment in eml.Attachments)
{
if (IsAttachmentInline(attachment))
{
try
{
SaveAttachment(attachment, Guid.NewGuid().ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
static bool IsAttachmentInline(MapiAttachment attachment)
{
foreach (var property in attachment.ObjectData.Properties.Values)
{
if (property.Name == "\x0003ObjInfo")
{
var odtPersist1 = BitConverter.ToUInt16(property.Data, 0);
return (odtPersist1 & (1 << (7 - 1))) == 0;
}
}
return false;
}
static void SaveAttachment(MapiAttachment attachment, string fileName)
{
foreach (var property in attachment.ObjectData.Properties.Values)
{
if (property.Name == "Package")
{
using var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
fs.Write(property.Data, 0, property.Data.Length);
}
}
}
الحصول على مرفقات رسائل البريد المتداخلة
المرفقات المدمجة من نوع OLE تظهر أيضًا في MapiMessage فئة مجموعة المرفقات. ي解析 المثال البرمجي التالي ملف رسالة للبحث عن مرفقات رسائل مدمجة ويحفظها على القرص. الـ MapiMessage يمكن للطريقة الساكنة FromProperties() في الفئة إنشاء رسالة جديدة من مرفق مدمج. يوضح المقتطف البرمجي التالي كيفية الحصول على مرفقات الرسائل البريدية المتداخلة.
// Create a MapiMessage object from the individual attachment
MapiMessage getAttachment = MapiMessage.FromProperties(attachment.ObjectData.Properties);
// Convert the embedded message to a MailMessage and save it to disk
MailMessage mailMessage = getAttachment.ToMailMessage(new MailConversionOptions());
mailMessage.Save(dataDir + @"NestedMailMessageAttachments_out.eml", SaveOptions.DefaultEml);
إزالة المرفقات
توفر مكتبة Aspose Outlook القدرة على إزالة المرفقات من ملفات رسائل Microsoft Outlook (.msg):
- استدعِ طريقة RemoveAttachments(). تأخذ مسار ملف الرسالة كمعامل. تم تنفيذها كطريقة ثابتة عامة، لذا لا تحتاج إلى إنشاء كائن.
يظهر مقطع الشيفرة التالي كيفية إزالة المرفقات.
MapiMessage.RemoveAttachments(dataDir + "AttachmentsToRemove_out.msg");
يمكنك أيضًا استدعاء الـ MapiMessage طريقة ثابتة في الفئة DestroyAttachments(). تعمل أسرع من RemoveAttachments()، لأن طريقة RemoveAttachments() تقوم بتحليل ملف الرسالة.
MapiMessage.DestroyAttachments(dataDir + "AttachmentsToDestroy_out.msg");
إضافة مرفقات MSG
يمكن لرسالة Outlook أن تحتوي على رسائل Microsoft Outlook أخرى كمرفقات إما كرسائل عادية أو مدمجة. الـ MapiAttachmentCollection توفر أعضاء محملة بالمعاملات الزائدة لـ Add طريقة لإنشاء رسائل Outlook بكلا نوعي المرفقات:
Add(string name, byte[] data)– يضيف مرفقًا عاديًا من مصفوفة بايت.Add(string name, MapiMessage message)– يضيف رسالة Outlook أخرى كرسالة مدمجة.
يظهر مقطع الشيفرة التالي كيفية إضافة كلا نوعي المرفقات إلى رسالة.
MapiMessage message = new MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body");
// Add a regular attachment from a byte array
message.Attachments.Add("note.txt", File.ReadAllBytes(dataDir + "note.txt"));
// Add another Outlook message as an embedded message
MapiMessage attachMsg = MapiMessage.FromFile(dataDir + "Message.msg");
message.Attachments.Add("Weekly report.msg", attachMsg);
message.Save(dataDir + "WithAttachments_out.msg");
جرّبها!
إضافة أو إزالة مرفقات البريد الإلكتروني باستخدام النسخة المجانية Aspose.Email Editor App.
إضافة مرفقات مرجعية إلى MapiMessages
الـ ReferenceAttachmentOptions الفئة تبسط إضافة المرفقات المرجعية عن طريق تجميع جميع الخصائص الضرورية في كائن واحد.
معلمات ReferenceAttachmentOptions:
- sharedLink: رابط مشاركة مؤهل بالكامل للمرفق مقدم من خدمة الويب التي تستضيف الملف.
- url: موقع الملف أو عنوان URL للموارد.
- providerName: اسم مزود المرفق المرجعي (مثال: Google Drive، Dropbox).
- مثال: إضافة مرفق مرجعي باستخدام ReferenceAttachmentOptions
var options = new ReferenceAttachmentOptions(
"https://drive.google.com/file/d/1HJ-M3F2qq1oRrTZ2GZhUdErJNy2CT3DF/",
"https://drive.google.com/drive/my-drive",
"GoogleDrive");
// Add reference attachment
msg.Attachments.Add("Document.pdf", options);
تضمين الرسائل كمرفقات
يوضح المقتطف البرمجي التالي كيفية تضمين مرفق ملف MSG في رسالة.
MapiMessage message = new MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body");
MapiMessage attachMsg = MapiMessage.FromFile(dataDir + "Message.msg");
message.Attachments.Add("Weekly report.msg", attachMsg);
message.Save(dataDir + "WithEmbeddedMsg_out.msg");
قراءة الرسائل المدمجة من المرفقات
يوضح مقطع الشيفرة التالي كيفية قراءة الرسائل المدمجة من المرفقات.
var message = MapiMessage.FromFile(fileName);
if (message.Attachments[0].ObjectData.IsOutlookMessage)
{
var getData = message.Attachments[0].ObjectData.ToMapiMessage();
}
إدراج واستبدال المرفق
توفر Aspose.Email API القدرة على إدراج المرفقات في فهرس محدد في الرسالة الأصلية. كما توفر إمكانية استبدال محتويات مرفق برسالة مرفق أخرى.
جرّبها!
تشغيل ReplaceAttach مشروع تطبيق بسيط، وجرب إمكانيات Aspose.Email لاستبدال المرفقات عمليًا.
إدراج المرفقات في مواقع محددة
توفر واجهة برمجة تطبيقات Aspose.Email القدرة على إدراج مرفق MSG إلى MSG أصلي باستخدام طريقة Insert في MapiAttachmentCollection (MapiAttachmentCollection Insert(int index, string name, MapiMessage msg)). يوضح المقتطف البرمجي التالي كيفية إدراج مرفق في موقع محدد.
var message = MapiMessage.FromFile(fileName);
var memoryStream = new MemoryStream();
message.Attachments[2].Save(memoryStream);
var getData = MapiMessage.FromStream(memoryStream);
message.Attachments.Insert(1, "new 11", getData);
استبدال محتويات المرفق
يمكن استخدام ذلك لاستبدال محتويات المرفقات المدمجة بأخرى جديدة باستخدام طريقة Replace. ومع ذلك، لا يمكن استخدامه لإدراج مرفق برقم PR_ATTACH_NUM = 4 (مثلاً) في مجموعة تحتوي على عدد عناصر collection.Count = 2. يوضح مقطع الشيفرة التالي كيفية استبدال محتويات المرفق.
var message = MapiMessage.FromFile(fileName);
var memoryStream = new MemoryStream();
message.Attachments[2].Save(memoryStream);
var getData = MapiMessage.FromStream(memoryStream);
message.Attachments.Replace(1, "new 1", getData);
إعادة تسمية المرفقات في MapiMessage
يمكن تعديل قيمة الخاصية DisplayName في مرفقات MapiMessage.
var msg = MapiMessage.Load(fileName);
msg.Attachments[0].DisplayName = "New display name 1";
msg.Attachments[1].DisplayName = "New display name 2";
حفظ المرفقات من الرسائل الموقعة رقمياً
توفر Aspose.Email API القدرة على الحصول على أو ضبط قيمة تشير ما إذا كانت الرسالة الموقعة بوضوح سيتم فك تشفيرها.
استخراج كائنات OLE المضمنة من oledata.mso
في بعض الأحيان تُمثَّل بيانات OLE المضمنة كـ a oledata.mso مرفق في a MapiAttachment وتحتاج إلى استخراجها يدويًا. هذه oledata.mso الملفات بتنسيق Microsoft Compound Document File (MCDF)، ودعم مثل هذه الملفات خارج نطاق Aspose.Email. ومع ذلك، يمكن استخدام Aspose.Email بالتعاون مع مكتبات مفتوحة المصدر أخرى، مثل OpenMCDF، لقراءة محتويات هذه الملفات وحفظها على القرص. Aspose.Email يوفر الـ InlineAttachmentExtractor فئة لعدد حزم MSO المحتوية في البيانات الثنائية للـ oledata.mso، والتي يمكن بعد ذلك تمريرها إلى مكتبة قراءة ملفات مركبة لاستخراج المحتوى.
عند كون نوع جسم الرسالة HTML (ليس RTF) ووجود كائنات OLE في الرسالة، الـ MapiPropertyTag.PR_ATTACH_DATA_OBJ الخاصية غير موجودة. في هذه الحالة، تُحتوى معلومات كائنات OLE في oledata.mso.
لاستخراج المحتويات باستخدام Aspose.Email و OpenMCDF:
- عدد حزم MSO من البيانات الثنائية للـ
oledata.msoمرفق. - لكل عنصر OLE، اقرأ ملف المركب.
- قراءة التدفق المسمى
CONTENTS. - احفظ المحتويات إلى a
FileStream.
// The path to the File directory
string dataDir = RunExamples.GetDataDir_Email();
MapiMessage msg = MapiMessage.FromFile(dataDir + "double.msg");
foreach (MapiAttachment mapiAttachment in msg.Attachments)
{
if (mapiAttachment.LongFileName == "oledata.mso")
{
IDictionary<string, byte[]> oledata = InlineAttachmentExtractor.EnumerateMsoPackage(new MemoryStream(mapiAttachment.BinaryData));
int index = 0;
foreach (var oleItem in oledata)
{
// Using the OpenMCDF library
CompoundFile cf = new CompoundFile(new MemoryStream(oleItem.Value));
CFStream contents = cf.RootStorage.GetStream("CONTENTS");
using (FileStream fs = File.OpenWrite(index + ".pdf"))
{
byte[] data = contents.GetData();
fs.Write(data, 0, data.Length);
fs.Flush();
fs.Close();
}
index++;
}
}
}