IMAP‑e‑mailfiltering – methoden, criteria & code‑voorbeelden

Basisberichtfiltering

De ImapClient class biedt de ListMessages() methode die alle berichten uit een mailbox haalt. Om alleen berichten te krijgen die aan een bepaalde voorwaarde voldoen, gebruik de overladen ListMessages() methode die neemt MailQuery als argument. De MailQuery klasse biedt diverse eigenschappen om de voorwaarden op te geven, bijvoorbeeld datum, onderwerp, afzender, ontvanger enzovoort. Het eerste voorbeeld toont hoe berichten te filteren op datum en onderwerp. We laten ook zien hoe te filteren op andere criteria en hoe complexere queries op te bouwen. De API biedt bovendien de mogelijkheid om hoofdlettergevoelige zoekcriteria toe te passen voor exacte filtering. De API staat ook toe de codering van de zoekstring op te geven voor het filteren van berichten uit de mailbox.

Berichten filteren uit mailbox

  1. Verbinden en inloggen op een IMAP‑server
  2. Maak een instantie van de MailQuery en stel de eigenschappen in
  3. Roep de ImapClient.ListMessages(MailQuery query) methode en geef de MailQuery met de parameters om alleen gefilterde berichten te verkrijgen.

Het onderstaande codefragment toont hoe u verbinding maakt met een IMAP‑mailbox en berichten opvraagt die vandaag zijn aangekomen en het woord "newsletter" in het onderwerp hebben.

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

Berichten filteren op specifieke criteria

De bovenstaande codevoorbeelden filtert berichten op basis van het e-mailonderwerp en de datum. We kunnen ook andere eigenschappen gebruiken om andere ondersteunde voorwaarden in te stellen. Hieronder staan enkele voorbeelden van het instellen van de voorwaarden met behulp van MailQuery. De volgende codefragmenten tonen hoe u e‑mails kunt filteren op:

  1. De datum van vandaag.
  2. Een datumreeks.
  3. Van een specifieke afzender.
  4. Van een specifiek domein.
  5. Van een specifieke ontvanger.

Datum van vandaag

Het onderstaande codefragment toont hoe u e‑mails kunt filteren op de datum van vandaag.

// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.InternalDate.On(DateTime.Now);

Datumbereik

Het onderstaande code‑fragment toont hoe je e‑mails kunt filteren op datumbereik.

// Emails that arrived in last 7 days
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));

Specifieke afzender

Het onderstaande codefragment toont hoe u e‑mails kunt filteren op een specifieke afzender.

// Get emails from specific sender
builder.From.Contains("saqib.razzaq@127.0.0.1");

Specifiek domein

Het onderstaande codefragment toont hoe u e‑mails kunt filteren op een specifiek domein.

// Get emails from specific domain
builder.From.Contains("SpecificHost.com");

Specifieke ontvanger

Het onderstaande codefragment toont hoe u e‑mails kunt filteren op een specifieke ontvanger.

// Get emails sent to specific recipient
builder.To.Contains("recipient");

Geavanceerde query‑opbouw

Als verschillend MailQueryBuilder eigenschappen worden ingesteld in afzonderlijke statements, waarna alle voorwaarden voldaan zijn. Bijvoorbeeld, als we berichten willen ophalen tussen een datumbereik en van een specifieke host, moeten we drie statements schrijven.

Queries combineren met AND

Het volgende codefragment toont hoe je queries combineert met AND.

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

Queries combineren met OR

MailQueryBuilder biedt de Or() methode die twee MailQuery instanties als parameters. Het haalt de berichten op die voldoen aan een van de twee gespecificeerde voorwaarden. Het onderstaande codefragment toont hoe u berichten kunt filteren die ofwel “test” in het onderwerp hebben of “noreply@host.com” als afzender. Het volgende codefragment laat zien hoe u queries kunt combineren met OR.

// Specify OR condition
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com"));

Filteren op interne datum

Berichten kunnen van de server worden gehaald op basis van de InternalDate, maar soms retourneert de server niet alle berichten zoals zichtbaar in de inbox. De oorzaak kan de tijdzone van de server zijn, omdat deze mogelijk niet UTC is voor alle servers zoals Gmail. Aspose verzendt commando’s zoals 008 SEARCH ON 4-May-2014 conform de IMAP‑protocol resultaten kunnen echter verschillen door de tijdzone‑instellingen van de server. Een nieuw lid is toegevoegd in ImapMessageInfo als InternalDate wat verder helpt bij het filteren van de berichten. Het onderstaande codefragment toont het gebruik van InternalDate om berichten te filteren.

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

Hoofdlettergevoelige filtering

Het onderstaande codefragment toont hoe u hoofdlettergevoelige e‑mailfiltering kunt gebruiken.

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

Codering Opgeven voor Query Builder

De API’s ImapQueryBuilder constructor kan worden gebruikt om de codering voor de zoekstring op te geven. Dit kan ook worden ingesteld via de DefaultEncoding eigenschap van de MailQueryBuilder. Het onderstaande codefragment toont hoe u de codering voor de query‑builder kunt specificeren.

// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Encoding.UTF8);
builder.Subject.Contains("ğüşıöç", true);
MailQuery query = builder.GetQuery();

Aangepaste filteropties

Berichten Filteren met Aangepaste Vlag

ImapQueryBuilder queryBuilder = new ImapQueryBuilder();

queryBuilder.HasFlags(ImapMessageFlags.Keyword("custom1"));

queryBuilder.HasNoFlags(ImapMessageFlags.Keyword("custom2"));

Aangepaste zoekopdracht voor filteren

Bijvoorbeeld, de RFC 3501-standaard staat geen zoekopdracht toe op basis van het bestaan van bijlagen in berichten. Maar Gmail biedt IMAP‑extensies die zo’n zoekopdracht mogelijk maken. Het volgende code‑fragment laat zien hoe je een overeenkomstige query maakt.

ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.CustomSearch("X-GM-RAW \"has:attachment\"");

MailQuery mailQuery = queryBuilder.GetQuery();
ImapMessageInfoCollection messageInfoCollection = imapClient.ListMessages(mailQuery);

Berichten Filteren met Paginering

De ImapClient biedt de mogelijkheid om berichten in de mailbox te zoeken en ze met paginering weer te geven. Het onderstaande codefragment toont hoe u berichten kunt filteren met paginering.

///<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
    {
    }
}