Filtrowanie wiadomości z serwera przy użyciu klienta IMAP
Ten ImapClient klasa udostępnia listMessages() metoda, która pobiera wszystkie wiadomości ze skrzynki. Aby otrzymać tylko wiadomości spełniające określony warunek, użyj przeciążonej listMessages() metoda, która przyjmuje MailQuery jako argument. MailQuery klasa udostępnia różne właściwości służące do określania warunków, np. daty, tematu, nadawcy, odbiorcy itp. Pierwszy przykład ilustruje filtrowanie wiadomości według daty i tematu. Pokazujemy także, jak filtrować według innych kryteriów oraz jak budować bardziej złożone zapytania. API umożliwia również stosowanie kryteriów wyszukiwania uwzględniających wielkość liter, aby dopasować dokładne kryteria filtrowania. API pozwala także określić kodowanie łańcucha wyszukiwania przy filtrowaniu wiadomości z mailboxa.
Filtrowanie wiadomości ze skrzynki
- Połącz się i zaloguj na serwer IMAP
- Utwórz instancję MailQuery i ustawić właściwości
- Wywołaj ImapClient.listMessages(MailQuery query) metodę i przekazać MailQuery z parametrami, aby otrzymać jedynie przefiltrowane wiadomości.
Poniższy fragment kodu pokazuje, jak połączyć się z skrzynką IMAP i pobrać wiadomości, które dotarły dzisiaj oraz mają w temacie słowo „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();
Pobieranie wiadomości spełniających określone kryteria
Powyższe przykłady kodu filtruj wiadomości w oparciu o temat i datę e‑maila. Możemy także używać innych właściwości do ustawiania kolejnych obsługiwanych warunków. Poniżej kilka przykładów ustalania warunków przy użyciu MailQuery. Poniższe fragmenty kodu pokazują, jak filtrować e-maile według:
- Dzisiejsza data.
- Zakres dat.
- Od konkretnego nadawcy.
- Z konkretnej domeny.
- Od konkretnego odbiorcy.
Dzisiejsza data
Poniższy fragment kodu pokazuje, jak filtrować e-maile według dzisiejszej daty.
// 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());
Określony nadawca
Poniższy fragment kodu pokazuje, jak filtrować e-maile według konkretnego nadawcy.
// 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");
Określona domena
Poniższy fragment kodu pokazuje, jak filtrować e-maile według konkretnej domeny.
// 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");
Określony odbiorca
Poniższy fragment kodu pokazuje, jak filtrować e-maile według konkretnego odbiorcy.
// 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");
Budowanie złożonych zapytań
Jeśli różne MailQueryBuilder właściwości są ustawiane w oddzielnych instrukcjach, wtedy wszystkie warunki będą spełnione. Na przykład, jeśli chcemy pobrać wiadomości z określonego zakresu dat i od konkretnego hosta, musimy napisać trzy instrukcje.
Łączenie zapytań przy użyciu AND
Poniższy fragment kodu pokazuje, jak łączyć zapytania przy użyciu 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());
Łączenie zapytań przy użyciu OR
MailQueryBuilder udostępnia or() metoda przyjmująca dwa MailQuery instancje jako parametry. Pobiera wiadomości spełniające dowolny z dwóch podanych warunków. Poniższy fragment kodu pokazuje, jak filtrować wiadomości, które mają w temacie „test” lub nadawcą „noreply@host.com”. Poniższy fragment kodu pokazuje, jak łączyć zapytania operatorem 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"));
Filtrowanie według InternalDate
Wiadomości mogą być pobierane z serwera na podstawie InternalDate, jednak czasami serwer nie zwraca wszystkich wiadomości widocznych w skrzynce odbiorczej. Powodem może być strefa czasowa serwera, ponieważ nie wszystkie serwery używają UTC, np. Gmail. Aspose wysyła polecenia takie jak 008 SEARCH ON 4-May-2014 zgodnie z protokole IMAP jednak wynik może się różnić ze względu na ustawienia strefy czasowej serwera. Dodano nowy element w ImapMessageInfo as InternalDate co dodatkowo pomaga w filtrowaniu wiadomości. Poniższy fragment kodu pokazuje użycie InternalDate do filtrowania wiadomości.
// 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();
Filtrowanie wiadomości uwzględniające wielkość liter
Poniższy fragment kodu pokazuje, jak zastosować filtrowanie wiadomości uwzględniające wielkość liter.
// 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();
Określenie kodowania dla buildera zapytań
API ImapQueryBuilder konstruktor może być użyty do określenia kodowania dla łańcucha wyszukiwania. Można to również ustawić przy użyciu DefaultEncoding właściwość klasy MailQueryBuilder. Poniższy fragment kodu pokazuje, jak określić kodowanie dla buildera zapytań.
// 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();
Filtrowanie wiadomości z obsługą stronicowania
Ten ImapClient umożliwia wyszukiwanie wiadomości z mailboxa i wyświetlanie ich z obsługą stronicowania. Poniższy fragment kodu pokazuje, jak filtrować wiadomości z obsługą stronicowania.
// 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();
}
Filtrowanie wiadomości z własną flagą
// 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"));
Filtrowanie wiadomości przy użyciu niestandardowego wyszukiwania
Na przykład standard RFC 3501 nie zezwala na wyszukiwanie wiadomości na podstawie istnienia załączników w wiadomościach. Jednak Gmail zapewnia Rozszerzenia IMAP które umożliwiają wykonanie takiego wyszukiwania. Aspose.Email zapewnia customSearch metoda ImapQueryBuilder klasa do wykonania odpowiedniego zapytania.
Poniższy przykład kodu pokazuje, jak pobrać listę wiadomości e-mail z serwera, które zawierają załączniki, przy użyciu protokołu IMAP i niestandardowego kryterium wyszukiwania:
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);