مدیریت پیوست‌های پیام

مدیریت پیوست‌ها در Outlook

ایجاد و ذخیره فایل‌های پیام Outlook (MSG) نحوه ایجاد و ذخیره پیام‌ها و چگونگی ساخت فایل‌های MSG با پیوست‌ها را توضیح می‌دهد. این مقاله نحوه مدیریت پیوست‌های Microsoft Outlook با Aspose.Email را شرح می‌دهد. پیوست‌های یک فایل پیام با استفاده از به دیسک دسترسی پیدا کرده و ذخیره می‌شوند MapiMessage کلاس پیوست‌ها ویژگی. این پیوست‌ها ویژگی یک مجموعه از نوع است MapiAttachmentCollection کلاس.

بررسی نوع پیوست (درون‌خطی یا عادی)

پیوست‌های درون‌خطی و عادی اهداف متفاوتی دارند. پیوست‌های درون‌خطی به صورت بصری در پیام ایمیل یکپارچه می‌شوند و معمولاً تصاویر یا فایل‌های رسانه‌ای هستند. در حالی که پیوست‌های عادی فایل‌های جداگانه‌ای هستند که به ایمیل پیوست می‌شوند و می‌توانند انواع مختلفی از فایل‌ها را شامل شوند. The MapiAttachment.IsInline ویژگی MapiAttachment کلاس مقداری را دریافت می‌کند که نشان می‌دهد پیوست به‌صورت inline است یا معمولی.

نمونه کد زیر اطلاعات هر پیوست در 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:

  1. درون MapiAttachmentCollection مجموعه را فراخوانی کنید و پیوست‌های جداگانه را دریافت کنید.
  2. برای ذخیره پیوست‌ها، متد 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 کلاس مجموعهٔ Attachment. مثال کد زیر یک فایل پیام را برای پیوست‌های پیام درون‌ریزی‌شده تجزیه می‌کند و آن را بر روی دیسک ذخیره می‌نماید. The 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 را به‌عنوان پیوست، چه به‌صورت عادی و چه به‌صورت جاسازی‌شده، شامل شود. The 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");

افزودن پیوست‌های مرجع به 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();
}

درج و جایگزینی پیوست

API Aspose.Email امکان درج پیوست‌ها در ایندکس خاص داخل پیام والد را فراهم می‌کند. همچنین امکان جایگزینی محتوای یک پیوست با پیوست پیام دیگری را فراهم می‌آورد.

درج پیوست‌ها در مکان‌های خاص

API 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 (به عنوان مثال) در مجموعه‌ای که تعداد آن 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";

ذخیره پیوست‌ها از پیام‌های امضا دیجیتال

API Aspose.Email امکان دریافت یا تنظیم مقداری را فراهم می‌کند که نشان می‌دهد آیا پیام با امضای واضح رمزگشایی خواهد شد یا نه. 

استخراج اشیاء OLE جاسازی‌شده از oledata.mso

گاهی داده‌های OLE جاسازی‌شده به‌صورت یک oledata.mso پیوست در یک 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.
  • محتوا را به یک 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++;
        }
    }
}