Ler arquivo OLM do Outlook para Mac e obter informações sobre pastas e subpastas

Abrir arquivos no formato OLM

Os arquivos no formato OLM podem ser abertos de duas maneiras:

  • usando construtor
  • usando o método estático FromFile

Existem diferenças no comportamento entre esses métodos. Veja a seção abaixo.

Abrir arquivos pelo construtor

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

OlmStorage olm = new OlmStorage("fileName");

Abrir arquivos usando o método estático FromFile

Para abrir um arquivo, use o método estático fromFile e passe o nome completo do arquivo como argumento:

OlmStorage olm = OlmStorage.fromFile("fileName");

Abrir arquivos usando o método estático FromStream

Para abrir um arquivo usando o método estático fromStream, passe um nome de fluxo como argumento:

Ler arquivo OLM

O seguinte trecho de código mostra como carregar o arquivo OLM e obter seu conteúdo.

Obter pastas

Para recuperar pastas de um arquivo OLM (Outlook para Mac), carregue-o primeiro com a classe OlmStorage e, em seguida, use um dos seguintes métodos, dependendo de suas necessidades:

O exemplo de código abaixo mostrará como obter uma pasta de um arquivo OLM:

// Obter a pasta pelo nome
OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

} finally {

    olm.dispose();

}

Ao usar o método fromFile para abrir um arquivo OLM, o getFolderHierarchy() retornará null. Nesse caso, chame o método getFolders() explicitamente para recuperar a lista de diretórios no arquivo OLM.

Obter caminho da pasta

Você também pode obter o caminho das pastas no arquivo OLM. Aspose.Email fornece a propriedade OlmFolder.Path que retorna o caminho da pasta. O seguinte trecho de código demonstra o uso da propriedade OlmFolder.Path para obter os caminhos das pastas no arquivo OLM.

Contar o número de itens na pasta

Você também pode contar o número de itens na pasta. Aspose.Email fornece a propriedade OlmFolder.MessageCount que retorna o número de itens na pasta. O seguinte trecho de código demonstra o uso da propriedade OlmFolder.MessageCount para obter o número de itens nas pastas do arquivo OLM.

Enumerar mensagens de uma determinada pasta

Aspose.Email fornece a API para trabalhar com armazenamentos OLM e extrair mensagens de uma pasta específica. As classes OlmFolder e OlmMessageInfo representam informações breves sobre uma pasta e uma mensagem no armazenamento, respectivamente. A classe OlmFolder fornece os seguintes métodos:

  • OlmFolder.getSubFolder(String subfolderName, boolean ignoreCase) - Obtém a subpasta pelo nome.

  • OlmFolder.enumerateMapiMessages() - Expõe o enumerador que suporta a iteração de MapiMessages na pasta atual.

  • OlmFolder.enumerateMessages() - Expõe o enumerador que suporta a iteração de OlmMessageInfo’s na pasta atual.

  • OlmFolder.enumerateMessages(int startIndex, int count) - Expõe o enumerador que suporta a iteração de OlmMessageInfo’s dentro de um intervalo dado.

  • OlmFolder.enumerateMessages(MailQuery query) - Expõe o enumerador que suporta a iteração de OlmMessageInfo’s por critérios de pesquisa.

Os exemplos de código abaixo demonstrarão o uso desses métodos:

 // Enumera todas as mensagens em uma pasta determinada

OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

   for (OlmMessageInfo messageInfo : inbox.enumerateMessages()) {

        System.out.println(messageInfo.getSubject());

   }

} finally {

    olm.dispose();

}

// Enumera um intervalo de mensagens em uma pasta determinada

OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

   int startIndex = 10;

   int count = 100;

   for (OlmMessageInfo messageInfo : inbox.enumerateMessages(startIndex, count)) {

        System.out.println(messageInfo.getSubject());

   }

} finally {

    olm.dispose();

}

// Enumera mensagens por critérios de pesquisa

OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

    MailQueryBuilder mailQueryBuilder = new MailQueryBuilder();

    mailQueryBuilder.getSubject().contains("invitation");

    mailQueryBuilder.getFrom().contains("Mark");

   for (OlmMessageInfo messageInfo : inbox.enumerateMessages(mailQueryBuilder.getQuery())) {

        System.out.println(messageInfo.getSubject());

   }

} finally {

    olm.dispose();

}

// Enumera todas as mensagens e a extração de algumas delas

OlmStorage olm = OlmStorage.fromFile("fileName");

try {

    OlmFolder inbox = olm.getFolder("inbox", true);

   for (OlmMessageInfo messageInfo : inbox.enumerateMessages()) {

       if (messageInfo.hasAttachments()) {

            MapiMessage msg = olm.extractMapiMessage(messageInfo);

       }

   }

} finally {

    olm.dispose();

}

Extrair mensagens de OLM por identificadores

Às vezes, é necessário extrair mensagens selecionadas por identificadores. Por exemplo, seu aplicativo armazena identificadores em um banco de dados e extrai uma mensagem sob demanda. Esta é a forma eficiente de evitar percorrer todo o armazenamento a cada vez para encontrar uma mensagem específica a ser extraída. Para implementar esse recurso para arquivos OLM, Aspose.Email fornece os seguintes métodos e classes:

O exemplo de código abaixo demonstra como extrair mensagens de OLM por identificadores:

for (OlmMessageInfo msgInfo : olmFolder.enumerateMessages()) {
    MapiMessage msg = storage.extractMapiMessage(msgInfo.getEntryId());
}

Nota: O ID da mensagem é único dentro do arquivo de armazenamento. Os IDs são criados pelo Aspose.Email e não podem ser usados em outras libs ou aplicativos de processamento de OLM de terceiros.

Extrair itens OLM de arquivos corrompidos

Aspose.Email fornece uma API de percurso que permite extrair todos os itens OLM na medida do possível, sem lançar exceções, mesmo que alguns dados do arquivo original estejam corrompidos.

Use o construtor OlmStorage(TraversalExceptionsCallback callback) e o método load(String fileName) em vez do método fromFile.

O construtor permite definir um método de callback.

OlmStorage olm = new OlmStorage(new TraversalExceptionsCallback() {
    public void invoke(TraversalAsposeException exception, String itemId) {
        /* Código de tratamento de exceção. */
    }
});

As exceções de carga e percurso estarão disponíveis através do método de callback.

O método load retorna ‘true’ se o arquivo foi carregado com sucesso e é possível um percurso adicional. Se um arquivo estiver corrompido e nenhum percurso for possível, ‘false’ é retornado.

TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
    public void invoke(TraversalAsposeException exception, String itemId) {
        /* Código de tratamento de exceção. */
    }
};
try (OlmStorage olm = new OlmStorage(exceptionsCallback)) {
    if (olm.load(fileName)) {
        List<OlmFolder> folderHierarchy = olm.getFolders();
        extractItems(olm, folderHierarchy);
    }
}

private static void extractItems(OlmStorage olm, List<OlmFolder> folders) {
    for (OlmFolder folder : folders) {
        if (folder.hasMessages()) {
            System.out.println(folder);

            for (MapiMessage msg : olm.enumerateMessages(folder)) {
                System.out.println(msg.getSubject());
            }
        }

        if (folder.getSubFolders().size() > 0) {
            extractItems(olm, folder.getSubFolders());
        }
    }
}

Obter data de modificação da mensagem

A propriedade OlmMessageInfo.getModifiedDate permite que você obtenha a data de modificação da mensagem.

for (OlmMessageInfo messageInfo : inboxFolder.enumerateMessages()) {
    Date modifiedDate = messageInfo.getModifiedDate();
}