קרא קבצי MS Outlook PST ב-C# .NET

שרשור שיחה הוא רצף של תשובות להודעה עם נושא שרשור משותף. ניתן להציג הודעות בתוך שיחה בדרכים שונות, כגון בסדר היררכי או כרונולוגי. כדי להציג שרשור הודעה יישומי דוא"ל מזהים תשובות להודעה. הפורמטים הפופולריים ביותר של קבצי דואר אלקטרוני מספקים תכונה זו. שרשורי שיחה מאפשרים לקוראים להבין את המבנה הכללי של שיחה במהירות, להדגיש נקודות מסוימות בשיחות ולנתח מידע חשוב. במאמר זה נתמקד בשימוש בתכונות ה-PST/MAPI של Aspose.Email כדי למצוא ולקבץ הודעות לפי שיחה. לשם כך, ניישם קוד לדוגמה שיעביר את ההודעות בתיקייה נתונה, נקבץ אותן לפי שיחה, ולאחר מכן נשמור כל שיחה בספריית דיסקים נפרדת.

מאפייני MAPI המשמשים לתמיכה בשרשור השיחה

מכיוון שהודעות ב-pst מאוחסנות כקבוצה של מאפייני MAPI, עלינו להגדיר מאפייני MAPI המשויכים לאיסוף תשובות להודעות. זה מתואר ב סעיף Microsoft Docs. כפי שניתן לראות, המאפיין PidTagConversationIndex מאפשר לקבוע במדויק אם הודעה משויכת לשיחה מסוימת או לא. המאפיין מציין גם את מיקום ההודעה היחסית בתוך שרשור שיחה. בקר בדף למידע נוסף על מאפיין PidTagConversationIndex. הכותרת היא 22 הבתים הראשונים של ערך המאפיין PidTagConversationIndex. זהו חלק נתונים כדי לקבוע אם ההודעה שייכת לשרשור שיחה מסוים.

C# .NET API לקריאת קבצי PST של Outlook

כדי לקרוא קבצי PST, נשתמש ב-Aspose.Email for .NET. זוהי ספרייה מדהימה ליישום אפליקציות לעיבוד דואר אלקטרוני באמצעות .NET. באמצעות הספרייה, אתה יכול להתמודד בקלות עם הרבה פורמטים שונים של קבצי דוא"ל. אתה יכול להתקין את Aspose.Email עבור .NET דרך 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’ שייכות לאותה שיחה. נוסיף את זיהוי ההודעה לרשימה המיוצגת על ידי מאפיין ‘הודעות’ של מופע המחלקה ‘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 עבור .NET ללא מגבלות הערכה באמצעות [רישיון זמני חינם].

סיכום

מאמר זה מראה כיצד להשתמש ב-Aspose.Email כדי לחפש הודעות הקשורות לשיחה ב-PST. על ידי חקירה נוספת בתיעוד PidTagConversationIndex תוכל גם לסבך את היישום על ידי הוספת, למשל, מיון היררכי של הודעות השיחה. אתה יכול ללמוד עוד על Aspose.Email באמצעות תיעוד. אם יש לך שאלות כלשהן, אתה יכול לכתוב בפורום שלנו.

ראה גם