IMAP İstemcisi kullanarak Sunucudan Mesajları Filtrele

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ı Filtreleme

  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.

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

Belirli Kriterleri Karşılayan Mesajları Al

Yukarıdaki kod örnekleri e-posta konusuna ve tarihine göre mesajları filtrele. Diğer desteklenen koşulları ayarlamak için başka özellikler de kullanabiliriz. Aşağıda, koşulları kullanarak ayarlamanın bazı örnekleri verilmiştir 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.

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

Belirli Gönderici

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

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

Belirli Alan

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

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

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.

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

Karmaşık Sorgular 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ştirme

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

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

Sorguları OR ile Birleştirme

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.

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

InternalDate Üzerinden 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.

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

Büyük/Küçük Harfe Duyarlı E-posta Filtreleme

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

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

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.

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

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.

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

Özel Bayrak ile Mesajları Filtrele

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

Özel Arama Kullanarak Mesajları Filtrele

Ö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 aramanın yapılmasına izin verir. Aspose.Email şunu sağlar customSearch metodu ImapQueryBuilder sınıfı, ilgili sorguyu oluşturmak için.

Aşağıdaki kod örneği, IMAP protokolü ve özel bir arama kriteri kullanarak, ekleri olan e-posta mesajlarının sunucudan nasıl alınacağını gösterir:

ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);