Миграция данных электронной почты из 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:

Шаги

  1. Определите пути к файлам входного OLM и выходного MBOX файла.
  2. Откройте файл OLM, используя OlmStorage.FromFile.
  3. Создайте MBOX‑writer, используя MboxrdStorageWriter с указанным путём вывода и параметрами.
  4. Получите доступ к папке «Inbox» из файла OLM, используя поиск без учёта регистра.
  5. Пройдитесь по всем сообщениям MAPI в папке «Inbox».
  6. Преобразуйте каждое сообщение MAPI в стандартный объект MailMessage.
  7. Запишите каждое преобразованное сообщение в файл 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.

Ключевые члены

Шаги

  1. Установите пути к файлам исходного OLM и целевого PST.
  2. Откройте архив OLM для чтения и создайте новый PST‑файл для записи.
  3. Получите папки верхнего уровня из архива OLM.
  4. Определите вспомогательную функцию для поиска или создания соответствующей папки в PST по заданному имени.
  5. Определите рекурсивную функцию, которая:
    • создаёт или получает соответствующую папку PST для каждой папки OLM;
    • копирует все сообщения из папки OLM в папку PST;
    • вызывает саму себя для каждой подпапки OLM, поддерживая структуру дерева папок.
  6. Вызовите рекурсивную функцию для всех папок верхнего уровня OLM, используя корневую папку PST в качестве родителя.
  7. Сохраните всю иерархию папок и сообщения в новом 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.

Дополнительные ресурсы

См. также