انتقال دادههای ایمیل از Outlook for Mac (OLM) به فرمتهای بهطور گسترده پشتیبانیشده مانند MBOX (برای Thunderbird / صندوقهای ایمیل یونیکس) و PST (Outlook for Windows) یک کار رایج هنگام جابجایی بین پلتفرمها است. Microsoft Outlook for Mac از فرمت OLM (Outlook for Mac Data File) برای ذخیره ایمیلها، مخاطبان، تقویمها و سایر موارد استفاده میکند. با این حال، انتقال این دادهها به محیطهای مبتنی بر ویندوز یا سایر کلاینتهای ایمیل اغلب نیاز به تبدیل فایلهای OLM به فرمتهای بهطور جهانی پشتیبانیشده مانند MBOX (که توسط کلاینتهایی مانند Thunderbird و Apple Mail استفاده میشود) یا PST (Outlook Personal Storage Table for Windows) دارد.
در این مقاله، نحوه تبدیل فایلهای OLM به فرمتهای PST و MBOX را در C# با استفاده از Aspose.Email for .NET نشان میدهیم، یک API قدرتمند که کارهای پیچیده مهاجرت ایمیل را بهصورت برنامهنویسی ساده میکند. شما یاد خواهید گرفت چگونه فایلهای OLM را باز کنید، پیامها را استخراج کنید، ساختار پوشهها را حفظ کنید و آرشیوهای ایمیل قابل حمل برای چندین پلتفرم تولید کنید.
استفاده از Aspose.Email for .NET برای تبدیل
[Aspose.Email for .NET][] امکانات جامعی برای کار با انواع فرمتهای ایمیل، از جمله OLM، MBOX و PST فراهم میکند. این محصول با API شهودی و مستندات گستردهاش کارهای پیچیده تبدیل را ساده میسازد. در ادامه، گامهای تبدیل OLM به MBOX و PST را با استفاده از C# مرور میکنیم.
برای شروع، بسته NuGet Aspose.Email را در پروژه .NET خود نصب کنید:
Install-Package Aspose.Email
این بسته شامل تمام کلاسهای لازم برای پردازش فایلهای OLM، MBOX و PST است.
تبدیل OLM به MBOX
قالب MBOX پیامهای ایمیل را بهصورت ورودیهای MIME متصل ذخیره میکند و بهطور گسترده توسط کلاینتهای ایمیل منبع باز استفاده میشود. در زیر یک مثال ساده اما کارآمد از کد برای تبدیل تمام پیامها از یک پوشه OLM به یک فایل MBOX آورده شده است. این مثال از اعضای API زیر استفاده میکند:
- OlmStorage.FromFile(…) - یک آرشیو OLM را باز میکند و دسترسی به درخت پوشهها و موارد آن را فراهم میسازد. میتوانید از آن برای فهرستبرداری از پوشهها یا استخراج پیامها از یک فایل OLM استفاده کنید.
- GetFolder(string name, bool ignoreCase) - یک OlmFolder برای نام پوشهٔ درخواستشده برمیگرداند.
- OlmFolder.EnumerateMapiMessages() - موارد MapiMessage را در آن پوشه مرور میکند.
- MapiMessage.ToMailMessage(MailConversionOptions) - MapiMessage را به یک MailMessage (MIME) تبدیل میکند.
- MboxrdStorageWriter.WriteMessage(MailMessage) - MailMessage MIME را به جریان MBOX مینویسد.
مراحل
- مسیرهای فایل برای فایل OLM ورودی و فایل MBOX خروجی را تعریف کنید.
- فایل OLM را با استفاده از
OlmStorage.FromFileباز کنید. - یک نویسنده MBOX با استفاده از
MboxrdStorageWriterو مسیر خروجی و گزینههای مشخص شده ایجاد کنید. - پوشه «Inbox» را از فایل OLM با جستجوی بدون حساسیت به حروف بزرگ/کوچک دسترسی پیدا کنید.
- در تمام پیامهای MAPI موجود در پوشه «Inbox» حلقه بزنید.
- هر پیام MAPI را به یک شیء استاندارد
MailMessageتبدیل کنید. - هر پیام تبدیلشده را در فایل MBOX بنویسید.
نمونه کد
var olmPath = @"C:\data\archive.olm";
var mboxPath = @"C:\data\output.mbox";
// Load OLM file using OlmStorage
using (var olm = OlmStorage.FromFile(olmPath))
using (var mboxWriter = new MboxrdStorageWriter(mboxPath, new MboxSaveOptions()))
{
// Get the folder (case-insensitive example)
var inbox = olm.GetFolder("Inbox", true);
// Iterate MAPI messages (returns MapiMessage objects)
foreach (MapiMessage mapi in inbox.EnumerateMapiMessages())
{
// Convert to MailMessage and write to MBOX
var mail = mapi.ToMailMessage(new MailConversionOptions());
mboxWriter.WriteMessage(mail);
}
}
توجه:
اگر میخواهید برای هر پوشه یک MBOX داشته باشید، برای هر پوشه OLM یک نویسنده جداگانه ایجاد کنید.
اگر ترجیح میدهید یک بایگانی واحد داشته باشید، یک نمونه از MboxrdStorageWriter را مجدداً استفاده کنید و همانطور که در نمونه کد بالا نشان داده شده است، WriteMessage را بهطور مکرر فراخوانی کنید.
تبدیل OLM به PST
تبدیل OLM به PST اغلب نه تنها نیاز به کپی کردن پیامها دارد، بلکه نیاز به بازسازی ساختار پوشهها نیز دارد. نمونه کد زیر نشان میدهد چگونه میتوان ساختار پوشهها و پیامها را از یک فایل بایگانی OLM Outlook به یک فایل PST یونیکد تبدیل و کپی کرد با استفاده از Aspose.Email for .NET.
Key members
- PersonalStorage.Create(path, FileFormatVersion.Unicode) - یک فایل PST یونیکد جدید ایجاد میکند و یک نمونه از PersonalStorage را برمیگرداند. برای باز کردن PSTهای موجود از PersonalStorage.Load(…) استفاده کنید. کلاس PersonalStorage نقطه ورودی برای کار با فایلهای PST است.
- PersonalStorage.RootFolder - ریشهٔ FolderInfo برای PST را به شما میدهد. برای ایجاد زیرپوشهها از FolderInfo.AddSubFolder(name) استفاده کنید. FolderInfo.GetSubFolders() فرزندان را برمیگرداند تا بتوانید بررسی کنید آیا پوشهای با همان نام از قبل وجود دارد یا خیر.
- OlmStorage.GetFolders() - مجموعهٔ OlmFolder سطح بالایی (سلسلهمراتبی پوشههای OLM) را برمیگرداند. ویژگی OlmFolder.SubFolders شامل فرزندان است (بهطوری که بتوانید بهصورت بازگشتی پایین بروید).
- OlmFolder.EnumerateMapiMessages() - نمونههای MapiMessage را باز میگرداند.
- FolderInfo.AddMessage(MapiMessage) - یک MapiMessage را به یک پوشهٔ PST اضافه میکند.
Steps
- مسیرهای فایل برای فایل OLM منبع و فایل PST مقصد را تنظیم کنید.
- بایگانی OLM را برای خواندن باز کنید و یک فایل PST جدید برای نوشتن ایجاد کنید.
- پوشههای سطح بالایی را از بایگانی OLM بازیابی کنید.
- یک تابع کمکی تعریف کنید تا پوشهٔ مطابق را داخل PST برای یک نام پوشهٔ دادهشده پیدا یا ایجاد کند.
- یک تابع بازگشتی تعریف کنید تا:
- پوشهٔ PST متناظر را برای هر پوشهٔ OLM ایجاد یا دریافت کند.
- تمام پیامها را از پوشهٔ OLM به پوشهٔ PST کپی کند.
- برای هر زیرپوشهٔ OLM خود را فراخوانی کند تا ساختار درختی پوشه حفظ شود.
- تابع بازگشتی را بر روی تمام پوشههای سطح بالای OLM صدا بزنید، بهطوری که پوشهٔ ریشهٔ PST بهعنوان والد استفاده شود.
- کل سلسلهمراتبی پوشهها و پیامها را در فایل PST جدید ذخیره کنید، بهطوری که دادههای MAPI حفظ شوند.
نمونه کد
var olmPath = @"C:\data\archive.olm";
var pstPath = @"C:\data\output.pst";
// Create a new PST file
using (var olm = OlmStorage.FromFile(olmPath))
using (var pst = PersonalStorage.Create(pstPath, FileFormatVersion.Unicode))
{
// Get top-level folders in OLM
var rootFolders = olm.GetFolders();
// Helper: map OlmFolder -> FolderInfo in PST by recursively creating subfolders
FolderInfo GetOrCreatePstFolder(FolderInfo parentPstFolder, string folderName)
{
// Try to find existing subfolder (case-insensitive)
foreach (var sub in parentPstFolder.GetSubFolders())
{
if (string.Equals(sub.DisplayName, folderName, StringComparison.OrdinalIgnoreCase))
return sub;
}
// Create new subfolder
return parentPstFolder.AddSubFolder(folderName);
}
// Recursive traversal
void ProcessOlmFolder(OlmFolder olmFolder, FolderInfo pstParent)
{
// Create / get the corresponding PST folder
var pstFolder = GetOrCreatePstFolder(pstParent, olmFolder.Name);
// Copy messages: OlmFolder.EnumerateMapiMessages returns MapiMessage instances
foreach (var mapi in olmFolder.EnumerateMapiMessages())
{
// AddMessage preserves MAPI data into PST
pstFolder.AddMessage(mapi);
}
// Recurse into OLM subfolders (OlmFolder.SubFolders property)
foreach (var child in olmFolder.SubFolders)
{
ProcessOlmFolder(child, pstFolder);
}
}
// Note: PST.RootFolder exists; create top-level folders under it.
foreach (var top in rootFolders)
{
// Skip creating a duplicate for default PST root folder names if needed
ProcessOlmFolder(top, pst.RootFolder);
}
}
مهم: یک PST تازه ایجاد شده بهطور پیشفرض شامل یک پوشه Deleted Items است — بنابراین مراقب باشید که پوشههای پیشفرض را تکرار نکنید.
توجه:
حفظ انواع پوشهها: زیرپوشههای OLM ممکن است به پوشههای ویژه خاص Outlook (صندوق ورودی، موارد ارسالشده، تقویم) نگاشته شوند. اگر میخواهید پوشههای IPM از پیش تعریفشده ایجاد کنید (بهطوری که Outlook آنها را بهعنوان پوشههای استاندارد شناسایی کند)، از PersonalStorage.CreatePredefinedFolder یا GetPredefinedFolder بسته به سناریو استفاده کنید. CreatePredefinedFolder یک FolderInfo برمیگرداند. در صورت لزوم از enum StandardIpmFolder استفاده کنید.
عملکرد: AddMessages (افزودن دستهای) نسبت به فراخوانیهای متعدد AddMessage سریعتر است. جمعآوری پیامها در دستهها و استفاده از FolderInfo.AddMessages(IEnumerable) را برای کاهش I/O دیسک در نظر بگیرید.
نتیجهگیری
در این مقاله، نحوه تبدیل فایلهای Outlook for Mac (OLM) به فرمتهای PST و MBOX را در C# با استفاده از Aspose.Email for .NET آموختیم. ما بررسی کردیم که چگونه آرشیوهای OLM را باز و پردازش کنیم، پیامها را استخراج کنیم و ساختار پوشهها را هنگام صادرات دادهها به فرمتهای جدید ذخیرهسازی ایمیل حفظ کنیم. با API Aspose.Email، توسعهدهندگان میتوانند بهراحتی مهاجرتهای ایمیل بینپلتفرمی را خودکار کنند و سازگاری بین Outlook for Mac، Outlook for Windows و مشتریان منبع باز مانند Thunderbird را تضمین نمایند.
برای جزئیات بیشتر، مستندات Aspose.Email و مرجع API را بررسی کنید.
