יצירת וניהול קבצי PST

חלק מהיכולת לנתח קובץ PST קיים, Aspose.Email מספקת גם אמצעים ליצירת קובץ PST מאפס. מאמר זה מציג כיצד ליצור קבצי Outlook PST ולהוסיף להם תתי‑תיקיות או הודעות.

יצירת קבצי PST

כדי ליצור קובץ PST חדש בדיסק מקומי, יהיה עליך להשתמש ב‑ PersonalStorage מחלקה. עם מחלקה זו, ניתן ליצור, לקרוא ולבצע מניפולציות בקבצי PST ביישומים של .NET. צור קובץ אחסון מאפס עם שורת קוד אחת:

// Create new PST
using var pst = PersonalStorage.Create(path, FileFormatVersion.Unicode);

הוסף תתי-תיקיות ל‑PST

הוסף תיקיית משנה בשורש קובץ ה‑PST על ידי גישה לתיקיית Root ולאחר מכן קריאה ל‑ AddSubFolder שיטה.

הקטע הקוד הבא מציג כיצד להוסיף תיקיית משנה בשם Inbox:

// Add new folder "Test"
pst.RootFolder.AddSubFolder("Inbox");

בדוק את מחלקת המכולה של התיקייה

בעת יצירת תיקיות חדשות או הוספת פריטים לתיקיות קיימות, חשוב לוודא שמחלקת המכולה של הפריט או התיקייה החדשה תתאים למחלקת המכולה של תיקיית האב על מנת לשמור על היררכיית הארגון בקובץ האחסון PST. למטרה זו, Aspose.Email מספקת את EnforceContainerClassMatching מאפיין של FolderCreationOptions מחלקה. המאפיין מציין האם לאכוף בדיקת מחלקת המכולה של התיקייה שמתווספת מול מחלקת המכולה של תיקיית האב. אם מוגדר ל-’true’, ייזרק wyjąט אם מחלקות המכולה אינן תואמות. ברירת המחדל היא ‘false’.

דוגמת הקוד הבאה מדגימה את השימוש ב- EnforceContainerClassMatching מאפיין לבקר האם לזרוק חריגה בעת הוספת תיקיות עם מחלקות קונטיינר לא תואמות:

using (var pst = PersonalStorage.Create("storage.pst", FileFormatVersion.Unicode))
{
    // Create a standard Contacts folder with the IPF.Contacts container class.
    var contacts = pst.CreatePredefinedFolder("Contacts", StandardIpmFolder.Contacts);
    
    // An exception will not arise. EnforceContainerClassMatching is false by default.
    contacts.AddSubFolder("Subfolder1", "IPF.Note");
    
    // An exception will occur as the container class of the subfolder being added (IPF.Note) 
    // does not match the container class of the parent folder (IPF.Contact).
    contacts.AddSubFolder("Subfolder3", new FolderCreationOptions {EnforceContainerClassMatching = true, ContainerClass = "IPF.Note"});
}

הערה: ודאו טיפול נכון בחריגות בעת אכיפת התאמת מחלקת הקונטיינר כדי למנוע התנהגות בלתי צפויה בעת יצירת תיקייה ב-PST.

שינוי מחלקת הקונטיינר של התיקייה

לפעמים נדרש לשנות את מחלקת הקונטיינר של תיקייה. דוגמה נפוצה היא כאשר הודעות מסוגים שונים (פגישות, הודעות, וכו’) מתווספות לאותה תיקייה. במקרים כאלה, יש לשנות את מחלקת התיקייה לכל האיברים בתיקייה כדי להציגם כראוי. קטע הקוד הבא מראה כיצד לשנות את מחלקת הקונטיינר של תיקייה ב-PST למטרה זו.

using var pst = PersonalStorage.FromFile("PersonalStorage1.pst");
var folder = pst.RootFolder.GetSubFolder("Inbox");

folder.ChangeContainerClass("IPF.Note");

הוספת קבצים ל‑PST

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

using (var personalStorage = PersonalStorage.Create(dataDir + "Ps1_out.pst", FileFormatVersion.Unicode))
{
    var folder = personalStorage.RootFolder.AddSubFolder("Files");

    // Add Document.doc file with the "IPM.Document" message class by default.
    folder.AddFile(dataDir + "attachment_1.doc", null);
}

הוספת הודעות לקבצי PST

עם Aspose.Email ניתן להוסיף הודעות לתתי-תיקיות של קובץ PST שיצרת או טעבת. מאמר זה מוסיף שתי הודעות מהדיסק לתת-תיקיית Inbox של PST. השתמש ב- PersonalStorage ו FolderInfo מחלקות להוספת הודעות לקבצי PST. כדי להוסיף הודעות לתיקיית Inbox של קובץ PST:

  1. צור מופע של מחלקת FolderInfo וטען אותו בתכולת תיקיית Inbox.
  2. הוסף הודעות מהדיסק לתיקיית Inbox על ידי קריאה ל- FolderInfo.AddMessage() מתודה. ה‑ FolderInfo המחלקה מציגה את AddMessages מתודה המאפשרת להוסיף מספר גדול של הודעות לתיקייה, מה שמפחית פעולות קלט/פלט לדיסק ומשפר ביצועים.

