Миграция данных электронной почты из Outlook for Mac (OLM) в широко поддерживаемые форматы, такие как MBOX (для Thunderbird / Unix почтовых ящиков) и PST (Outlook для Windows), является распространённой задачей при переходе между платформами. Microsoft Outlook for Mac использует формат OLM (Outlook for Mac Data File) для хранения писем, контактов, календарей и других элементов. Однако перенос этих данных в среды на базе Windows или в другие почтовые клиенты часто требует конвертации файлов OLM в универсально поддерживаемые форматы, такие как MBOX (используемый клиентами, например, Thunderbird и Apple Mail) или PST (Outlook Personal Storage Table для Windows).
В этой статье мы покажем, как конвертировать файлы OLM в форматы PST и MBOX на C# с использованием Aspose.Email for .NET, мощного API, который упрощает сложные задачи миграции электронной почты программно. Вы узнаете, как открыть файлы OLM, извлечь сообщения, сохранить иерархию папок и создать переносимые архивы электронной почты для различных платформ.
Использование Aspose.Email for .NET для конвертации
[Aspose.Email for .NET][] предоставляет комплексные возможности для работы с различными форматами электронной почты, включая OLM, MBOX и PST. Он упрощает сложные задачи конвертации благодаря интуитивному API и обширной документации. Ниже мы пройдемся по шагам преобразования OLM в MBOX и PST с использованием C#.
Чтобы начать, установите пакет Aspose.Email NuGet в ваш проект .NET:
Install-Package Aspose.Email
Этот пакет включает все необходимые классы для работы с файлами OLM, MBOX и PST.
Конвертировать OLM в MBOX
Формат MBOX хранит электронные сообщения как конкатенированные MIME‑записи, обычно используемый открытыми почтовыми клиентами. Ниже приведён простой, но эффективный пример кода, преобразующего все сообщения из папки OLM в файл MBOX. Он использует следующие члены API:
- OlmStorage.FromFile(…) – Открывает архив OLM и предоставляет доступ к его древу папок и элементам. Вы можете использовать его для перечисления папок или извлечения сообщений из файла OLM.
- GetFolder(string name, bool ignoreCase) – Возвращает OlmFolder для запрошенного имени папки.
- OlmFolder.EnumerateMapiMessages() – Итерирует элементы MapiMessage в этой папке.
- MapiMessage.ToMailMessage(MailConversionOptions) – Преобразует MapiMessage в MailMessage (MIME).
- MboxrdStorageWriter.WriteMessage(MailMessage) – Записывает MIME MailMessage в поток MBOX.
Шаги
- Определите пути к файлам входного OLM и выходного MBOX файла.
- Откройте файл OLM, используя
OlmStorage.FromFile. - Создайте MBOX‑writer, используя
MboxrdStorageWriterс указанным путём вывода и параметрами. - Получите доступ к папке «Inbox» из файла OLM, используя поиск без учёта регистра.
- Пройдитесь по всем сообщениям MAPI в папке «Inbox».
- Преобразуйте каждое сообщение MAPI в стандартный объект
MailMessage. - Запишите каждое преобразованное сообщение в файл MBOX.
Пример кода
var olmPath = @"C:\data\archive.olm";
var mboxPath = @"C:\data\output.mbox";
// Load OLM file using OlmStorage
using (var olm = OlmStorage.FromFile(olmPath))
using (var mboxWriter = new MboxrdStorageWriter(mboxPath, new MboxSaveOptions()))
{
// Get the folder (case-insensitive example)
var inbox = olm.GetFolder("Inbox", true);
// Iterate MAPI messages (returns MapiMessage objects)
foreach (MapiMessage mapi in inbox.EnumerateMapiMessages())
{
// Convert to MailMessage and write to MBOX
var mail = mapi.ToMailMessage(new MailConversionOptions());
mboxWriter.WriteMessage(mail);
}
}
Примечание:
Если вам нужен отдельный MBOX для каждой папки, создайте отдельный writer для каждой папки OLM.
Если предпочтительнее один архив, переиспользуйте один экземпляр MboxrdStorageWriter и вызывайте WriteMessage многократно, как показано в примере кода выше.
Конвертация OLM в PST
Преобразование OLM в PST часто требует не только копирования сообщений, но и воссоздания иерархии папок. Приведённый ниже пример кода демонстрирует, как конвертировать и скопировать структуру папок и сообщения из архива Outlook OLM в файл Unicode PST с использованием Aspose.Email for .NET.
Ключевые члены
- PersonalStorage.Create(path, FileFormatVersion.Unicode) — создаёт новый файл Unicode PST и возвращает экземпляр PersonalStorage. Используйте PersonalStorage.Load(…) для открытия существующих PST. Класс PersonalStorage является точкой входа для работы с PST‑файлами.
- PersonalStorage.RootFolder — предоставляет корневой объект FolderInfo PST. Используйте FolderInfo.AddSubFolder(name) для создания подпапок. FolderInfo.GetSubFolders() возвращает дочерние элементы, что позволяет проверить, существует ли уже папка с таким именем.
- OlmStorage.GetFolders() — возвращает коллекцию верхнего уровня OlmFolder (иерархию папок OLM). Свойство OlmFolder.SubFolders содержит дочерние элементы (для рекурсивного обхода).
- OlmFolder.EnumerateMapiMessages() — выдаёт экземпляры MapiMessage.
- FolderInfo.AddMessage(MapiMessage) — добавляет MapiMessage в папку PST.
Шаги
- Установите пути к файлам исходного OLM и целевого PST.
- Откройте архив OLM для чтения и создайте новый PST‑файл для записи.
- Получите папки верхнего уровня из архива OLM.
- Определите вспомогательную функцию для поиска или создания соответствующей папки в PST по заданному имени.
- Определите рекурсивную функцию, которая:
- создаёт или получает соответствующую папку PST для каждой папки OLM;
- копирует все сообщения из папки OLM в папку PST;
- вызывает саму себя для каждой подпапки OLM, поддерживая структуру дерева папок.
- Вызовите рекурсивную функцию для всех папок верхнего уровня OLM, используя корневую папку PST в качестве родителя.
- Сохраните всю иерархию папок и сообщения в новом PST‑файле, сохранив данные MAPI.
Пример кода
var olmPath = @"C:\data\archive.olm";
var pstPath = @"C:\data\output.pst";
// Create a new PST file
using (var olm = OlmStorage.FromFile(olmPath))
using (var pst = PersonalStorage.Create(pstPath, FileFormatVersion.Unicode))
{
// Get top-level folders in OLM
var rootFolders = olm.GetFolders();
// Helper: map OlmFolder -> FolderInfo in PST by recursively creating subfolders
FolderInfo GetOrCreatePstFolder(FolderInfo parentPstFolder, string folderName)
{
// Try to find existing subfolder (case-insensitive)
foreach (var sub in parentPstFolder.GetSubFolders())
{
if (string.Equals(sub.DisplayName, folderName, StringComparison.OrdinalIgnoreCase))
return sub;
}
// Create new subfolder
return parentPstFolder.AddSubFolder(folderName);
}
// Recursive traversal
void ProcessOlmFolder(OlmFolder olmFolder, FolderInfo pstParent)
{
// Create / get the corresponding PST folder
var pstFolder = GetOrCreatePstFolder(pstParent, olmFolder.Name);
// Copy messages: OlmFolder.EnumerateMapiMessages returns MapiMessage instances
foreach (var mapi in olmFolder.EnumerateMapiMessages())
{
// AddMessage preserves MAPI data into PST
pstFolder.AddMessage(mapi);
}
// Recurse into OLM subfolders (OlmFolder.SubFolders property)
foreach (var child in olmFolder.SubFolders)
{
ProcessOlmFolder(child, pstFolder);
}
}
// Note: PST.RootFolder exists; create top-level folders under it.
foreach (var top in rootFolders)
{
// Skip creating a duplicate for default PST root folder names if needed
ProcessOlmFolder(top, pst.RootFolder);
}
}
Важно: недавно созданный PST уже включает папку Deleted Items по умолчанию — поэтому будьте осторожны, чтобы не дублировать стандартные папки.
Примечание:
Сохранение типов папок: подпапки OLM могут соответствовать определённым специальным папкам Outlook (Входящие, Отправленные, Календарь). Если нужно создать предопределённые IPM‑папки (чтобы Outlook распознавал их как стандартные папки), используйте PersonalStorage.CreatePredefinedFolder или GetPredefinedFolder в зависимости от сценария. CreatePredefinedFolder возвращает объект FolderInfo. При необходимости используйте перечисление StandardIpmFolder.
Производительность: AddMessages (массовое >добавление) быстрее, чем множество вызовов AddMessage. Рассмотрите возможность сбора сообщений в пакеты и использования FolderInfo.AddMessages(IEnumerable) для снижения ввода‑вывода на диск.
Заключение
В этой статье мы узнали, как конвертировать файлы Outlook for Mac (OLM) в форматы PST и MBOX на C# с использованием Aspose.Email for .NET. Мы рассмотрели, как открывать и обрабатывать архивы OLM, извлекать сообщения и сохранять иерархию папок при экспорте данных в новые форматы хранения почты. С помощью Aspose.Email API разработчики могут легко автоматизировать кроссплатформенную миграцию электронной почты, обеспечивая совместимость между Outlook for Mac, Outlook for Windows и клиентами с открытым исходным кодом, такими как Thunderbird.
Для получения дополнительной информации ознакомьтесь с документацией Aspose.Email и справочником API.
