Ler Arquivo OLM do Outlook para Mac & Obter Informações de Pastas e Subpastas

OLM (Outlook for Mac Archive) é um formato de arquivo associado ao Microsoft Outlook para Mac. Ele é usado para arquivar e armazenar mensagens de e‑mail, contatos, itens de calendário, tarefas e outros dados do Outlook em computadores Mac. Os arquivos OLM servem como formato de backup ou arquivo, permitindo que os usuários salvem seus dados do Outlook para Mac para referência futura ou migração. É importante observar que os arquivos OLM são específicos do Outlook para Mac e não são compatíveis com o formato PST (Personal Storage Table) usado pelo Outlook no Windows. Se precisar transferir dados do Outlook entre diferentes plataformas, ferramentas de conversão serão úteis. Aspose.Email oferece essas ferramentas, incluindo abertura, leitura e outras funcionalidades para trabalhar com arquivos OLM.

Abrindo arquivos no formato OLM

Arquivos no formato OLM podem ser abertos de duas maneiras:

  • usando o construtor
  • usando o método estático ‘from_file’

Abrindo arquivos pelo construtor

Para abrir um arquivo, chame o construtor da OlmStorage classe e passe o nome completo do arquivo ou stream como argumento para ele:

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)

Abrindo arquivos usando o método estático FromFile

Para abrir um arquivo, use o método estático ‘from_file’ da OlmStorage classe e passe o nome completo do arquivo ou stream como argumento para ele:

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)

Obtendo pastas

Você pode visualizar e exibir a hierarquia de pastas recuperada de um arquivo OLM usando a função ‘print_all_folders’. Ela recebe a propriedade ‘folder_hierarchy’ da OlmStorage a classe e um nível de identação como entrada, então percorre recursivamente a hierarquia para imprimir o nome de cada pasta com a identação apropriada. O exemplo de código abaixo demonstra como usar esta função para exibir a hierarquia de pastas de um arquivo OLM. Ele exibe a lista de todas as pastas em ordem hierárquica:

import aspose.email as ae


def print_all_folders(folder_hierarchy, indent):
    for folder in folder_hierarchy:
        print(f"{indent}{folder.name}")
        print_all_folders(folder.sub_folders, indent + "-")

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)
print_all_folders(olm.folder_hierarchy, "")

O exemplo de código acima tem como objetivo exibir a hierarquia de pastas do arquivo OLM por meio de uma função recursiva de forma mais estruturada e legível. Aspose.Email também permite acessar diretamente a estrutura de pastas do arquivo OLM usando o método ‘get_folders()’ da OlmStorage classe.

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folders = olm.get_folders()

Também é possível obter qualquer pasta por nome. O exemplo de código a seguir utiliza o método ‘get_folder(name, ignore_case)’ da OlmStorage a classe passando o nome da pasta e a sensibilidade a maiúsculas/minúsculas como parâmetros para recuperar a pasta pelo nome:

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

Lista de e‑mails

Os trechos de código abaixo demonstram como usar a biblioteca Aspose.Email para ler e extrair os assuntos de e‑mails de um arquivo Outlook for Mac (OLM). OlmFolder a classe, que representa uma pasta, tem os seguintes métodos para obter a lista de e‑mails:

  • ’enumerate_messages()’ - Percorre cada mensagem de e‑mail na pasta. Este método retorna mensagens como instâncias da OlmMessageInfo a classe que fornece informações básicas sobre cada mensagem de e‑mail, como assunto, remetente, data, etc.
  • ’enumerate_mapi_messages()’ - Também percorre cada mensagem de e‑mail em uma pasta, mas neste caso, retorna mensagens como instâncias da MapiMessage a classe que representa uma mensagem de e‑mail de forma mais detalhada e específica ao MAPI. Ela fornece acesso a uma ampla gama de propriedades e detalhes da mensagem de e‑mail, permitindo um processamento mais avançado e especializado.

Usando o método EnumerateMessages

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for message_info in folder.enumerate_messages():
    print(message_info.subject)

Usando o método EnumerateMapiMessages

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for msg in folder.enumerate_mapi_messages():
    msg.save(f"{msg.subject}.msg")

Outras propriedades úteis

As outras propriedades úteis do OlmFolder a classe são:

  • ‘has_messages’ - Obtém um valor que indica se a pasta atual contém mensagens.
  • ‘message_count’ - Obtém a contagem de mensagens.
import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

if folder.has_messages:
   print(f"Message count: {folder.message_count}")

Obter ou definir a data de modificação de uma mensagem

Você pode obter informações sobre a hora da última modificação de uma mensagem de e‑mail. A propriedade ‘modified_date’ da OlmMessageInfo a classe representa a data e hora em que a mensagem foi modificada pela última vez.

Eis um exemplo que demonstra o uso da propriedade:

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for message_info in folder.enumerate_messages():
    modifiedDate = message_info.modified_date

Extraindo e‑mails

Você pode recuperar os dados reais da mensagem MAPI de um armazenamento de e‑mail. O método ’extract_mapi_message(message_info)’ da OlmStorage a classe é usada para extrair a mensagem MAPI do armazenamento com base no message_info fornecido.

O exemplo de código abaixo demonstra como usar este método:

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for message_info in folder.enumerate_messages():
    msg = olm.extract_mapi_message(message_info)

Extraindo todos os itens de um e‑mail usando a API de Travessia

