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

پس از باز کردن یک فایل OLM و مکان‌یابی یک پوشه، می‌توانید پیام‌های آن را فهرست کنید، اطلاعات کوتاه پیام را بخوانید، فیلتر کنید و صفحات بزرگ را مرور کنید و پیام‌های منفرد را به‌عنوان MapiMessage اشیاء. این مقاله تمام این عملیات‌ها را پوشش می‌دهد.

فهرست کردن پیام‌ها در یک پوشه

این OlmFolder کلاس دو روش برای پیمایش پیام‌های موجود در خود فراهم می‌کند:

  • EnumerateMessages یک نسخهٔ OlmMessageInfo شیء در هر تکرار. این شیء اطلاعات کوتاهی دربارهٔ پیام را نگه می‌دارد و کارآمدترین روش برای اسکن یک پوشه است.
  • EnumerateMapiMessages یک نسخهٔ کامل را برمی‌گرداند MapiMessage شیء در هر تکرار، با تمام ویژگی‌های پیام بارگذاری شده.

استفاده از EnumerateMessages

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);
    foreach (var messageInfo in folder.EnumerateMessages())
    {
        Console.WriteLine(messageInfo.Subject);
    }
}

استفاده از EnumerateMapiMessages

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    foreach (var msg in folder.EnumerateMapiMessages())
    {
        // save the message in MSG format
        msg.Save($"{msg.Subject}.msg");
    }
}

اطلاعات پیام را بخوانید

Each OlmMessageInfo شیء مجموعه‌ای از ویژگی‌های فقط‑خواندنی را فراهم می‌کند که پیام را بدون بارگذاری محتوای کامل توصیف می‌کند. این کارآمدترین روش برای ساخت نمای فهرست یا تصمیم‌گیری دربارهٔ استخراج پیام‌ها است.

| ویژگی | توضیح | | — | — | | Subject | موضوع پیام. | | From | آدرس فرستنده. | | به | مجموعه‌ای از آدرس‌های گیرنده. | | Date | تاریخ پیام. | | تاریخ‌تغییر | تاریخ آخرین اصلاح پیام. | | HasAttachments | نشان می‌دهد آیا پیام شامل پیوست است. | | MessageClass | کلاس پیام تعریف‌شده توسط فرستنده، مانند IPM.Note. | | EntryId | شناسهٔ ورودی پیام. |

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    foreach (OlmMessageInfo messageInfo in folder.EnumerateMessages())
    {
        Console.WriteLine($"Subject: {messageInfo.Subject}");
        Console.WriteLine($"From: {messageInfo.From}");
        Console.WriteLine($"To: {string.Join("; ", messageInfo.To)}");
        Console.WriteLine($"Date: {messageInfo.Date}");
        Console.WriteLine($"Modified: {messageInfo.ModifiedDate}");
        Console.WriteLine($"Has attachments: {messageInfo.HasAttachments}");
        Console.WriteLine($"Message class: {messageInfo.MessageClass}");
        Console.WriteLine(new string('-', 30));
    }
}

دریافت تاریخ اصلاح یک پیام

تاریخ اصلاح نمایانگر تاریخ و زمان آخرین اصلاح پیام OLM است. از OlmMessageInfo.ModifiedDate property برای خواندن آن:

foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
    DateTime modifiedDate = messageInfo.ModifiedDate;
}

فیلتر کردن پیام‌ها با یک پرس‌وجو

برای پوشه‌های بزرگ، می‌توانید فقط پیام‌هایی را که با معیارهای خاصی مطابقت دارند دریافت کنید به‌جای این‌که همه را مرور کنید. یک MailQuery به EnumerateMessages(MailQuery query) نسخهٔ Overload. پرس‌وجو را با یک MailQueryBuilder.

مثال زیر فقط پیام‌های دریافت‌شده در هفت روز گذشته که موضوع آن شامل کلمهٔ "Invoice" باشد را فهرست می‌کند:

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    var builder = new MailQueryBuilder();
    builder.InternalDate.Since(DateTime.Now.AddDays(-7));
    builder.Subject.Contains("Invoice");
    MailQuery query = builder.GetQuery();

    foreach (var messageInfo in folder.EnumerateMessages(query))
    {
        Console.WriteLine(messageInfo.Subject);
    }
}

صفحه‌بندی پیام‌ها

