Đọc tệp MS Outlook PST trong C# .NET

PST (Bảng lưu trữ cá nhân) là định dạng tệp lưu trữ được các chương trình Microsoft khác nhau như MS Outlook, Exchange và Windows Messaging sử dụng. Các tệp PST có khả năng lưu trữ tin nhắn, danh bạ, lịch, sự kiện, v.v. Trong một số trường hợp nhất định, bạn có thể cần phải phân tích cú pháp tệp PST và trích xuất dữ liệu từ nó theo chương trình. Để đạt được điều đó, bài viết này hướng dẫn cách đọc tệp MS Outlook PST bằng C# .NET. Đặc biệt, bạn sẽ học cách trích xuất thông tin của các thư mục, đọc email và tìm nạp danh bạ từ tệp PST.

.NET API để đọc tệp Outlook PST

Aspose.Email for .NET là một API xử lý email mạnh mẽ cho phép bạn tạo và gửi email từ bên trong các ứng dụng .NET. Ngoài ra, nó hỗ trợ làm việc với các định dạng email và tệp lưu trữ phổ biến. Chúng tôi sẽ sử dụng API này để đọc thông tin, tin nhắn và địa chỉ liên hệ của các thư mục từ các tệp PST. Bạn có thể tải xuống API hoặc cài đặt nó qua NuGet.

PM> Install-Package Aspose.Email -Version 22.3.0

Đọc tệp Outlook PST trong C# .NET

Sau đây là các bước để đọc tệp PST và trích xuất thông tin của nó trong C#.

Mẫu mã sau đây cho thấy cách phân tích cú pháp tệp PST và tìm nạp thông tin của các thư mục.

// Tải tệp PST
PersonalStorage personalStorage = PersonalStorage.FromFile("PersonalStorage.pst");

// Nhận thông tin thư mục
FolderInfoCollection folderInfoCollection = personalStorage.RootFolder.GetSubFolders();

// Duyệt qua từng thư mục để hiển thị thông tin của nó
foreach (FolderInfo folderInfo in folderInfoCollection)
{
    Console.WriteLine("Folder: " + folderInfo.DisplayName);
    Console.WriteLine("Total items: " + folderInfo.ContentCount);
    Console.WriteLine("Total unread items: " + folderInfo.ContentUnreadCount);
    Console.WriteLine("-----------------------------------");
}

Đọc email từ tệp PST trong C#

Email là các thực thể chính được MS Outlook lưu trữ trong tệp PST. Vì vậy, chúng ta hãy xem cách đọc email từ tệp PST trong C#.

Mẫu mã sau đây cho thấy cách trích xuất thông báo từ tệp PST trong C# .NET.

// Tải tệp Outlook PST
PersonalStorage pst = PersonalStorage.FromFile("PersonalStorage.pst");

// Nhận Định dạng hiển thị của tệp PST
Console.WriteLine("Display Format: " + pst.Format);

// Nhận thông tin thư mục và tin nhắn
Aspose.Email.Storage.Pst.FolderInfo folderInfo = pst.RootFolder;

// Gọi phương thức đệ quy để trích xuất các tệp tin từ mỗi thư mục
ExtractMsgFiles(folderInfo, pst);

///<summary>
/// Đây là một phương thức đệ quy để hiển thị nội dung của một thư mục
///</summary>
///<param name="folderInfo"></param>
///<param name="pst"></param>
private static void ExtractMsgFiles(Aspose.Email.Storage.Pst.FolderInfo folderInfo, PersonalStorage pst)
{
    // Hiển thị tên thư mục
    Console.WriteLine("Folder: " + folderInfo.DisplayName);
    Console.WriteLine("==================================");
            
    // Lặp lại tất cả các thư trong thư mục này
    Aspose.Email.Storage.Pst.MessageInfoCollection messageInfoCollection = folderInfo.GetContents();
    foreach (Aspose.Email.Storage.Pst.MessageInfo messageInfo in messageInfoCollection)
    {
        Console.WriteLine("Saving message {0} ....", messageInfo.Subject);
                
        // Nhận thông báo trong phiên bản MapiMessage
        MapiMessage message = pst.ExtractMessage(messageInfo);
                
        // Lưu thông báo này vào đĩa ở định dạng tin nhắn
        message.Save(message.Subject.Replace(":", " ") + ".msg");
                
        // Lưu tin nhắn này vào luồng ở định dạng tin nhắn
        MemoryStream messageStream = new MemoryStream();
        message.Save(messageStream);
    }

    // Gọi phương thức này một cách đệ quy cho mỗi thư mục con
    if (folderInfo.HasSubFolders == true)
    {
        foreach (Aspose.Email.Storage.Pst.FolderInfo subfolderInfo in folderInfo.GetSubFolders())
        {
            ExtractMsgFiles(subfolderInfo, pst);
        }
    }
}

Trích xuất Danh bạ từ Tệp PST trong C#

Trong một số trường hợp nhất định, bạn có thể cần trích xuất thông tin của các liên hệ được lưu trữ trong tệp PST. Các bước sau đây trình bày cách truy cập danh bạ trong tệp PST trong C#.

Mẫu mã sau đây cho thấy cách trích xuất danh bạ từ tệp PST trong C#.

// Tải tệp Outlook PST
PersonalStorage personalStorage = PersonalStorage.FromFile("SampleContacts.pst");

// Tải thư mục Danh bạ
FolderInfo folderInfo = personalStorage.RootFolder.GetSubFolder("Contacts");

// Lặp qua tất cả các địa chỉ liên hệ trong thư mục này
MessageInfoCollection messageInfoCollection = folderInfo.GetContents();

foreach (MessageInfo messageInfo in messageInfoCollection)
{
    // Nhận thông tin liên hệ
    MapiMessage mapi = personalStorage.ExtractMessage(messageInfo);
    
    // Truyền tới MapiContact
    MapiContact contact = (MapiContact)mapi.ToMapiMessageItem();

    // Hiển thị một số nội dung trên màn hình
    Console.WriteLine("Name: " + contact.NameInfo.DisplayName);
    
    // Lưu vào đĩa ở định dạng MSG
    if (contact.NameInfo.DisplayName != null)
    {
        MapiMessage message = personalStorage.ExtractMessage(messageInfo);
        
        // Loại bỏ các ký tự bất hợp pháp không thể được sử dụng làm tên tệp
        string messageName = message.Subject.Replace(":", " ").Replace("\\", " ").Replace("?", " ").Replace("/", " ");
        message.Save(dataDir + "Contacts\\" + messageName + "_out.msg");
    }
}

Nhận giấy phép API miễn phí

Bạn có thể dùng thử Aspose.Email for .NET miễn phí bằng cách nhận giấy phép tạm thời.

Sự kết luận

Trong bài viết này, bạn đã học cách đọc các tệp PST theo chương trình trong C# .NET. Hơn nữa, bạn đã thấy cách đọc thông tin thư mục, tìm nạp email và trích xuất danh bạ từ tệp PST trong C#. Bên cạnh đó, bạn có thể khám phá thêm về Aspose.Email for .NET bằng tài liệu. Ngoài ra, bạn có thể chia sẻ câu hỏi hoặc thắc mắc của mình trên diễn đàn của chúng tôi.

Xem thêm