Чтение файлов PST и получение информации
Чтение файлов PST и извлечение информации
Aspose.Email для .NET предоставляет API для чтения файлов Microsoft Outlook PST. Вы можете загрузить PST‑файл с диска или из потока в экземпляр PersonalStorage класс и получить информацию о его содержимом, например, папки, подпапки и сообщения. API также предоставляет возможность включать поисковые папки при обходе сообщений из папок PST.
Загрузка файла PST
Файл Outlook PST можно загрузить в экземпляре PersonalStorage class. Следующий фрагмент кода показывает, как загрузить PST‑файл.
Отображение информации о папках
После загрузки файла PST в PersonalStorage класс, вы можете получить информацию о отображаемом имени файла, корневой папке, подпапках и количестве сообщений. В следующем фрагменте кода показано, как отобразить название файла PST, папки и количество сообщений в папках.
Получить только пользовательские папки
Файлы PST/OST могут содержать папки, созданные пользователем. Aspose.Email предоставляет возможность доступа только к пользовательским папкам с помощью PersonalStorageQueryBuilder.OnlyFoldersCreatedByUser свойства. Вы можете установить PersonalStorageQueryBuilder.OnlyFoldersCreatedByUser свойство установить в true, чтобы получить только пользовательские папки. Ниже пример кода, показывающий использование PersonalStorageQueryBuilder.OnlyFoldersCreatedByUser для получения пользовательских папок.
Проверка, является ли папка предопределённой
При открытии и проверке папок в файле PST (Personal Storage Table) вы можете определить, является ли каждая папка предопределённым типом папки или её подпапкой, и получить информацию о каждой папке.
Этот FolderInfo.GetPredefinedType(bool getForTopLevelParent) метод позволяет проверить, относится ли папка к StandardIpmFolder. Если параметр getForTopLevelParent равен true, метод возвращает StandardIpmFolder значение enum для родительской папки верхнего уровня. Это определяет, является ли текущая папка подпапкой предопределённой папки. Если параметр getForTopLevelParent равен false, он возвращает StandardIpmFolder значение enum для текущей папки.
Следующий пример кода показывает, как внедрить эту функцию в ваш проект:
PersonalStorage.FromFile("my.pst"))
{
FolderInfoCollection folders = pst.RootFolder.GetSubFolders();
foreach (FolderInfo folder in folders)
{
Console.WriteLine($"Folder: {folder.DisplayName}");
Console.WriteLine($"Is predefined: {folder.GetPredefinedType(false) != StandardIpmFolder.Unspecified}");
Console.WriteLine("-----------------------------------");
}
}
Получить информацию о родительской папке
Следующий пример кода показывает, как получить информацию о родительской папке из MessageInfo.
Получить подпапку по пути
Этот FolderInfo.GetSubFolder(string name, bool ignoreCase, bool handlePathSeparator) Перегрузка метода позволит вам получить подпапку с указанным именем из текущей PST‑папки.
Метод принимает следующие параметры:
- name — указывает имя подпапки, которую нужно получить.
- ignoreCase — определяет, должен ли поиск имени подпапки учитывать регистр. Если установлено значение true, поиск будет нечувствительным к регистру, иначе — чувствительным к регистру.
- handlePathSeparator — указывает, следует ли рассматривать указанное имя папки как путь, если оно содержит обратные слэши. Если установлено значение true, метод будет интерпретировать имя папки как путь, пытаясь перейти к подпапке по этому пути. Если установлено значение false, метод будет рассматривать имя папки как простое имя и искать подпапку с точным совпадением имени.
Следующий пример кода демонстрирует, как реализовать этот метод в вашем проекте:
var folder = pst.RootFolder.GetSubFolder(@"Inbox\Reports\Jan", true, true);
In this sample, the method will return a ‘Jan’ named folder that is located at the Inbox\Reports\ path relative to the root folder.
RSS-ленты и поисковые папки
Стандартная папка RSS Feeds в PersonalStorage
Aspose.Email позволяет получить ссылку на предопределённую папку, содержащую RSS‑ленты. Это может быть полезно, если вы хотите программно получать доступ к RSS‑лентам, хранящимся в Outlook PST‑файле, и управлять ими. Передайте значение RssFeeds в StandardIpmFolder enum.
Следующий пример кода показывает, как получить папку RSS Feeds.
using (var pst = PersonalStorage.FromFile("my.pst", false))
{
var rssFolder = pst.GetPredefinedFolder(StandardIpmFolder.RssFeeds);
}
Чтобы добавить папку RSS Feeds, используйте следующий фрагмент кода:
using (var pst = PersonalStorage.Create("my.pst", FileFormatVersion.Unicode))
{
var rssFolder = pst.CreatePredefinedFolder("RSS Feeds", StandardIpmFolder.RssFeeds);
}
Разбор поисковых папок
PST/OST может содержать поисковые папки в дополнение к обычным типам папок. Aspose.Email предоставляет FolderKind перечислитель для указания сообщений из таких поисковых папок с помощью EnumerateFolders и GetSubFolders методы. В следующем фрагменте кода показано, как разбирать поисковые папки.
using (PersonalStorage pst = PersonalStorage.FromFile("my.pst"))
{
FolderInfoCollection folders = pst.RootFolder.GetSubFolders(FolderKind.Search | FolderKind.Normal);
// Browse through each folder to display folder name and number of messages
foreach (FolderInfo folder in folders)
{
Console.WriteLine($"Folder: {folder.DisplayName}");
FolderInfoCollection subFolders = folder.GetSubFolders(FolderKind.Search | FolderKind.Normal);
foreach (FolderInfo subFolder in subFolders)
{
Console.WriteLine($"Sub-folder: {subFolder.DisplayName}");
}
}
}
API обхода файлов PST
API обхода позволяет извлекать все элементы PST насколько это возможно, без выброса исключений, даже если некоторые данные исходного файла повреждены. Ниже показаны шаги по использованию этого API.
Использовать PersonalStorage конструктор и Load метод вместо метода FromFile.
Конструктор позволяет определить метод обратного вызова.
using (var currentPst = new PersonalStorage((exception, itemId) => { /* Exception handling code. */ }))
Исключения при загрузке и обходе будут доступны через метод обратного вызова.
Этот Load метод возвращает ’true’, если файл успешно загружен и дальнейший обход возможен. Если файл повреждён и обход невозможен, возвращается ‘false’.
if (currentPst.Load(inputStream))
Это позволяет открывать и обходить даже повреждённые файлы PST без вызова исключений. Исключения и повреждённые элементы будут обрабатываться методом обратного вызова.
using (PersonalStorage pst = new PersonalStorage((exception, itemId) => { /* Exception handling code. */ }))
{
if (pst.Load(@"test.pst"))
{
GetAllMessages(pst, pst.RootFolder);
}
}
private static void GetAllMessages(PersonalStorage pst, FolderInfo folder)
{
foreach (var messageEntryId in folder.EnumerateMessagesEntryId())
{
MapiMessage message = pst.ExtractMessage(messageEntryId);
}
foreach (var subFolder in folder.GetSubFolders())
{
GetAllMessages(pst, subFolder);
}
}
Получить цвета категорий элементов из файлов PST
Aspose.Email позволяет пользователям получать информацию о категориях, включая имена и цвета, из файлов PST. Данные о категориях могут быть извлечены и сопоставлены с отдельными элементами PST. Используйте следующие члены API:
- OutlookCategoryColor enum — представляет цвет, связанный с категорией.
- PstItemCategory класс — предоставляет свойства имени категории и её цвета.
- GetCategories метод — возвращает список категорий с их именами и цветами.
Следующие примеры кода демонстрируют, как получить все доступные категории из файла PST и сопоставить их с конкретным электронным письмом.
Получить доступные категории из PST
using (var pst = PersonalStorage.FromFile("mailbox.pst"))
{
var categories = pst.GetCategories();
foreach(var category in categories)
{
Console.WriteLine(category);
}
}
Соответствие имени категории её цвету
using (var pst = PersonalStorage.FromFile("mailbox.pst"))
{
// Get all categories from the PST
var availableCategories = pst.GetCategories();
// Extract a message from the PST and retrieve the list of category names for the message
var messageCategoryList = FollowUpManager.GetCategories(pst.ExtractMessage(messageInfo));
// Iterate through each category in the message and match it with the PST category list
foreach (var messageCategory in messageCategoryList)
{
var category = availableCategories.Find(c => c.Name.Equals(messageCategory, StringComparison.OrdinalIgnoreCase));
if (category != null)
{
// Print the category name and its associated color
Console.WriteLine(category);
}
else
{
Console.WriteLine($"Category: {messageCategory}, Color: Not found");
}
}
}