زمانی که یک پوشه تعداد زیادی پیام داشته باشد، می‌توانید آن‌ها را به‌صورت دسته‌ها با EnumerateMessages(int skip, int count) نسخهٔ Overload. متد skip پارامتر تعداد پیام‌های عبور داده‌شده است، و count تعداد پیام‌های بازگردانده‌شده است.

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    const int pageSize = 50;
    int pageIndex = 0;

    while (true)
    {
        var page = folder.EnumerateMessages(pageIndex * pageSize, pageSize).ToList();
        if (page.Count == 0)
        {
            break;
        }

        foreach (var messageInfo in page)
        {
            Console.WriteLine(messageInfo.Subject);
        }

        pageIndex++;
    }
}

استخراج یک پیام به‌عنوان MapiMessage

این OlmStorage کلاس فراهم می‌کند ExtractMapiMessage متد که یک پیام کامل را استخراج می‌کند MapiMessage از یک OlmMessageInfo object. این زمانی مفید است که ابتدا یک پوشه را با EnumerateMessages و سپس فقط پیام‌هایی را استخراج کنید که واقعاً نیاز دارید.

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    foreach (var messageInfo in folder.EnumerateMessages())
    {
        if (messageInfo.Date.Date == DateTime.Today)
        {
            // extract today's messages from Inbox
            var msg = olm.ExtractMapiMessage(messageInfo);
            msg.Save($"{msg.Subject}.msg");
        }
    }
}

استخراج پیام‌ها بر پایه شناسه

گاهی لازم است پیام‌های انتخابی را بر پایه شناسه‌هایشان استخراج کنید. برای مثال، یک برنامه می‌تواند شناسه‌ها را در پایگاه‌داده ذخیره کند و پیام را به‌صورت دلخواه استخراج کند به‌جای اینکه هر بار کل ذخیره‌سازی را پیمایش کند. متد EntryId ویژگی‌ٔ OlmMessageInfo شناسهٔ ورودی پیام را فراهم می‌کند، و نسخهٔ Overloaded ExtractMapiMessage(string id) متد پیام را بر اساس شناسهٔ آن بازیابی می‌کند.

using (var olm = OlmStorage.FromFile(fileName))
{
    var olmFolder = olm.GetFolder("Inbox", true);

    foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
    {
        // store msgInfo.EntryId somewhere, then later:
        MapiMessage msg = olm.ExtractMapiMessage(msgInfo.EntryId);
    }
}

استخراج آیتم‌ها با استفاده از Traversal API

می‌توانید هر آیتمی را از یک فایل OLM استخراج کنید - تا حد امکان - بدون پرتاب استثنا، حتی زمانی که برخی داده‌ها در فایل اصلی خراب باشند. برای این کار، OlmStorage instance با OlmStorage(TraversalExceptionsCallback callback) سازنده و فایل را با Load متد. callback استثناهای بارگذاری و پیمایش را افشا می‌کند.

این Load متد بر می‌گرداند true اگر فایل با موفقیت بارگذاری شد و پیمایش امکان‌پذیر بود، و false اگر فایل خراب باشد و پیمایش ممکن نباشد. توجه داشته باشید که هنگام پیمایش آیتم‌ها پوشه به پوشه، متد storage’s را فراخوانی می‌کنید EnumerateMessages(OlmFolder folder) متد، پوشه را به‌عنوان آرگومان پاس می‌دهد.

مراحل عبارتند از:

  1. ایجاد یک OlmStorage instance، با یک callback برای مدیریت استثناها، دریافت کنید.
  2. فایل OLM را با فراخوانی Load متد.
  3. اگر فایل با موفقیت بارگذاری شد، سلسله‌مراتب پوشه‌ها را با فراخوانی GetFolders.
  4. به‌صورت بازگشتی بر هر پوشه مرور کنید. برای پوشه‌هایی که پیام دارند، آن‌ها را با EnumerateMessages متد و هرکدام را پردازش کنید.
  5. به هر زیرپوشه‌ای بازگشت کنید.
using (var olm = new OlmStorage((exception, id) => { /* Exception handling code. */ }))
{
    if (olm.Load(fileName))
    {
        var folderHierarchy = olm.GetFolders();
        ExtractItems(olm, folderHierarchy);
    }
}

private static void ExtractItems(OlmStorage olm, IEnumerable<OlmFolder> folders)
{
    foreach (var folder in folders)
    {
        if (folder.HasMessages)
        {
            Console.WriteLine(folder);

            foreach (var msg in olm.EnumerateMessages(folder))
            {
                Console.WriteLine(msg.Subject);
            }
        }

        ExtractItems(olm, folder.SubFolders);
    }
}