Você pode extrair todos os itens de um arquivo Outlook OLM tanto quanto possível, sem gerar exceções, mesmo se alguns dados do arquivo original estiverem corrompidos. Para fazer isso, use OlmStorage(TraversalExceptionsCallback callback) construtor e Load(string fileName) método em vez do método FromFile. O construtor permite definir um método de callback.

using (var olm = new OlmStorage((exception, id) => { /* Exception handling  code. */ }))

O método de callback disponibiliza exceções de carregamento e travessia.

O Load o método retorna ’true’ se o arquivo foi carregado com sucesso e a navegação adicional for possível. Se um arquivo estiver corrompido e a navegação não for possível, retorna ‘false’.

if (olm.Load(fileName))

O trecho de código a seguir e os passos mostram como usar esta API:

  1. Crie uma nova instância da OlmStorage classe, passando um callback de tratamento de exceções para lidar com quaisquer exceções encontradas durante o processo.
  2. Carregue o arquivo OLM chamando o Load método da instância OlmStorage.
  3. Se o arquivo OLM for carregado com sucesso, obtenha a hierarquia de pastas chamando o GetFolders método na instância OlmStorage. Isso retorna uma lista de objetos OlmFolder.
  4. Chame o método ExtractItems, passando a instância OlmStorage e a lista de objetos OlmFolder.
  5. No método ExtractItems, percorra cada pasta na lista de pastas.
  6. Se a pasta contiver mensagens (e‑mails), imprima o nome da pasta no console usando Console.WriteLine(folder).
  7. Percorra as mensagens na pasta atual chamando o método EnumerateMessages na instância OlmStorage, passando a pasta atual como argumento.
  8. Imprima o assunto de cada mensagem no console usando Console.WriteLine(msg.Subject).
  9. Se a pasta tiver subpastas, chame recursivamente o método ExtractItems novamente, passando a instância OlmStorage e as subpastas da pasta atual.
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);
        }
    }
}

Extrair Mensagens de OLM por Identificadores

Para acessar os dados de mensagens MAPI, você pode usar a propriedade ’entry_id’ para obter o identificador único (Entry ID) de uma mensagem usando o OlmMessageInfo classe. Em seguida, você pode utilizar o método ’extract_mapi_message(id)’ da OlmStorage classe, passando o entry ID como parâmetro para recuperar a mensagem MAPI associada a esse entry ID específico. O trecho de código a seguir demonstra o uso desses recursos:


import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage.from_file(fileName)
folder = olm.get_folder("Inbox", True)

for message_info in folder.enumerate_messages():
    msg = olm.extract_mapi_message(message_info.entry_id)

Obter Caminho da Pasta

Você também pode obter o caminho hierárquico ou a localização da pasta dentro do arquivo Outlook OLM. Aspose.Email fornece a propriedade ‘path’ da OlmFolder classe que retorna o caminho da pasta. O trecho de código a seguir demonstra o uso desta propriedade:

import aspose.email as ae


def print_path(storage, folders):
    for folder in folders:
        # print the current folder path
        print(folder.path)

        if folder.sub_folders:
            print_path(storage, folder.sub_folders)


fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)
print_path(olm, olm.folder_hierarchy)

Contar o Número de Itens na Pasta

Aspose.Email fornece a capacidade de contar o número total de mensagens de email contidas na pasta específica de um arquivo Outlook OLM. A propriedade ‘message_count’ da OlmFolder classe retorna a contagem total de itens (mensagens de email) armazenados dentro de uma pasta específica no arquivo OLM. O trecho de código a seguir demonstra o uso desta propriedade:

import aspose.email as ae


def print_message_count(folders):
    for folder in folders:
        print(f"Message Count [{folder.name}]: {folder.message_count}")


fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)
print_message_count(olm.folder_hierarchy)

Obter Contagem Total de Itens do OlmStorage

O método ‘get_total_items_count()’ da OlmStorage classe retorna o número total de itens de mensagem contidos no armazenamento OLM.

import aspose.email as ae

fileName = "my.olm"
olm = ae.storage.olm.OlmStorage(fileName)
count = olm.get_total_items_count()

Recuperar Cores de Categorias do Outlook

Com Aspose.Email, você pode facilmente recuperar e utilizar cores de categorias associadas a categorias de itens do Outlook armazenadas em arquivos OLM. O OlmItemCategory classe permite que você acesse nomes de categorias e suas respectivas cores representadas em formato hexadecimal. O OlmStorage classe apresenta o método ‘GetCategories()’ para recuperar uma lista de categorias do armazenamento OLM. Implementando o exemplo de código abaixo, você pode recuperar facilmente todas as categorias usadas de um arquivo de armazenamento OML e acessar o nome da categoria junto com sua cor.

with OlmStorage.FromFile("storage.olm") as olm:
    categories = olm.GetCategories()
    
    for category in categories:
        print(f"Category name: {category.Name}")
        
        # Color is represented as a hexadecimal value: #rrggbb
        print(f"Category color: {category.Color}")

Além disso, você pode recuperar a cor da categoria associada a mensagens específicas iterando pelas mensagens em uma pasta e acessando a cor da categoria correspondente com base no nome da categoria.

for msg in olm.EnumerateMessages(folder):
    if msg.Categories is not None:
        for msgCategory in msg.Categories:
            print(f"Category name: {msgCategory}")
            categoryColor = next((c.Color for c in categories if c.Name.lower() == msgCategory.lower()), None)
            if categoryColor is not None:
                print(f"Category color: {categoryColor}")