Filtrar Mensagens do Servidor usando o Cliente IMAP

ImapClient classe fornece o listMessages() método que obtém todas as mensagens de uma caixa de correio. Para obter apenas mensagens que correspondam a alguma condição, use o sobrecarregado listMessages() método que recebe MailQuery como argumento. O MailQuery a classe fornece várias propriedades para especificar as condições, por exemplo, data, assunto, remetente, destinatário e assim por diante. O primeiro exemplo ilustra como filtrar mensagens com base na data e no assunto. Também mostramos como filtrar por outros critérios e como construir consultas mais complexas. A API também oferece a capacidade de aplicar critérios de busca sensíveis a maiúsculas/minúsculas para corresponder exatamente aos critérios de filtragem. A API também permite especificar a codificação da string de pesquisa para filtrar mensagens da caixa de correio.

Filtrando Mensagens da Caixa de Correio

  1. Conectar e fazer login em um servidor IMAP
  2. Crie uma instância do MailQuery e definir as propriedades
  3. Chame o ImapClient.listMessages(MailQuery query) método e passar o MailQuery com os parâmetros para obter apenas mensagens filtradas.

O trecho de código a seguir mostra como conectar a uma caixa de correio IMAP e obter mensagens que chegaram hoje e têm a palavra "newsletter" no assunto.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Connect and log in to IMAP
final String host = "host";
final int port = 143;
final String username = "user@host.com";
final String password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.selectFolder("Inbox");
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());
// Build the query and Get list of messages
MailQuery query = builder.getQuery();
ImapMessageInfoCollection messages = client.listMessages(query);
System.out.println("Imap: " + messages.size() + " message(s) found.");
// Disconnect from IMAP
client.dispose();

Obter mensagens que atendam a critérios específicos

Os exemplos de código acima filtrar mensagens com base no assunto e na data do e‑mail. Podemos usar outras propriedades para definir outras condições suportadas também. Abaixo estão alguns exemplos de definição de condições usando MailQuery. Os trechos de código a seguir mostram como filtrar e‑mails por:

  1. Data de hoje.
  2. Um intervalo de datas.
  3. De um remetente específico.
  4. De um domínio específico.
  5. De um destinatário específico.

Data de Hoje

O trecho de código a seguir mostra como filtrar e‑mails pela data de hoje.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().on(new Date());
~~
### **Date Range*
The following code snippet shows you how to filter emails on the date range.

~~~Java
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Emails that arrived in last 7 days
Calendar cal = Calendar.getInstance();
builder.getInternalDate().before(cal.getTime());
cal.add(Calendar.DATE, -7);
builder.getInternalDate().since(cal.getTime());

Remetente Específico

O trecho de código a seguir mostra como filtrar e‑mails por um remetente específico.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails from specific sender
builder.getFrom().contains("saqib.razzaq@127.0.0.1");

Domínio Específico

O trecho de código a seguir mostra como filtrar e‑mails por um domínio específico.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails from specific domain
builder.getFrom().contains("SpecificHost.com");

Destinatário Específico

O trecho de código a seguir mostra como filtrar e‑mails por um destinatário específico.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails sent to specific recipient
builder.getTo().contains("recipient");

Construindo consultas complexas

Se diferentes MailQueryBuilder as propriedades são definidas em declarações separadas, então todas as condições seriam atendidas. Por exemplo, se quisermos obter mensagens entre um intervalo de datas e de um host específico, precisamos escrever três declarações.

Combinando consultas com AND

O trecho de código a seguir mostra como combinar consultas com AND.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago
builder.getFrom().contains("SpecificHost.com");

Calendar cal = Calendar.getInstance();
builder.getInternalDate().before(cal.getTime());
cal.add(Calendar.DATE, -7);
builder.getInternalDate().since(cal.getTime());

Combinando consultas com OR

MailQueryBuilder fornece o or() método que aceita dois MailQuery instâncias como parâmetros. Ela obtém as mensagens que correspondem a qualquer uma das duas condições especificadas. O trecho de código a seguir mostra como filtrar mensagens que têm “test” no assunto ou “noreply@host.com” como remetente. O trecho de código a seguir mostra como combinar consultas com OR.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Specify OR condition
builder.or(builder.getSubject().contains("test"), builder.getFrom().contains("noreply@host.com"));

Filtragem por InternalDate