קטע הקוד שלהלן מציג כיצד להוסיף הודעות לתת-תיקייה בשם Inbox ב-PST.

// Create new PST            
var personalStorage = PersonalStorage.Create(dataDir, FileFormatVersion.Unicode);

// Add new folder "Inbox"
personalStorage.RootFolder.AddSubFolder("Inbox");

// Select the "Inbox" folder
var inboxFolder = personalStorage.RootFolder.GetSubFolder("Inbox");

// Add some messages to "Inbox" folder
inboxFolder.AddMessage(MapiMessage.FromFile(RunExamples.GetDataDir_Outlook() + "MapiMsgWithPoll.msg"));

הוספת הודעות במצב הצטברות עם ביצועים משופרים

הוספת הודעות בודדות ל-PST גורמת ליותר פעולות קלט/פלט לדיסק ועלולה להאט את הביצועים. כדי לשפר ביצועים, ניתן להוסיף הודעות ל-PST במצב מוני כדי למזער פעולות קלט/פלט. AddMessages שיטה מאפשרת להוסיף הודעות במצב הצטברות וניתן להשתמש בה במקרים הבאים. בנוסף, ה‑ MessageAdded אירוע מתרחש כאשר הודעה מתווספת לתיקייה.

הוספת הודעות מ‑PST אחר

כדי להוסיף הודעות מ‑PST אחר, השתמש ב‑ FolderInfo.EnumerateMapiMessages שיטה שמחזירה IEnumerable<MapiMessage>:

using var srcPst = PersonalStorage.FromFile(@"source.pst", false);
using var destPst = PersonalStorage.FromFile(@"destination.pst");

// Get the folder by name
var srcFolder = srcPst.RootFolder.GetSubFolder("SomeFolder");
var destFolder = destPst.RootFolder.GetSubFolder("SomeFolder");

destFolder.MessageAdded += new MessageAddedEventHandler(OnMessageAdded);
destFolder.AddMessages(srcFolder.EnumerateMapiMessages());


// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine($"Added: {e.EntryId}");
}

הוספת הודעות מספרייה

כדי להוסיף הודעות מספרייה, צור את GetMessages(string pathToDir) מתודת iterator בשם שמחזירה IEnumerable<MapiMessage>:

using var pst = PersonalStorage.FromFile(@"storage.pst");
var folder = pst.RootFolder.GetSubFolder("SomeFolder");
folder.MessageAdded += OnMessageAdded;
folder.AddMessages(GetMessages(@"MessageDirectory"));

// Named iterator method to read messages from directory.
static IEnumerable<MapiMessage> GetMessages(string pathToDir)
{
    string[] files = Directory.GetFiles(pathToDir, "*.msg");

    foreach (var file in files)
    {
        yield return MapiMessage.Load(file);
    }
}

// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine($"Added: {e.EntryId}");
}

טעינת הודעות מהדיסק

קטע הקוד הבא מציג כיצד לטעון הודעות מהדיסק.

private static void AddMessagesInBulkMode(string fileName, string msgFolderName)
{
    using (PersonalStorage personalStorage = PersonalStorage.FromFile(fileName))
    {
        FolderInfo folder = personalStorage.RootFolder.GetSubFolder("myInbox");
        folder.MessageAdded += OnMessageAdded;
        folder.AddMessages(new MapiMessageCollection(msgFolderName));
    }
}
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine(e.EntryId);
    Console.WriteLine(e.Message.Subject);
}

מימוש IEnumerable

קטע הקוד הבא מציג כיצד ניתן להשתמש במימוש IEnumerable.

public class MapiMessageCollection : IEnumerable<MapiMessage>
{
    private string path;

    public MapiMessageCollection(string path)
    {
        this.path = path;
    }

    public IEnumerator<MapiMessage> GetEnumerator()
    {
        return new MapiMessageEnumerator(path);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class MapiMessageEnumerator : IEnumerator<MapiMessage>
{
    private readonly string[] files;

    private int position = -1;

    public MapiMessageEnumerator(string path)
    {
        string path1 = RunExamples.GetDataDir_Outlook();
        files = Directory.GetFiles(path1);
    }

    public bool MoveNext()
    {
        position++;
        return (position < files.Length);
    }

    public void Reset()
    {
        position = -1;
    }

    object IEnumerator.Current
    {
        get
        {
            return Current;
        }
    }

    public MapiMessage Current
    {
        get
        {
            try
            {
                return MapiMessage.FromFile(files[position]);
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
    public void Dispose()
    {
    }
}