IMAP‑E‑Mail‑Filterung – Methoden, Kriterien & Code‑Beispiele
Grundlegende Nachrichtenfilterung
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.
Nachrichten aus dem Postfach filtern
- 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.
// Connect and log in to IMAP
const string host = "host";
const int port = 143;
const string username = "user@host.com";
const 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.Subject.Contains("Newsletter");
builder.InternalDate.On(DateTime.Now);
// Build the query and Get list of messages
MailQuery query = builder.GetQuery();
ImapMessageInfoCollection messages = client.ListMessages(query);
Console.WriteLine("Imap: " + messages.Count + " message(s) found.");
// Disconnect from IMAP
client.Dispose();
Nachrichten nach spezifischen Kriterien filtern
Die obigen Code‑Beispiele filtert Nachrichten basierend auf Betreff und Datum der E‑Mail. Wir können weitere Eigenschaften nutzen, um weitere unterstützte Bedingungen zu setzen. Nachfolgend einige Beispiele zum Setzen der 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.
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.InternalDate.On(DateTime.Now);
Datumsbereich
Das folgende Code‑Snippet zeigt, wie man E‑Mails nach Datumsbereich filtert.
// Emails that arrived in last 7 days
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));
Bestimmter Absender
Das folgende Code‑Snippet zeigt, wie man E‑Mails nach einem bestimmten Absender filtert.
// Get emails from specific sender
builder.From.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.
// Get emails from specific domain
builder.From.Contains("SpecificHost.com");
Bestimmter Empfänger
Das folgende Code‑Snippet zeigt, wie man E‑Mails nach einem bestimmten Empfänger filtert.
// Get emails sent to specific recipient
builder.To.Contains("recipient");
Erweiterte Abfrageerstellung
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.
// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago
builder.From.Contains("SpecificHost.com");
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));
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.
// Specify OR condition
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com"));
Filterung basierend auf 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.
// Connect and log in to IMAP
const string host = "host";
const int port = 143;
const string username = "user@host.com";
const 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.Subject.Contains("Newsletter");
builder.InternalDate.On(DateTime.Now);
// Build the query and Get list of messages
MailQuery query = builder.GetQuery();
ImapMessageInfoCollection messages = client.ListMessages(query);
foreach (ImapMessageInfo info in messages)
{
Console.WriteLine("Internal Date: " + info.InternalDate);
}
// Disconnect from IMAP
client.Dispose();
Groß-/Kleinschreibung‑sensitiv filtern
Das folgende Code‑Snippet zeigt, wie man eine fallabhängige E‑Mail‑Filterung verwendet.
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.Subject.Contains("Newsletter", true);
builder.InternalDate.On(DateTime.Now);
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.
// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Encoding.UTF8);
builder.Subject.Contains("ğüşıöç", true);
MailQuery query = builder.GetQuery();
Benutzerdefinierte Filteroptionen
Nachrichten mit benutzerdefiniertem Flag filtern
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.HasFlags(ImapMessageFlags.Keyword("custom1"));
queryBuilder.HasNoFlags(ImapMessageFlags.Keyword("custom2"));
Benutzerdefinierte Suche für Filterung
Zum Beispiel erlaubt der RFC‑3501‑Standard keine Nachrichtensuche basierend auf dem Vorhandensein von Anhängen. Aber Gmail bietet IMAP-Erweiterungen die eine solche Suche ermöglichen. Das nächste Code‑Snippet zeigt, wie man eine entsprechende Abfrage erstellt.
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.CustomSearch("X-GM-RAW \"has:attachment\"");
MailQuery mailQuery = queryBuilder.GetQuery();
ImapMessageInfoCollection messageInfoCollection = imapClient.ListMessages(mailQuery);
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.
///<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>
using (ImapClient client = new ImapClient("host.domain.com", 84, "username", "password"))
{
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 - " + Guid.NewGuid(),
"111111111111111");
client.AppendMessage(ImapFolderInfo.InBox, message);
}
string body = "2222222222222";
for (int i = 0; i < messagesNum; i++)
{
message = new MailMessage(
"from@domain.com",
"to@domain.com",
"EMAILNET-35128 - " + Guid.NewGuid(),
body);
client.AppendMessage(ImapFolderInfo.InBox, message);
}
client.SelectFolder("Inbox");
ImapQueryBuilder iqb = new ImapQueryBuilder();
iqb.Body.Contains(body);
MailQuery query = iqb.GetQuery();
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection totalMessageInfoCol = client.ListMessages(query);
Console.WriteLine(totalMessageInfoCol.Count);
//////////////////////////////////////////////////////
List<ImapPageInfo> pages = new List<ImapPageInfo>();
PageSettings pageSettings = new PageSettings();
pageSettings.FolderName = ImapFolderInfo.InBox;
ImapPageInfo pageInfo = client.ListMessagesByPage(query, new PageInfo(itemsPerPage, 0), pageSettings);
pages.Add(pageInfo);
while (!pageInfo.LastPage)
{
pageInfo = client.ListMessagesByPage(query, pageInfo.NextPage, pageSettings);
pages.Add(pageInfo);
}
int retrievedItems = 0;
foreach (ImapPageInfo folderCol in pages)
retrievedItems += folderCol.Items.Count;
}
finally
{
}
}