Filtrer les messages du serveur à l'aide du client IMAP

Le ImapClient classe fournit le listMessages() méthode qui récupère tous les messages d’une boîte aux lettres. Pour obtenir uniquement les messages correspondant à une condition, utilisez le surchargé listMessages() méthode qui prend MailQuery comme argument. Le MailQuery la classe fournit diverses propriétés pour spécifier les conditions, par exemple la date, l’objet, l’expéditeur, le destinataire, etc. Le premier exemple illustre comment filtrer les messages selon la date et l’objet. Nous montrons également comment filtrer selon d’autres critères et comment construire des requêtes plus complexes. L’API offre également la capacité d’appliquer des critères de recherche sensibles à la casse pour correspondre exactement aux critères de filtrage. L’API permet aussi de spécifier l’encodage de la chaîne de recherche pour filtrer les messages de la boîte aux lettres.

Filtrage des messages de la boîte aux lettres

  1. Se connecter et s’authentifier à un serveur IMAP
  2. Créez une instance de la MailQuery et définir les propriétés
  3. Appelez le ImapClient.listMessages(MailQuery query) méthode et passer le MailQuery avec les paramètres pour obtenir uniquement les messages filtrés.

Le fragment de code suivant vous montre comment se connecter à une boîte aux lettres IMAP et obtenir les messages arrivés aujourd’hui et contenant le mot "newsletter" dans l’objet.

// 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();

Obtenir les messages qui répondent à des critères spécifiques

Les exemples de code ci‑dessus filtrer les messages en fonction de l’objet et de la date du courriel. Nous pouvons également utiliser d’autres propriétés pour définir d’autres conditions prises en charge. Voici quelques exemples de définition des conditions en utilisant MailQuery. Les fragments de code qui suivent montrent comment filtrer les courriels sur :

  1. Date d’aujourd’hui.
  2. Une plage de dates.
  3. D’un expéditeur spécifique.
  4. D’un domaine spécifique.
  5. D’un destinataire spécifique.

Date d’aujourd’hui

Le fragment de code suivant vous montre comment filtrer les courriels à la date d’aujourd’hui.

// 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());

Expéditeur spécifique

Le fragment de code suivant vous montre comment filtrer les courriels en fonction d’un expéditeur spécifique.

// 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");

Domaine spécifique

Le fragment de code suivant vous montre comment filtrer les courriels en fonction d’un domaine spécifique.

// 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");

Destinataire spécifique

Le fragment de code suivant vous montre comment filtrer les courriels en fonction d’un destinataire spécifique.

// 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");

Construire des requêtes complexes

Si différent MailQueryBuilder les propriétés sont définies dans des instructions séparées, puis toutes les conditions seraient satisfaites. Par exemple, si nous voulons obtenir les messages entre une plage de dates et d’un hôte spécifique, nous devons écrire trois instructions.

Combiner des requêtes avec AND

Le snippet de code suivant montre comment combiner des requêtes avec 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());

Combiner des requêtes avec OR

MailQueryBuilder fournit le or() méthode qui prend deux MailQuery instances comme paramètres. Elle récupère les messages qui correspondent à l’une des deux conditions spécifiées. Le fragment de code suivant montre comment filtrer les messages qui ont soit « test » dans l’objet, soit « noreply@host.com » comme expéditeur. Le fragment de code suivant vous montre comment combiner des requêtes avec 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"));

Filtrage sur InternalDate

Les messages peuvent être extraits du serveur en fonction de l’InternalDate, cependant parfois le serveur ne renvoie pas tous les messages visibles dans la boîte de réception. Cela peut être dû au fuseau horaire du serveur qui n’est pas toujours UTC, comme pour certains serveurs. Gmail. Aspose envoie des commandes comme 008 SEARCH ON 4-May-2014 selon le protocole IMAP toutefois le résultat peut différer en raison des réglages de fuseau horaire du serveur. Un nouveau membre est ajouté dans ImapMessageInfo comme InternalDate qui aide davantage à filtrer les messages. Le fragment de code suivant montre l’utilisation de InternalDate pour filtrer les messages.

// 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();

Filtrage d’e‑mails sensible à la casse

Le fragment de code suivant vous montre comment utiliser le filtrage d’e‑mails sensible à la casse.

// 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();

Spécifier l’encodage pour le constructeur de requête

Les API ImapQueryBuilder le constructeur peut être utilisé pour spécifier l’encodage de la chaîne de recherche. Cela peut également être défini en utilisant le DefaultEncoding propriété du MailQueryBuilder. Le fragment de code suivant vous montre comment spécifier l’encodage pour le constructeur de requête.

// 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();

Filtrer les messages avec prise en charge de la pagination

Le ImapClient fournit la capacité de rechercher des messages dans la boîte aux lettres et de les lister avec prise en charge de la pagination. Le fragment de code suivant vous montre comment filtrer les messages avec la pagination.

// 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();
}

Filtrer les messages avec un indicateur personnalisé

// 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"));

Filtrer les messages à l’aide d’une recherche personnalisée

Par exemple, la norme RFC 3501 ne permet pas de rechercher un message basé sur l’existence de pièces jointes. Mais Gmail fournit Extensions IMAP qui permettent d’effectuer une telle recherche. Aspose.Email fournit le customSearch méthode du ImapQueryBuilder classe pour effectuer une requête correspondante.

L’exemple de code ci-dessous montre comment récupérer une liste de courriels du serveur contenant des pièces jointes, en utilisant le protocole IMAP et un critère de recherche personnalisé :

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