IMAP E-posta Filtreleme - Yöntemler, Kriterler ve Kod Örnekleri

Temel Mesaj Filtreleme

Bu ImapClient class, şunları sağlar ListMessages() metod, bir posta kutusundaki tüm mesajları alır. Sadece belirli bir koşula uyan mesajları almak için aşırı yüklenmiş olanı kullanın ListMessages() metod, alır MailQuery argüman olarak.  MailQuery sınıf, tarih, konu, gönderen, alıcı vb. gibi koşulları belirtmek için çeşitli özellikler sunar. İlk örnek, tarih ve konuya göre mesajların nasıl filtreleneceğini gösterir. Ayrıca diğer kriterlere göre filtreleme ve daha karmaşık sorgular oluşturma yollarını gösteriyoruz. API, tam eşleşme filtreleme kriterleri için büyük/küçük harfe duyarlı arama kriterleri uygulama yeteneği sağlar. API ayrıca, posta kutusundan mesajları filtrelemek için arama dizesi kodlamasını belirtmeye izin verir.

Posta Kutusundan Mesajları Filtrele

  1. Bir IMAP sunucusuna bağlan ve oturum aç
  2. Şunun bir örneğini oluştur MailQuery ve özellikleri ayarla
  3. Şuğu çağırın ImapClient.ListMessages(MailQuery query) method ve geçirin MailQuery sadece filtrelenmiş mesajları alacak parametrelerle.

Aşağıdaki kod parçacığı, bir IMAP posta kutusuna bağlanıp, bugün gelen ve konu satırında "newsletter" kelimesi bulunan mesajları nasıl alacağınızı gösterir.

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

Belirli Kriterlere Göre Mesajları Filtrele

Yukarıdaki kod örnekleri mesajları e-posta konusu ve tarihine göre filtreler. Diğer özellikleri kullanarak başka desteklenen koşulları da ayarlayabiliriz. Aşağıda, koşulları … kullanarak ayarlamaya dair bazı örnekler bulunmaktadır MailQuery. Aşağıdaki kod parçacıkları, e-postaların şunlara göre nasıl filtreleneceğini gösterir:

  1. Bugünün tarihi.
  2. Bir tarih aralığı.
  3. Belirli bir gönderenden.
  4. Belirli bir alan adından.
  5. Belirli bir alıcıdan.

Bugünün Tarihi

Aşağıdaki kod parçacığı, bugünün tarihine göre e-postaların nasıl filtreleneceğini gösterir.

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

Tarih Aralığı

Aşağıdaki kod parçacığı, e-postaları tarih aralığına göre nasıl filtreleyeceğinizi gösterir.

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

Belirli Gönderici

Aşağıdaki kod parçacığı, belirli bir gönderene göre e-postaların nasıl filtreleneceğini gösterir.

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

Belirli Alan

Aşağıdaki kod parçacığı, belirli bir alan adına göre e-postaların nasıl filtreleneceğini gösterir.

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

Belirli Alıcı

Aşağıdaki kod parçacığı, belirli bir alıcıya göre e-postaların nasıl filtreleneceğini gösterir.

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

Gelişmiş Sorgu Oluşturma

Farklı ise MailQueryBuilder özellikler ayrı ifadelerde ayarlandığında, tüm koşullar eşleşir. Örneğin, bir tarih aralığı ve belirli bir sunucudan gelen mesajları almak istiyorsak üç ifade yazmamız gerekir.

Sorguları AND ile Birleştir

Aşağıdaki kod snippet’i, sorguları AND ile nasıl birleştireceğinizi gösterir.

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

Sorguları OR ile Birleştir

MailQueryBuilder sağlar Or() iki … alan yöntemi MailQuery örnekler parametre olarak. Belirtilen iki koşuldan herhangi birine uyan mesajları alır. Aşağıdaki kod parçacığı, konu satırında “test” içeren veya göndereni “noreply@host.com” olan mesajların nasıl filtreleneceğini gösterir. Aşağıdaki kod parçacığı, SORGULARI OR ile nasıl birleştireceğinizi gösterir.

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

InternalDate’a Göre Filtreleme

Mesajlar, InternalDate temel alınarak sunucudan çıkarılabilir; ancak bazen sunucu, gelen kutusunda görülen tüm mesajları döndürmez. Bunun nedeni, sunucu saat diliminin UTC olmaması gibi durumlar olabilir Gmail. Aspose, 008 SEARCH ON 4-May-2014 gibi komutları gönderir IMAP protokolü ancak sonuç, sunucu saat dilimi ayarlarından dolayı farklı olabilir. Yeni bir üye eklendi ImapMessageInfo as InternalDate bu da mesajları filtrelemede ek yardımcı olur. Aşağıdaki kod parçacığı, kullanımını gösterir InternalDate mesajları filtrelemek için.

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

Büyük/Küçük Harfe Duyarlı Filtreleme

Aşağıdaki kod parçacığı, büyük/küçük harfe duyarlı e-posta filtrelemenin nasıl kullanılacağını gösterir.

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

Sorgu Oluşturucu için Kodlamayı Belirle

API’nin ImapQueryBuilder yapıcı, arama dizesi için Kodlamayı belirtmekte kullanılabilir. Bu aynı zamanda aşağıdakini kullanarak da ayarlanabilir DefaultEncoding MailQueryBuilder özelliği. Aşağıdaki kod parçacığı, sorgu oluşturucu için kodlamayı nasıl belirteceğinizi gösterir.

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

Özel Filtreleme Seçenekleri

Özel Bayrak ile Mesajları Filtrele

ImapQueryBuilder queryBuilder = new ImapQueryBuilder();

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

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

Filtreleme için Özel Arama

Örneğin, RFC 3501 standardı mesajlarda ek bulunmasına dayalı bir aramaya izin vermez. Ancak Gmail şunu sağlar IMAP Uzantıları bu tür bir arama yapmaya izin verir. Sonraki kod parçacığı, ilgili sorgunun nasıl oluşturulacağını gösterir.

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

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

Sayfalama Desteğiyle Mesajları Filtrele

Bu ImapClient posta kutusundan mesajları arama ve sayfalama desteğiyle listeleme yeteneği sağlar. Aşağıdaki kod parçacığı, sayfalama desteğiyle mesajların nasıl filtreleneceğini gösterir.

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