Filtrování zpráv ze serveru pomocí IMAP klienta
The ImapClient třída poskytuje listMessages() metoda, která získá všechny zprávy z poštovní schránky. Pro získání jen zpráv, které splňují určitou podmínku, použijte přetíženou listMessages() metoda, která přijímá MailQuery jako argument. MailQuery třída poskytuje různé vlastnosti pro zadání podmínek, např. datum, předmět, odesílatel, příjemce a tak dále. První příklad ukazuje, jak filtrovat zprávy podle data a předmětu. Dále ukazujeme, jak filtrovat podle dalších kritérií a jak vytvořit složitější dotazy. API také poskytuje možnost použít citlivé vyhledávání rozlišující velikost písmen pro přesné filtrování. API také umožňuje nastavit kódování vyhledávacího řetězce pro filtrování zpráv ze schránky.
Filtrování zpráv ze schránky
- Připojit se a přihlásit k IMAP serveru
- Vytvořte instanci MailQuery a nastavit vlastnosti
- Zavolejte ImapClient.listMessages(MailQuery query) metoda a předat MailQuery s parametry pro získání pouze filtrovaných zpráv.
Následující úryvek kódu ukazuje, jak se připojit k IMAP schránce a získat zprávy, které dorazily dnes a mají ve předmětu slovo „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();
Získat zprávy splňující konkrétní kritéria
Výše uvedené ukázky kódu filtrovat zprávy podle předmětu e‑mailu a data. Můžeme také použít další vlastnosti k nastavení dalších podporovaných podmínek. Níže jsou některé příklady nastavení podmínek pomocí MailQuery. Následující úryvky kódu ukazují, jak filtrovat e‑maily podle:
- Dnešní datum.
- Rozsah dat.
- Od konkrétního odesílatele.
- Z konkrétní domény.
- Od konkrétního příjemce.
Dnešní datum
Následující úryvek kódu ukazuje, jak filtrovat e‑maily podle dnešního data.
// 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());
Konkrétní odesílatel
Následující úryvek kódu ukazuje, jak filtrovat e‑maily podle konkrétního odesílatele.
// 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");
Konkrétní doména
Následující úryvek kódu ukazuje, jak filtrovat e‑maily podle konkrétní domény.
// 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");
Konkrétní příjemce
Následující úryvek kódu ukazuje, jak filtrovat e‑maily podle konkrétního příjemce.
// 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");
Vytváření složitých dotazů
Pokud různé MailQueryBuilder vlastnosti jsou nastaveny v samostatných příkazech, pak budou splněny všechny podmínky. Například pokud chceme získat zprávy v rozmezí dat a od konkrétního hostitele, musíme napsat tři příkazy.
Kombinování dotazů pomocí AND
Následující úryvek kódu ukazuje, jak kombinovat dotazy pomocí 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());
Kombinování dotazů pomocí OR
MailQueryBuilder poskytuje or() metoda, která přijímá dva MailQuery instance jako parametry. Získá zprávy, které splňují libovolnou ze dvou uvedených podmínek. Následující úryvek kódu ukazuje, jak filtrovat zprávy, které mají v předmětu „test“ nebo odesílatele „noreply@host.com“. Další úryvek ukazuje, jak kombinovat dotazy pomocí 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"));
Filtrování podle InternalDate
Zprávy lze získat ze serveru na základě InternalDate, avšak někdy server nevrátí všechny zprávy viditelné v doručené poště. Příčinou může být časová zóna serveru, protože nemusí být UTC pro všechny servery jako Gmail. Aspose odesílá příkazy jako 008 SEARCH ON 4-May-2014 podle protokolu IMAP výsledek se však může lišit kvůli nastavení časové zóny serveru. Nový prvek byl přidán do ImapMessageInfo jako InternalDate co dále pomáhá při filtrování zpráv. Následující úryvek kódu ukazuje použití InternalDate k filtrování zpráv.
// 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();
Filtrování e‑mailů rozlišující velikost písmen
Následující úryvek kódu ukazuje, jak použít citlivé filtrování e‑mailů na velikost písmen.
// 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();
Určení kódování pro stavitel dotazů
API ImapQueryBuilder konstruktor může být použit k určení kódování pro vyhledávací řetězec. Toto lze také nastavit pomocí DefaultEncoding vlastnost třídy MailQueryBuilder. Následující úryvek kódu ukazuje, jak nastavit kódování pro stavitel dotazů.
// 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();
Filtrování zpráv s podporou stránkování
The ImapClient poskytuje možnost vyhledávat zprávy ze schránky a vypisovat je s podporou stránkování. Následující úryvek kódu ukazuje, jak filtrovat zprávy s podporou stránkování.
// 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();
}
Filtrování zpráv s vlastním příznakem
// 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"));
Filtrování zpráv pomocí vlastního vyhledávání
Například standard RFC 3501 neumožňuje vyhledávání zpráv podle existence příloh. Ale Gmail poskytuje Rozšíření IMAP které umožňují provádět takové vyhledávání. Aspose.Email poskytuje customSearch metoda třídy ImapQueryBuilder třída pro vytvoření odpovídajícího dotazu.
Níže uvedený ukázkový kód ukazuje, jak získat seznam e‑mailových zpráv ze serveru obsahujících přílohy pomocí protokolu IMAP a vlastního vyhledávacího kritéria:
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);