Berichten Filteren van Server met IMAP-client

De ImapClient class biedt de listMessages() methode die alle berichten uit een mailbox haalt. Om alleen berichten te krijgen die aan een bepaalde voorwaarde voldoen, gebruik de overladen listMessages() methode die neemt MailQuery als argument. De MailQuery klasse biedt diverse eigenschappen om de voorwaarden op te geven, bijvoorbeeld datum, onderwerp, afzender, ontvanger enzovoort. Het eerste voorbeeld toont hoe berichten te filteren op datum en onderwerp. We laten ook zien hoe te filteren op andere criteria en hoe complexere queries op te bouwen. De API biedt bovendien de mogelijkheid om hoofdlettergevoelige zoekcriteria toe te passen voor exacte filtering. De API staat ook toe de codering van de zoekstring op te geven voor het filteren van berichten uit de mailbox.

Berichten uit mailbox filteren

  1. Verbinden en inloggen op een IMAP‑server
  2. Maak een instantie van de MailQuery en stel de eigenschappen in
  3. Roep de ImapClient.listMessages(MailQuery query) methode en geef de MailQuery met de parameters om alleen gefilterde berichten te verkrijgen.

Het onderstaande codefragment toont hoe u verbinding maakt met een IMAP‑mailbox en berichten opvraagt die vandaag zijn aangekomen en het woord "newsletter" in het onderwerp hebben.

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

Berichten ophalen die aan specifieke criteria voldoen

De bovenstaande codevoorbeelden filter berichten op basis van onderwerp en datum. We kunnen ook andere eigenschappen gebruiken om bijkomende ondersteunde voorwaarden in te stellen. Hieronder enkele voorbeelden van het instellen van voorwaarden met behulp van MailQuery. De volgende codefragmenten tonen hoe u e‑mails kunt filteren op:

  1. De datum van vandaag.
  2. Een datumreeks.
  3. Van een specifieke afzender.
  4. Van een specifiek domein.
  5. Van een specifieke ontvanger.

Datum van vandaag

Het onderstaande codefragment toont hoe u e‑mails kunt filteren op de datum van vandaag.

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

Specifieke afzender

Het onderstaande codefragment toont hoe u e‑mails kunt filteren op een specifieke afzender.

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

Specifiek domein

Het onderstaande codefragment toont hoe u e‑mails kunt filteren op een specifiek domein.

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

Specifieke ontvanger

Het onderstaande codefragment toont hoe u e‑mails kunt filteren op een specifieke ontvanger.

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

Complexe queries bouwen

Als verschillend MailQueryBuilder eigenschappen worden ingesteld in afzonderlijke statements, waarna alle voorwaarden voldaan zijn. Bijvoorbeeld, als we berichten willen ophalen tussen een datumbereik en van een specifieke host, moeten we drie statements schrijven.

Queries combineren met AND

Het volgende codefragment toont hoe je queries combineert met 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());

Queries combineren met OR

MailQueryBuilder biedt de or() methode die twee MailQuery instanties als parameters. Het haalt de berichten op die voldoen aan een van de twee gespecificeerde voorwaarden. Het onderstaande codefragment toont hoe u berichten kunt filteren die ofwel “test” in het onderwerp hebben of “noreply@host.com” als afzender. Het volgende codefragment laat zien hoe u queries kunt combineren met 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"));

Filteren op InternalDate

Berichten kunnen van de server worden gehaald op basis van de InternalDate, maar soms retourneert de server niet alle berichten zoals zichtbaar in de inbox. De oorzaak kan de tijdzone van de server zijn, omdat deze mogelijk niet UTC is voor alle servers zoals Gmail. Aspose verzendt commando’s zoals 008 SEARCH ON 4-May-2014 conform de IMAP‑protocol resultaten kunnen echter verschillen door de tijdzone‑instellingen van de server. Een nieuw lid is toegevoegd in ImapMessageInfo als InternalDate wat verder helpt bij het filteren van de berichten. Het onderstaande codefragment toont het gebruik van InternalDate om berichten te filteren.

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

Hoofdlettergevoelige E‑mailfiltering

Het onderstaande codefragment toont hoe u hoofdlettergevoelige e‑mailfiltering kunt gebruiken.

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

Codering Opgeven voor Query Builder

De API’s ImapQueryBuilder constructor kan worden gebruikt om de codering voor de zoekstring op te geven. Dit kan ook worden ingesteld via de DefaultEncoding eigenschap van de MailQueryBuilder. Het onderstaande codefragment toont hoe u de codering voor de query‑builder kunt specificeren.

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

Berichten Filteren met Paginering

De ImapClient biedt de mogelijkheid om berichten in de mailbox te zoeken en ze met paginering weer te geven. Het onderstaande codefragment toont hoe u berichten kunt filteren met paginering.

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

Berichten Filteren met Aangepaste Vlag

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

Berichten Filteren met Aangepaste Zoekopdracht

Bijvoorbeeld, de RFC 3501-standaard staat geen zoekopdracht toe op basis van het bestaan van bijlagen in berichten. Maar Gmail biedt IMAP‑extensies die het mogelijk maken om zo’n zoekopdracht uit te voeren. Aspose.Email biedt de customSearch methode van de ImapQueryBuilder klasse om een overeenkomstige query uit te voeren.

Het onderstaande codevoorbeeld toont hoe u een lijst e‑mailberichten met bijlagen van de server kunt ophalen, met behulp van het IMAP‑protocol en een aangepast zoekcriterium:

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