Чтение и конвертация файлов Outlook
Работа с OST‑файлами
Aspose.Email for .NET предоставляет API для чтения OST‑файлов Microsoft Outlook. Вы можете загрузить OST‑файл с диска или из потока в экземпляр Aspose.Email.Outlook.Pst.PersonalStorage класс для доступа к его содержимому, такому как папки, подпапки и сообщения. Microsoft Outlook создаёт PST‑файл для хранения электронных писем при использовании POP3 или IMAP серверов. В отличие от этого, при работе с Microsoft Exchange создаётся OST‑файл. OST‑файлы также поддерживают больший размер, чем PST‑файлы.
Чтение OST‑файлов
Процесс чтения файла OST с помощью Aspose.Email точно такой же, как чтение файла PST. Один и тот же код может читать как PST, так и OST файлы: просто укажите правильное имя файла в PersonalStorage.FromFile() метод. Ниже приведён фрагмент кода, показывающий, как читать файлы OST.
Конвертация OST в PST
Попробуйте!
Конвертировать электронные письма и архивы сообщений онлайн бесплатно Приложение конвертации Aspose.Email.
Для выполнения других операций с файлами OST, пожалуйста, обратитесь к следующим страницам:
- Чтение файлов PST и получение информации
- Получить информацию о сообщениях из файла Outlook PST
- Извлечение сообщений из файла Outlook PST и сохранение их на диск или в поток в формате MSG
- Получение информации о контактах из файла Outlook PST и сохранение её на диск в формате MSG
Конвертация PST в OST
Конвертация из PST в OST не поддерживается Aspose.Email, поскольку файл OST всегда создаётся Outlook при добавлении учётной записи и синхронизации с почтовым сервером. Разница между PST и OST заключается в том, что PST доступен только локально, а содержимое OST также доступно на почтовом сервере. Поэтому нет необходимости конвертировать PST в OST для локального использования. Однако вы можете импортировать PST в существующую учётную запись с помощью мастера импорта/экспорта в Outlook.
OLM — это специальный формат файлов, используемый Microsoft Outlook для хранения локальных данных, таких как электронные письма, вложения, заметки, данные календаря, контакты, задачи, история и многое другое. Файлы OLM совместимы только с Outlook для Mac и не могут быть открыты или доступны в Outlook для Windows, который использует формат PST.
Работа с OLM файлами
Открытие OLM файлов
Файлы формата OLM можно открыть двумя способами:
- использование конструктора
- использование статического метода FromFile
Поведение этих методов различается. См. раздел ниже.
Использование конструктора
Чтобы открыть файл, вызовите конструктор OlmStorage класс и передайте полное имя файла или поток в качестве аргумента:
var fileName = "MyStorage.olm";
var olm = new OlmStorage(fileName);
Использование статического метода FromFile
Чтобы открыть файл, используйте статический метод FromFile и передайте полное имя файла или поток в качестве аргумента:
var fileName = "MyStorage.olm";
var olm = OlmStorage.FromFile(fileName);
Получение папок
Чтобы получить доступ к структуре каталогов OLM‑файла, создайте экземпляр OlmStorage класс, используя его конструктор и передав путь к файлу. После открытия файла получите доступ к его структуре каталогов с помощью FolderHierarchy свойству. Это свойство возвращает список OlmFolder объекты, каждый из которых представляет каталог в файле OLM. Чтобы дальше изучать структуру каталогов, обратитесь к SubFolders свойство каждого объекта, которое возвращает список его подпапок. Используя эти свойства, вы можете перемещаться по всей иерархии каталогов файла OLM и получать доступ ко всем содержащимся в нём каталогам и подпапкам.
Приведённый ниже пример отображает список всех папок в иерархическом порядке:
using (var olm = new OlmStorage(fileName))
{
PrintAllFolders(olm.FolderHierarchy, string.Empty);
}
private void PrintAllFolders(List<OlmFolder> folderHierarchy, string indent)
{
foreach (var folder in folderHierarchy)
{
Console.WriteLine($"{indent}{folder.Name}");
PrintAllFolders(folder.SubFolders, indent+"-");
}
}
При использовании FromFile метод, чтобы открыть файл OLM, FolderHierarchy свойство не будет инициализировано по умолчанию и будет возвращать null. В этом случае необходимо явно вызвать метод GetFolders для инициализации FolderHierarchy свойство и получить список каталогов в файле OLM:
using (var olm = OlmStorage.FromFile(fileName))
{
var folders = olm.GetFolders();
}
Также можно получить любую папку по имени:
- Вызвать GetFolder метод.
- Передайте имя папки в качестве первого аргумента и значение, указывающее, следует ли игнорировать регистр при поиске папки, во втором параметре.
using (var olm = OlmStorage.FromFile(fileName))
{
// get inbox folder by name
OlmFolder folder = olm.GetFolder("Inbox", true);
}
Список писем
OlmFolder класс, представляющий папку, имеет следующие методы для получения списка писем:
- EnumerateMessages реализует итерацию электронных писем в папке. В этом случае каждая итерация возвращает OlmMessageInfo объект, предоставляющий краткую информацию о письме.
- EnumerateMapiMessages, также реализует итерацию электронных писем в папке, но в этом случае каждая итерация возвращает MapiMessage объект, представляющий само электронное письмо со всеми свойствами.
Использование метода EnumerateMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine(messageInfo.Subject);
}
}
Использование метода EnumerateMapiMessages
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var msg in folder.EnumerateMapiMessages())
{
// save message in MSG format
msg.Save($"{msg.Subject}.msg");
}
}
Другие полезные свойства
Другие полезные свойства класса OlmFolder: HasMessages и MessageCount свойства, которые возвращают наличие сообщений в папке и их количество.
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
if (folder.HasMessages)
{
Console.WriteLine($"Message count: {folder.MessageCount}");
}
}
Получить или установить дату изменения сообщения
Дата изменения представляет собой дату и время последнего изменения OLM‑сообщения. Вы можете использовать OlmMessageInfo.ModifiedDate свойство для получения или обновления значения даты изменения OLM‑сообщения.
Вот пример, демонстрирующий использование свойства:
foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
DateTime modifiedDate = messageInfo.ModifiedDate;
}
Извлечение писем и элементов
OlmStorage класс имеет ExtractMapiMessage метод, позволяющий извлекать электронные письма. Этот метод принимает OlmMessageInfo объекта.
using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
if (messageInfo.Date == DateTime.Today)
{
// Extracts today's messages form Inbox
var msg = olm.ExtractMapiMessage(messageInfo);
}
}
}
Использование Traversal API
Вы можете извлечь все элементы из файла Outlook OLM насколько это возможно, не выбрасывая исключения, даже если некоторые данные оригинального файла повреждены. Для этого используйте OlmStorage(TraversalExceptionsCallback callback) конструктор и Load(string fileName) метод вместо метода FromFile. Конструктор позволяет задать метод обратного вызова.
using (var olm = new OlmStorage((exception, id) => { /* Exception handling code. */ }))
Метод обратного вызова делает доступными исключения загрузки и обхода.
Этот Load метод возвращает ’true’, если файл успешно загружен и дальнейший обход возможен. Если файл повреждён и обход невозможен, возвращается ‘false’.
if (olm.Load(fileName))
Ниже приведён фрагмент кода и шаги, показывающие, как использовать этот API:
- Создайте новый экземпляр OlmStorage класс, передавая обратный вызов для обработки исключений, возникших в процессе.
- Загрузите файл OLM, вызвав Load метод экземпляра OlmStorage.
- Если файл OLM успешно загружен, получите иерархию папок, вызвав GetFolders метод у экземпляра OlmStorage. Он возвращает список объектов OlmFolder.
- Вызовите метод ExtractItems, передавая экземпляр OlmStorage и список объектов OlmFolder.
- В методе ExtractItems пройдитесь по каждой папке в списке папок.
- Если папка содержит сообщения (электронные письма), выведите название папки в консоль, используя Console.WriteLine(folder).
- Итерируйтесь по сообщениям в текущей папке, вызывая метод EnumerateMessages у экземпляра OlmStorage, передавая текущую папку в качестве аргумента.
- Выведите тему каждого сообщения в консоль, используя Console.WriteLine(msg.Subject).
- Если у папки есть подпапки, рекурсивно вызовите метод ExtractItems снова, передавая экземпляр OlmStorage и подпапки текущей папки.
using (var olm = new OlmStorage((exception, id) => { /* Exception handling code. */ }))
{
if (olm.Load(fileName))
{
var folderHierarchy = olm.GetFolders();
ExtractItems(olm, folderHierarchy);
}
}
private static void ExtractItems(OlmStorage olm, List<OlmFolder> folders)
{
foreach (var folder in folders)
{
if (folder.HasMessages)
{
Console.WriteLine(folder);
foreach (var msg in olm.EnumerateMessages(folder))
{
Console.WriteLine(msg.Subject);
}
}
if (folder.SubFolders.Count > 0)
{
ExtractItems(olm, folder.SubFolders);
}
}
}
Извлечение сообщений по идентификаторам
Иногда требуется извлекать выбранные сообщения по идентификаторам. Например, ваше приложение хранит идентификаторы в базе данных и извлекает сообщение по запросу. Это эффективный способ избежать обхода всего хранилища каждый раз для поиска конкретного сообщения. Эта функция доступна для хранилищ OLM. EntryId свойство OlmMessageInfo класс получает идентификатор записи сообщения. Перегруженный ExtractMapiMessage(string id) метод OlmStorage класс получает сообщение из OLM.
Код ниже показывает, как извлечь сообщения из OLM по идентификаторам.
Код выполняет следующие шаги:
- Запускает цикл foreach для перебора списка OlmMessageInfo объекты. Цикл использует EnumerateMessages метод объекта olmFolder для получения списка всех сообщений в текущей обрабатываемой папке.
- Цикл извлекает соответствующий объект MapiMessage из хранилища, вызывая ExtractMapiMessage(string id) метод OlmStorage класс, передавая EntryId текущего сообщения в качестве параметра.
Полученный объект MapiMessage можно использовать для доступа к содержимому сообщения и его изменения. Цикл продолжается, пока все сообщения в папке не будут обработаны.
foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
{
MapiMessage msg = storage.ExtractMapiMessage(msgInfo.EntryId);
}
Получение пути к папке
Вы также можете получить путь к папкам в файле OML. Aspose.Email предоставляет OlmFolder.Path свойство, которое возвращает путь к папке. Следующий фрагмент кода демонстрирует использование OlmFolder.Path свойство для получения путей к папкам в файле OML.
var storage = new OlmStorage("SampleOLM.olm");
PrintPath(storage, storage.FolderHierarchy);
public static void PrintPath(OlmStorage storage, List<OlmFolder> folders)
{
foreach (OlmFolder folder in folders)
{
// print the current folder path
Console.WriteLine(folder.Path);
if (folder.SubFolders.Count > 0)
{
PrintPath(storage, folder.SubFolders);
}
}
}
Подсчёт элементов в папке
Вы также можете подсчитать количество элементов в папке. Aspose.Email предоставляет OlmFolder.MessageCount свойство, которое возвращает количество элементов в папке. Следующий фрагмент кода демонстрирует использование OlmFolder.MessageCount свойство для получения количества элементов в папках файла OML.
var storage = new OlmStorage("SampleOLM.olm");
PrintMessageCount(storage.FolderHierarchy);
public static void PrintMessageCount(List<OlmFolder> folders)
{
foreach (OlmFolder folder in folders)
{
Console.WriteLine("Message Count [" + folder.Name + "]: " + folder.MessageCount);
}
}
Получить общее количество элементов в OlmStorage
OlmStorage класс также имеет GetTotalItemsCount() метод, который возвращает общее количество сообщений, содержащихся в хранилище OLM.
using (var olm = new OlmStorage("storage.olm"))
{
var count = olm.GetTotalItemsCount();
}
Получение цветов категорий Outlook
Для работы с цветами категорий или категориями элементов Outlook, хранящимися в OLM‑файлах, Aspose.Email предлагает следующие решения:
- OlmItemCategory класс – представляет категории элементов Outlook, доступные по их имени и соответствующим цветам в шестнадцатеричном формате.
- GetCategories() метод OlmStorage класс – получает список категорий.
Следующий пример кода демонстрирует, как получить все используемые категории из хранилища OML:
using (var olm = OlmStorage.FromFile("storage.olm"))
{
var categories = olm.GetCategories();
foreach (var category in categories)
{
Console.WriteLine($"Category name: {category.Name}");
//Color is represented as a hexadecimal value: #rrggbb
Console.WriteLine($"Category color: {category.Color}");
}
}
Пример кода ниже показывает, как получить цвет категории сообщения:
foreach (var msg in olm.EnumerateMessages(folder))
{
if (msg.Categories != null)
{
foreach (var msgCategory in msg.Categories)
{
Console.WriteLine($"Category name: {msgCategory}");
var categoryColor = cat.First(c => c.Name.Equals(msgCategory, StringComparison.OrdinalIgnoreCase)).Color;
Console.WriteLine($"Category color: {categoryColor}");
}
}
}
Конвертировать OLM в PST
OLM это формат файлов базы данных, используемый Microsoft Outlook для macOS. OLM‑файлы хранят электронные письма, данные календаря, контакты и настройки приложений. OLM‑файл не поддерживается Outlook для Windows. Поэтому открыть файл Outlook для Mac (OLM) в Outlook для Windows невозможно. Если вы хотите перенести почтовый ящик из Outlook для Mac в Outlook для Windows, необходимо конвертировать OLM‑файл Outlook для Mac в формат PST Outlook.
Шаги кода
Чтобы конвертировать OLM‑файл в PST, выполните следующие шаги:
- Создайте экземпляр OlmStorage класс для открытия исходного OLM.
- Откройте исходный OLM‑файл.
- Создайте новый PST‑файл с помощью Create метод.
- Создайте метод GetContainerClass для сопоставления класса сообщения с классом папки.
- Создайте метод AddToPst, который рекурсивно читает каждую папку и её сообщения из OLM с помощью метода EnumerateMapiMessages и добавляет их в PST в том же порядке, используя методы AddSubFolder и AddMessage.
Пример кода
Следующий пример кода показывает, как конвертировать OLM в PST.
Метод Main:
// create an instance of OlmStorage class to open source OLM
using (var olm = new OlmStorage("my.olm"))
// create a new PST file
using (var pst = PersonalStorage.Create("my.pst", FileFormatVersion.Unicode))
{
// recursively reads each folder and its messages
// and adds them to the PST in the same order
foreach (var olmFolder in olm.FolderHierarchy)
{
AddToPst(pst.RootFolder, olmFolder);
}
}
Реализация метода GetContainerClass:
public string GetContainerClass(string messageClass)
{
if (messageClass.StartsWith("IPM.Contact") || messageClass.StartsWith("IPM.DistList"))
{
return "IPF.Contact";
}
if (messageClass.StartsWith("IPM.StickyNote"))
{
return "IPF.StickyNote";
}
if (messageClass.StartsWith("IPM.Activity"))
{
return "IPF.Journal";
}
if (messageClass.StartsWith("IPM.Task"))
{
return "IPF.Task";
}
if (messageClass.StartsWith("IPM.Appointment") || messageClass.StartsWith("IPM.Schedule.meeting"))
{
return "IPF.Appointment";
}
return "IPF.Note";
}
Реализация метода AddToPst:
public void AddToPst(FolderInfo pstFolder, OlmFolder olmFolder)
{
FolderInfo pstSubFolder = pstFolder.GetSubFolder(olmFolder.Name);
foreach (var msg in olmFolder.EnumerateMapiMessages())
{
if (pstSubFolder == null)
{
pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name, GetContainerClass(msg.MessageClass));
}
pstSubFolder.AddMessage(msg);
}
if (pstSubFolder == null)
{
pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name);
}
foreach (var olmSubFolder in olmFolder.SubFolders)
{
AddToPst(pstSubFolder, olmSubFolder);
}
}