فایل‌های PST MS Outlook را در C#.NET بخوانید

یک موضوع مکالمه دنباله ای از پاسخ ها به یک پیام با موضوع موضوع مشترک است. پیام‌های درون مکالمه را می‌توان به روش‌های مختلفی نمایش داد، مانند ترتیب سلسله مراتبی یا زمانی. برای نمایش یک رشته پیام، برنامه های کاربردی ایمیل، پاسخ های پیام را شناسایی می کنند. محبوب ترین فرمت فایل های ایمیل این ویژگی را فراهم می کند. رشته‌های مکالمه به خوانندگان این امکان را می‌دهند که ساختار کلی یک مکالمه را به سرعت درک کنند، نقاط خاصی از مکالمات را برجسته کنند و اطلاعات مهم را تجزیه و تحلیل کنند. در این مقاله ما بر استفاده از ویژگی‌های PST/MAPI Aspose.Email برای یافتن و گروه‌بندی پیام‌ها بر اساس مکالمه تمرکز خواهیم کرد. برای انجام این کار، یک کد نمونه را پیاده سازی می کنیم که پیام ها را در یک پوشه مشخص می گذراند، آنها را بر اساس مکالمه گروه بندی می کند و سپس هر مکالمه را در یک فهرست دیسک جداگانه ذخیره می کند.

ویژگی های MAPI که برای پشتیبانی از موضوع گفتگو استفاده می شود

