Nachrichten vom Server mit IMAP‑Client filtern
Die ImapClient class provides the listMessages() Methode, die alle Nachrichten aus einem Postfach holt. Um nur Nachrichten zu erhalten, die einer Bedingung entsprechen, verwende die überladene listMessages() Methode, die nimmt MailQuery als Argument. Die MailQuery Klasse bietet verschiedene Eigenschaften zur Angabe von Bedingungen, z. B. Datum, Betreff, Absender, Empfänger usw. Das erste Beispiel zeigt, wie man Nachrichten nach Datum und Betreff filtert. Wir zeigen außerdem, wie man nach anderen Kriterien filtert und komplexere Abfragen erstellt. Die API bietet zudem die Möglichkeit, fallabhängige Suchkriterien anzuwenden, um exakte Filterkriterien zu treffen. Die API ermöglicht außerdem die Angabe der Kodierung des Suchstrings für das Filtern von Nachrichten aus dem Postfach.
Filtern von Nachrichten aus dem Postfach
- Verbinden und anmelden an einem IMAP‑Server
- Erstellen Sie eine Instanz von dem MailQuery und setzen Sie die Eigenschaften
- Rufen Sie die ImapClient.listMessages(MailQuery query) Methode und übergeben Sie die MailQuery mit den Parametern, um nur gefilterte Nachrichten zu erhalten.
Das folgende Code‑Snippet zeigt, wie man eine Verbindung zu einem IMAP‑Postfach herstellt und Nachrichten abruft, die heute eingetroffen sind und das Wort "newsletter" im Betreff enthalten.
// 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();
Nachrichten erhalten, die bestimmte Kriterien erfüllen
Die obigen Code‑Beispiele Nachrichten anhand des E‑Mail‑Betreffs und Datums filtern. Wir können auch andere Eigenschaften verwenden, um weitere unterstützte Bedingungen festzulegen. Nachfolgend einige Beispiele für das Setzen von Bedingungen mit MailQuery. Die folgenden Code‑Snippets zeigen, wie man E‑Mails filtert nach:
- Heutiges Datum.
- Ein Datumsbereich.
- Von einem bestimmten Absender.
- Von einer bestimmten Domäne.
- Von einem bestimmten Empfänger.
Heutiges Datum
Das folgende Code‑Snippet zeigt, wie man E‑Mails nach dem heutigen Datum filtert.
// 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());
Bestimmter Absender
Das folgende Code‑Snippet zeigt, wie man E‑Mails nach einem bestimmten Absender filtert.
// 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");
Bestimmte Domäne
Das folgende Code‑Snippet zeigt, wie man E‑Mails nach einer bestimmten Domäne filtert.
// 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");
Bestimmter Empfänger
Das folgende Code‑Snippet zeigt, wie man E‑Mails nach einem bestimmten Empfänger filtert.
// 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");
Komplexe Abfragen erstellen
Falls unterschiedlich MailQueryBuilder Eigenschaften werden in separaten Anweisungen gesetzt, dann würden alle Bedingungen erfüllt. Zum Beispiel, wenn wir Nachrichten zwischen einem Datumsbereich und von einem bestimmten Host erhalten wollen, müssen wir drei Anweisungen schreiben.
Abfragen mit AND kombinieren
Das folgende Code‑Snippet zeigt, wie man Abfragen mit AND kombiniert.
// 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());
Abfragen mit OR kombinieren
MailQueryBuilder stellt die or() Methode, die zwei MailQuery Instanzen als Parameter. Es ruft die Nachrichten ab, die einer der beiden angegebenen Bedingungen entsprechen. Das folgende Code‑Snippet zeigt, wie man Nachrichten filtert, die entweder „test“ im Betreff haben oder „noreply@host.com“ als Absender. Das folgende Code‑Snippet zeigt, wie man Abfragen mit OR kombiniert.
// 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"));
Filtern nach InternalDate
Nachrichten können vom Server basierend auf dem InternalDate extrahiert werden, jedoch gibt der Server manchmal nicht alle Nachrichten im Posteingang zurück. Der Grund kann die Zeitzone des Servers sein, da sie nicht für alle Server UTC ist, wie zum Beispiel Gmail. Aspose sendet Befehle wie 008 SEARCH ON 4-May-2014 gemäß dem IMAP‑Protokoll Das Ergebnis kann jedoch aufgrund von Zeitzoneneinstellungen des Servers variieren. Ein neues Mitglied wurde hinzugefügt in ImapMessageInfo als InternalDate was zusätzlich beim Filtern der Nachrichten hilft. Das folgende Code‑Snippet zeigt die Verwendung von InternalDate um Nachrichten zu filtern.
// 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();
Fallabhängige E‑Mail‑Filterung
Das folgende Code‑Snippet zeigt, wie man eine fallabhängige E‑Mail‑Filterung verwendet.
// 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();
Kodierung für Abfrage‑Builder festlegen
Die API‑ ImapQueryBuilder Konstruktor kann verwendet werden, um die Kodierung für den Suchstring festzulegen. Dies kann auch mit DefaultEncoding Eigenschaft des MailQueryBuilder. Das folgende Code‑Snippet zeigt, wie man die Kodierung für den Abfrage‑Builder festlegt.
// 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();
Nachrichten mit Seitennavigation filtern
Die ImapClient bietet die Möglichkeit, Nachrichten aus dem Postfach zu suchen und sie mit Seitennavigation aufzulisten. Das folgende Code‑Snippet zeigt, wie man Nachrichten mit Seitennavigation filtert.
// 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();
}
Nachrichten mit benutzerdefiniertem Flag filtern
// 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"));
Nachrichten mit benutzerdefinierter Suche filtern
Zum Beispiel erlaubt der RFC‑3501‑Standard keine Nachrichtensuche basierend auf dem Vorhandensein von Anhängen. Aber Gmail bietet IMAP-Erweiterungen die das Durchführen einer solchen Suche ermöglichen. Aspose.Email stellt die customSearch Methode des ImapQueryBuilder Klasse, um eine entsprechende Abfrage zu erstellen.
Das nachstehende Codebeispiel zeigt, wie man eine Liste von E‑Mail‑Nachrichten vom Server, die Anhänge enthalten, mit dem IMAP‑Protokoll und einem benutzerdefinierten Suchkriterium abruft:
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);