مقدمه

تجزیه برنامه‌نویسی پیام‌های ایمیل یک نیاز رایج برای ابزارهای بایگانی، خطوط لوله انطباق و ابزارهای مهاجرت است. فایل‌های MSG در Outlook از فرمت محفظهٔ باینری ترکیبی (CFB) با جریان‌های ویژگی MAPI استفاده می‌کنند، در حالی که فایل‌های EML از استاندارد MIME پیروی می‌کنند. هر دو فرمت نیاز به مدیریت دقیق رمزگذاری‌ها، سرصفحه‌های تا شده و پیوست‌های تو در تو دارند.

Aspose.Email FOSS برای .NET یک کتابخانهٔ رایگان با مجوز MIT C# است که یک API کامل خواندن-نوشتن برای پیام‌های MSG و EML ارائه می‌دهد. این کتابخانه برای .NET نسخهٔ 8.0+ هدف‌گذاری شده است و هیچ وابستگی‌ای به Microsoft Outlook یا لایهٔ بومی COM interop ندارد. این کتابخانه به‌صورت بستهٔ aspose.email.foss NuGet در دسترس است.

این پست قابلیت‌های تجزیهٔ پیام که در کتابخانه گنجانده شده‌اند را از بارگذاری فایل‌ها از دیسک تا استخراج ویژگی‌های منفرد MAPI و تبدیل بین فرمت‌ها مرور می‌کند.


موارد گنجانده شده

بارگذاری فایل‌های MSG

کلاس MapiMessage نقطهٔ ورودی اصلی برای کار با فایل‌های MSG در Outlook است. می‌توانید یک پیام را از مسیر فایل یا یک جریان بارگذاری کنید، با پرچم اختیاری اعتبارسنجی‌سخت که هر گونه مشکل ساختاری موجود در فایل را آشکار می‌سازد.

// Load an MSG file from disk
var message = MapiMessage.FromFile("meeting-invite.msg");

Console.WriteLine($"Subject: {message.Subject}");
Console.WriteLine($"From: {message.SenderName} <{message.SenderEmailAddress}>");
Console.WriteLine($"Date: {message.MessageDeliveryTime}");
Console.WriteLine($"Recipients: {message.Recipients.Count}");
Console.WriteLine($"Attachments: {message.Attachments.Count}");

شی MapiMessage بازگردانده شده، ویژگی‌های تایپ‌شده‌ای برای فیلدهای عمومی شامل Subject، Body، HtmlBody، SenderName، SenderEmailAddress، InternetMessageId و MessageDeliveryTime را افشا می‌کند.

بارگذاری پیام‌های EML

فایل‌های EML از قالب MIME استفاده می‌کنند. MapiMessage.LoadFromEml یک مسیر فایل، یک Stream یا یک byte[] را می‌پذیرد و همان شیء MapiMessage را برمی‌گرداند، بنابراین شما از یک API یکپارچه صرف‌نظر از قالب منبع استفاده می‌کنید.

// Load from a file path
var fromFile = MapiMessage.LoadFromEml("newsletter.eml");

// Load from a stream
using var stream = File.OpenRead("newsletter.eml");
var fromStream = MapiMessage.LoadFromEml(stream);

Console.WriteLine($"Subject: {fromStream.Subject}");
Console.WriteLine($"Body: {fromStream.Body?.Trim()}");

پارسر، سرآیندهای تاشده، رمزگذاری‌های انتقال Base64 و quoted-printable، و فیلدهای To/Cc چندگیرنده را پردازش می‌کند.

کار با گیرندگان و پیوست‌ها

پس از بارگذاری یک پیام، گیرندگان و پیوست‌ها به‌صورت مجموعه‌های با نوع قوی در دسترس هستند. هر MapiRecipient شامل فیلدهای EmailAddress، DisplayName و RecipientType است. هر MapiAttachment مقادیر Filename، Data، MimeType و ContentId را فراهم می‌کند.

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

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

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

پیوست‌های پیام توکار نیز پشتیبانی می‌شوند. وقتی MapiAttachment.IsEmbeddedMessage true باشد، ویژگی EmbeddedMessage یک MapiMessage تو در تو را برمی‌گرداند که می‌توانید به‌صورت بازگشتی آن را بررسی کنید.

دسترسی به ویژگی‌های MAPI

برای سناریوهای پیشرفته، هر پیام، گیرنده و پیوست یک مجموعه Properties از نوع MapiPropertyCollection را نمایان می‌کند. می‌توانید خصوصیات تک‌تک MAPI را با شناسه خصوصیت و کد نوع آن بخوانید، اضافه کنید و حذف کنید.

var message = MapiMessage.FromFile("custom-props.msg");

// Iterate all properties on the message
foreach (var prop in message.Properties.IterProperties())
{
    Console.WriteLine($"Tag: 0x{prop.PropertyTag:X8}, Value: {prop.Value}");
}

// Read a specific property
var subject = message.Properties.Get(
    (ushort)CommonMessagePropertyId.Subject,
    (ushort)PropertyTypeCode.PtypString);

enum CommonMessagePropertyId شناسه‌های معروف خصوصیات MAPI را برای معانی اصلی پیام، فیلدهای بدنه، سرآیندهای انتقال و متادیتای پیوست‌ها تعریف می‌کند.

تبدیل بین MSG و EML

یک پیام تجزیه‌شده می‌تواند در هر یک از فرمت‌ها ذخیره گردد. Save() بایت‌های MSG را می‌نویسد، در حالی که SaveToEml() خروجی MIME تولید می‌کند. این تبدیل فرمت را ساده می‌کند.

// Load an EML and save as MSG
var message = MapiMessage.LoadFromEml("incoming.eml");
message.Save("converted.msg");

// Load an MSG and save as EML
var msg = MapiMessage.FromFile("outgoing.msg");
msg.SaveToEml("exported.eml");

هر دو روش همچنین یک پارامتر Stream را برای پردازش در حافظه بدون دست زدن به سیستم فایل می‌پذیرند.


شروع سریع

پکیج را از NuGet نصب کنید:

dotnet add package Aspose.Email.FOSS

سپس پیام اول خود را تجزیه کنید:

using Aspose.Email.Foss.Msg;

// Load an MSG file
var message = MapiMessage.FromFile("sample.msg");

Console.WriteLine($"Subject:     {message.Subject}");
Console.WriteLine($"From:        {message.SenderName} <{message.SenderEmailAddress}>");
Console.WriteLine($"Date:        {message.MessageDeliveryTime}");
Console.WriteLine($"Body length: {message.Body?.Length ?? 0} chars");

// List attachments
foreach (var att in message.Attachments)
    Console.WriteLine($"  Attachment: {att.Filename} ({att.Data.Length} bytes)");

// Convert to EML
message.SaveToEml("sample.eml");
Console.WriteLine("Saved as EML.");

قالب‌های پشتیبانی‌شده

قالبپسوندخواندننوشتن
Outlook MSG.msgبلهبله
MIME (EML).emlبلهبله
Compound File Binary.cfbبلهبله

منبع باز و مجوزها

Aspose.Email FOSS برای .NET تحت مجوز MIT منتشر شده است. کد منبع کامل در GitHub در aspose-email-foss/Aspose.Email-FOSS-for-.Net موجود است. مشارکت‌ها، مشکلات و pull requests خوش‌آمدید.


شروع کار

منابع مرتبط