از آنجایی که پیام‌ها در pst به‌عنوان مجموعه‌ای از ویژگی‌های MAPI ذخیره می‌شوند، باید ویژگی‌های MAPI را تعریف کنیم که با جمع‌آوری پاسخ‌های پیام مرتبط است. این در بخش اسناد مایکروسافت توضیح داده شده است. همانطور که مشاهده می شود، ویژگی PidTagConversationIndex به شما امکان می دهد تا دقیقاً تعیین کنید که آیا یک پیام با یک مکالمه خاص مرتبط است یا خیر. این ویژگی همچنین موقعیت نسبی پیام را در یک رشته مکالمه نشان می دهد. برای اطلاعات بیشتر در مورد ویژگی «PidTagConversationIndex» [از صفحه 2 دیدن کنید. هدر 22 بایت اول مقدار ویژگی «PidTagConversationIndex» است. این یک بخش داده برای تعیین اینکه آیا پیام به یک رشته مکالمه خاص تعلق دارد یا خیر است.

C#.NET API برای خواندن فایل های Outlook PST

برای خواندن فایل‌های PST، از Aspose.Email for .NET استفاده می‌کنیم. این یک کتابخانه شگفت انگیز برای پیاده سازی برنامه های پردازش ایمیل با استفاده از دات نت است. با استفاده از کتابخانه، به راحتی می توانید فرمت های مختلف فایل ایمیل را مدیریت کنید. می توانید Aspose.Email را برای دات نت از طریق NuGet یا دانلود DLL آن نصب کنید.

PM> Install-Package Aspose.Email

گروه بندی پیام ها در PST بر اساس رشته گفتگو

برای گروه بندی پیام ها در PST بر اساس مکالمات، به موارد زیر نیاز داریم:

  • ابتدا یک کلاس «ConversationThread» ایجاد کنید. این محفظه ای برای گروه بندی پیام ها در یک مکالمه است.
  • سپس، روشی برای جستجو و گروه بندی پیام ها بر اساس مکالمه ایجاد کنید.
  • در نهایت، روشی برای ذخیره رشته گفتگو در یک دایرکتوری جداگانه ایجاد کنید.

یک کلاس ConversationThread ایجاد کنید

خواص زیر را خواهد داشت.

  • “Id”: نمایش رشته ای از هدر فهرست گفتگو (22 بایت).
  • “پیام ها”: لیست شناسه های پیامی که در رشته گفتگو هستند.
///<summary>
/// پیام های درون یک رشته مکالمه را نشان می دهد.
///</summary>
public class ConversationThread
{
    private string id;
    private List<string> messages;
    
    ///<summary>
    /// یک نمونه جدید از را راه اندازی می کند<see cref="ConversationThread"/> کلاس
    ///</summary>
    ///<param name="id"> نمایش رشته هدر نمایه مکالمه.</param>
    public MessageThread(string id)
    {
        this.id = id;
        this.messages = new List<string>();
    }
    
    ///<summary>
    /// نمایش رشته HEX سرصفحه فهرست مکالمه (22 بایت) را دریافت یا تنظیم می کند.
    ///</summary>
    public string Id { get => id; set => id = value; }
    
    ///<summary>
    /// فهرستی از شناسه های پیام را دریافت می کند که در یک رشته مکالمه قرار دارند.
    ///</summary>
    public List<string> Messages { get => messages; }
}

روشی برای جستجو و گروه بندی پیام ها بر اساس مکالمه ایجاد کنید

پس از ایجاد کلاس ConversationThread، می‌توانیم روی نوشتن متدی تمرکز کنیم که کارهای زیر را انجام می‌دهد:

  • تمام پیام های موجود در پوشه را مرور کنید. به دلایل عملکرد، ما فقط شناسه پیام را با استفاده از روش EnumerateMessagesEntryId می خوانیم.
  • برای هر پیام، ویژگی «PidTagConversationIndex» را با استفاده از روش ExtractProperty استخراج می کنیم.
  • پیام‌هایی که دارای همان 22 بایت اول مقدار ویژگی «PidTagConversationIndex» هستند، متعلق به یک مکالمه هستند. شناسه پیام را به لیستی اضافه می‌کنیم که با ویژگی «Messages» نمونه کلاس «ConversationThread» مربوطه نشان داده می‌شود.
  • لیست نمونه های «ConversationThread» را برگردانید.
using Aspose.Email.Mapi;
using Aspose.Email.Storage.Pst;

public List<ConversationThread> GroupMessagesByThread(PersonalStorage pst, FolderInfo folder)
{
    // نتیجه
    var list = new List<ConversationThread>();
        
    foreach (var entryId in folder.EnumerateMessagesEntryId())
    {
        // ویژگی PidTagConversationIndex و مقدار هدر آن (22 بایت) را استخراج کنید.
        var convIndexTag = KnownPropertyList.ConversationIndex.Tag;
        var convIndexProperty = pst.ExtractProperty(Convert.FromBase64String(entryId), convIndexTag);
        var convIndexHeader = (convIndexProperty != null && convIndexProperty.Data != null) ? convIndexProperty.Data.Take(22).ToArray() : null;
        var convIndexHeaderString = convIndexHeader != null ? 
			      BitConverter.ToString(convIndexHeader).Replace('-', '') : null;
        
        if (convIndexHeaderString != null)
        {
            var convThread = list.Find(x => x.Id == convIndexHeaderString);
            
            if (convThread == null)
            {
                convThread = new ConversationThread(convIndexHeaderString);
                convThread.Messages.Add(entryId);
                list.Add(convThread);
            }
            else
            {
                convThread.Messages.Add(entryId);
            }
        }
    }
        
    return list.Where(x => x.Messages.Count > 1).ToList();
}

روشی برای ذخیره رشته گفتگو در دایرکتوری جداگانه ایجاد کنید

در نهایت اجازه دهید مکالمات را در دایرکتوری ها ذخیره کنیم.

برای هر نمونه «ConversationThread»، موارد زیر را انجام دهید:

  • یک دایرکتوری جداگانه با نام موضوع موضوع ایجاد کنید.
  • شناسه ها را در ویژگی «ConversationThread.Messages» برشمارید، برای هر شناسه با استفاده از روش ExtractMessage پیامی را استخراج کنید و با استفاده از روش Save پیام را در فهرست ایجاد شده ذخیره کنید.
public void SaveThreads(List<ConversationThread> list, string outDirectory)
{
    var invalidChars = Path.GetInvalidFileNameChars();
    
    foreach (var item in list)
    {
        string? threadDirectory = null;
        var i = item.Messages.Count - 1;
        
        foreach (var entryId in item.Messages)
        {
            var msg = pst.ExtractMessage(entryId);
            
            if (threadDirectory == null)
            {
                var threadName = new string(msg.ConversationTopic.Where(x => !invalidChars.Contains(x)).ToArray()).Trim();
                threadDirectory = Path.Combine(outDirectory, threadName);
                Directory.CreateDirectory(threadDirectory);
            }
            
            msg.Save(Path.Combine(threadDirectory, $"{i--}.msg"));
        }
        
        threadDirectory = null;
    }
}

مجوز API رایگان دریافت کنید

شما می توانید از Aspose.Email برای دات نت بدون محدودیت ارزیابی با استفاده از [مجوز موقت رایگان] استفاده کنید.

نتیجه

این مقاله نحوه استفاده از Aspose.Email را برای جستجوی پیام های مربوط به مکالمه در PST نشان می دهد. با کاوش بیشتر در اسناد PidTagConversationIndex، همچنین می‌توانید پیاده‌سازی را با افزودن، به عنوان مثال، مرتب‌سازی سلسله مراتبی پیام‌های مکالمه پیچیده کنید. می توانید با استفاده از مستندات درباره Aspose.Email اطلاعات بیشتری کسب کنید. در صورت داشتن هر گونه سوال، می توانید در [فروم 12 ما ارسال کنید.

همچنین ببینید