Mensagens podem ser extraídas do servidor com base no InternalDate, porém às vezes o servidor não retorna todas as mensagens visíveis na caixa de entrada. Isso pode ser devido ao fuso horário do servidor, pois pode não ser UTC para todos os servidores como Gmail. Aspose envia comandos como 008 SEARCH ON 4-May-2014 de acordo com o protocolo IMAP no entanto, o resultado pode variar devido às configurações de fuso horário do servidor. Um novo membro foi adicionado em ImapMessageInfo como InternalDate que auxilia ainda mais na filtragem das mensagens. O trecho de código a seguir mostra o uso de InternalDate para filtrar mensagens.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Connect and log in to IMAP
final String host = "host";
final int port = 143;
final String username = "user@host.com";
final String password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.selectFolder("Inbox");

// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());

// Build the query and Get list of messages
MailQuery query = builder.getQuery();
ImapMessageInfoCollection messages = client.listMessages(query);
for (ImapMessageInfo info : messages) {
    System.out.println("Internal Date: " + info.getInternalDate());
}

// Disconnect from IMAP
client.dispose();

Filtragem de E‑mails Sensível a Maiúsculas e Minúsculas

O trecho de código a seguir mostra como usar filtragem de e‑mails sensível a maiúsculas e minúsculas.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter", true);
builder.getInternalDate().on(new Date());
MailQuery query = builder.getQuery();

Especificar Codificação para o Construtor de Consultas

As APIs ImapQueryBuilder construtor pode ser usado para especificar a Codificação da string de pesquisa. Isso também pode ser definido usando o DefaultEncoding propriedade do MailQueryBuilder. O trecho de código a seguir mostra como especificar a codificação para o construtor de consultas.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Charset.forName("utf-8"));
builder.getSubject().contains("ğüşıöç", true);
MailQuery query = builder.getQuery();

Filtrar Mensagens com Suporte a Paginação

O ImapClient fornece a capacidade de pesquisar mensagens na caixa de correio e listá‑las com suporte a paginação. O trecho de código a seguir mostra como filtrar mensagens com suporte a paginação.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
/// <summary>
/// This example shows how to search for messages using ImapClient of the API with paging support
/// Introduced in Aspose.Email for .NET 6.4.0
/// </summary>
final ImapClient client = new ImapClient("host.domain.com", 84, "username", "password");
try {
    try {
        // Append some test messages
        int messagesNum = 12;
        int itemsPerPage = 5;
        MailMessage message = null;
        for (int i = 0; i < messagesNum; i++) {
            message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35128 - " + UUID.randomUUID(), "111111111111111");
            client.appendMessage(ImapFolderInfo.IN_BOX, message);
        }
        String body = "2222222222222";
        for (int i = 0; i < messagesNum; i++) {
            message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35128 - " + UUID.randomUUID(), body);
            client.appendMessage(ImapFolderInfo.IN_BOX, message);
        }

        client.selectFolder("Inbox");
        ImapQueryBuilder iqb = new ImapQueryBuilder();
        iqb.getBody().contains(body);
        MailQuery query = iqb.getQuery();

        client.selectFolder(ImapFolderInfo.IN_BOX);
        ImapMessageInfoCollection totalMessageInfoCol = client.listMessages(query);
        System.out.println(totalMessageInfoCol.size());

        //////////////////////////////////////////////////////

        List<ImapPageInfo> pages = new ArrayList<ImapPageInfo>();

        PageSettings ps = new PageSettings();
        ps.setFolderName(ImapFolderInfo.IN_BOX);
        PageInfo pi = new PageInfo(itemsPerPage);
        ImapPageInfo pageInfo = client.listMessagesByPage(query, pi, ps);

        pages.add(pageInfo);
        while (!pageInfo.getLastPage()) {
            pageInfo = client.listMessagesByPage(query, pageInfo.getNextPage(), ps);
            pages.add(pageInfo);
        }
        int retrievedItems = 0;
        // foreach to while statements conversion
        for (ImapPageInfo folderCol : pages) {
            retrievedItems += folderCol.getItems().size();
        }
    } finally {
    }
} finally {
    if (client != null)
        client.dispose();
}

Filtrar Mensagens com Flag Personalizado

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();

queryBuilder.hasFlags(ImapMessageFlags.keyword("custom1"));

queryBuilder.hasNoFlags(ImapMessageFlags.keyword("custom2"));

Filtrar Mensagens usando Busca Personalizada

Por exemplo, o padrão RFC 3501 não permite a pesquisa de mensagens com base na existência de anexos nas mensagens. Mas o Gmail fornece Extensões IMAP que permitem realizar tal pesquisa. Aspose.Email fornece o customSearch método do ImapQueryBuilder classe para fazer uma consulta correspondente.

O exemplo de código abaixo mostra como recuperar uma lista de mensagens de e‑mail do servidor que possuem anexos, usando o protocolo IMAP e um critério de pesquisa personalizado:

ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);