Филтриране на съобщения от сървъра с използване на IMAP клиент

Този ImapClient клас предоставя listMessages() метод, който получава всички съобщения от пощенска кутия. За да получите само съобщения, отговарящи на някои условия, използвайте претоварения listMessages() метод, който приема MailQuery като аргумент.  MailQuery класът предоставя различни свойства за задаване на условия, например дата, тема, изпращач, получател и т.н. Първият пример илюстрира как да се филтрират съобщения въз основа на дата и тема. Също така показваме как да се филтрират по други критерии и как да се построят по-сложни заявки. API‑тата също предоставят възможност за прилагане на критерии за търсене, чувствителни към регистъра, за точно съвпадение. API‑тата също позволяват задаване на кодирането на низа за търсене при филтриране на съобщения от пощенската кутия.

Филтриране на съобщения от пощенската кутия

  1. Свържете се и влезте в IMAP сървър
  2. Създайте инстанция на MailQuery и задайте свойствата
  3. Извикайте ImapClient.listMessages(MailQuery query) метод и предайте MailQuery с параметрите за получаване само на филтрирани съобщения.

Следният кодов фрагмент показва как да се свържете с IMAP пощенска кутия и да получите съобщения, които са пристигнали днес и имат думата "newsletter" в темата.

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

Получаване на съобщения, отговарящи на конкретни критерии

Кодовите примери по-горе филтриране на съобщения въз основа на темата и датата на имейла. Можем да използваме и други свойства за задаване на други поддържани условия. По-долу са някои примери за задаване на условията с помощта на MailQuery. Следващите кодови фрагменти показват как да се филтрират имейли за:

  1. Днешната дата.
  2. Диапазон от дати.
  3. От конкретен изпращач.
  4. От конкретен домейн.
  5. От конкретен получател.

Днешна дата

Следният кодов фрагмент показва как да се филтрират имейли за днешната дата.

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

Конкретен изпращач

Следният кодов фрагмент показва как да се филтрират имейли за конкретен изпращач.

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

Конкретен домейн

Следният кодов фрагмент показва как да се филтрират имейли за конкретен домейн.

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

Конкретен получател

Следният кодов фрагмент показва как да се филтрират имейли за конкретен получател.

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

Съставяне на сложни заявки

Ако различни MailQueryBuilder свойствата се задават в отделни изрази, след което всички условия ще бъдат изпълнени. Например, ако искаме да получим съобщения между даден диапазон от дати и от конкретен хост, трябва да напишем три израза.

Комбиниране на заявки с AND

Следният кодов откъс показва как да комбинирате заявки с 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());

Комбиниране на заявки с OR

MailQueryBuilder предоставя or() метод, който приема две MailQuery инстанции като параметри. Той получава съобщения, които отговарят на всяко от двете зададени условия. Следният кодов фрагмент показва как да се филтрират съобщения, които имат „test“ в темата или „noreply@host.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"));

Филтрация по InternalDate

Съобщения могат да се извлекат от сървъра въз основа на InternalDate, но понякога сървърът не връща всички съобщения, видими в пощенската кутия. Причината може да бъде часовата зона на сървъра, тъй като той не е винаги UTC, както при Gmail. Aspose изпраща команди като 008 SEARCH ON 4-May-2014 съгласно IMAP протокол въпреки това резултатът може да се различава поради настройките на часовата зона на сървъра. Нов член е добавен в ImapMessageInfo as InternalDate което допълнително помага при филтрирането на съобщения. Следният кодов фрагмент показва използването на InternalDate за филтриране на съобщения.

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

Филтриране на имейли с чувствителност към регистъра

Следният кодов фрагмент показва как да се използва филтриране на имейли с чувствителност към регистъра.

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

Задаване на кодиране за конструктор на заявки

API‑тата ImapQueryBuilder конструкторът може да се използва за задаване на кодирането за низ за търсене. Това също може да се зададе чрез DefaultEncoding свойство на MailQueryBuilder. Следният кодов фрагмент показва как да се зададе кодирането за конструктор на заявки.

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

Филтриране на съобщения с поддръжка на странициране

Този ImapClient осигурява възможност за търсене на съобщения от пощенската кутия и изброяването им с поддръжка на странициране. Следният кодов фрагмент показва как да се филтрират съобщения с поддръжка на странициране.

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

Филтриране на съобщения с персонализиран флаг

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

Филтриране на съобщения с персонализирано търсене

Например, стандартът RFC 3501 не позволява търсене на съобщения въз основа на наличието на прикачени файлове в съобщенията. Но Gmail предоставя IMAP разширения които позволяват извършването на такова търсене. Aspose.Email предоставя customSearch метод на ImapQueryBuilder клас за създаване на съответната заявка.

Следният пример с код показва как да се извлече списък от имейл съобщения от сървъра, които имат прикачени файлове, като се използва IMAP протоколът и персонализиран критерий за търсене:

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