فیلتر کردن پیام‌ها از سرور با استفاده از کلاینت IMAP

این ImapClient کلاس فراهم می‌کند listMessages() متد تمام پیام‌های یک صندوق‌پست را دریافت می‌کند. برای دریافت تنها پیام‌هایی که با شرطی مطابقت دارند، از نسخهٔ بارگذاری‌شدهٔ listMessages() متدی که می‌گیرد MailQuery به‌عنوان آرگومان. این MailQuery کلاس ویژگی‌های متنوعی برای تعیین شرایط فراهم می‌کند، برای مثال، تاریخ، موضوع، فرستنده، گیرنده و غیره. مثال اول نشان می‌دهد چگونه پیام‌ها را بر پایهٔ تاریخ و موضوع فیلتر کنیم. همچنین نشان می‌دهیم چطور بر اساس معیارهای دیگر فیلتر کنیم و پرس‌وجوهای پیچیده‌تری بسازیم. API همچنین امکان اعمال معیارهای جستجوی حساس به حروف بزرگ/کوچک برای تطبیق دقیق فیلترها را فراهم می‌کند. API همچنین اجازه مشخص کردن رمزگذاری رشتهٔ جستجو برای فیلتر کردن پیام‌ها از صندوق پست را می‌دهد.

فیلتر کردن پیام‌ها از صندوق‌پست

  1. اتصال و ورود به سرور IMAP
  2. یک نمونه از MailQuery و ویژگی‌ها را تنظیم کنید
  3. متد را فراخوانی کنید ImapClient.listMessages(MailQuery query) متد و پاس دهید MailQuery با پارامترها فقط پیام‌های فیلترشده را دریافت کنید.

کد زیر نشان می‌دهد چگونه به صندوق پست IMAP وصل شویم و پیام‌هایی که امروز رسیده‌اند و کلمه «newsletter» در موضوع دارند، دریافت کنیم.

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

دریافت پیام‌هایی که معیارهای خاص را برآورده می‌کنند

نمونه‌های کد فوق فیلتر پیام‌ها بر پایهٔ موضوع ایمیل و تاریخ. می‌توانیم از ویژگی‌های دیگر برای تنظیم شرایط پشتیبانی‌شده نیز استفاده کنیم. در زیر برخی مثال‌های تنظیم شرایط با استفاده از MailQuery. کدهای زیر نشان می‌دهند چگونه ایمیل‌ها را فیلتر کنیم بر اساس:

  1. تاریخ امروز.
  2. دامنهٔ تاریخ.
  3. از فرستندهٔ خاص.
  4. از دامنهٔ خاص.
  5. از گیرندهٔ خاص.

تاریخ امروز

کد زیر نشان می‌دهد چگونه ایمیل‌ها را بر پایه تاریخ امروز فیلتر کنیم.

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

فرستنده خاص

کد زیر نشان می‌دهد چگونه ایمیل‌ها را بر پایه فرستندهٔ خاصی فیلتر کنیم.

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

دامنه خاص

کد زیر نشان می‌دهد چگونه ایمیل‌ها را بر پایه دامنهٔ خاصی فیلتر کنیم.

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

گیرنده خاص

کد زیر نشان می‌دهد چگونه ایمیل‌ها را بر پایه گیرندهٔ خاصی فیلتر کنیم.

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

ساخت پرس‌وجوهای پیچیده

اگر متفاوت MailQueryBuilder ویژگی‌ها در عبارت‌های جداگانه تنظیم می‌شوند، سپس تمام شرایط مطابقت می‌یابند. برای مثال، اگر بخواهیم پیام‌ها را بین یک بازه زمانی و از یک میزبان خاص دریافت کنیم، باید سه عبارت بنویسیم.

ترکیب پرس‌وجوها با AND

قطعه کد زیر نشان می‌دهد چگونه پرس‌وجوها را با AND ترکیب کنید.

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

ترکیب پرس‌وجوها با OR

MailQueryBuilder ارائه می‌دهد or() متد که دو MailQuery نمونه‌ها به عنوان پارامترها. پیام‌هایی را که هر یک از دو شرط مشخص‌شده را برآورده می‌کنند، دریافت می‌کند. کد زیر نشان می‌دهد چگونه پیام‌هایی که یا «test» در موضوع دارند یا «noreply@host.com» به عنوان فرستنده، فیلتر شوند. کد زیر نشان می‌دهد چگونه پرس‌وجوها را با OR ترکیب کنیم.

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

پیام‌ها می‌توانند بر پایه InternalDate از سرور استخراج شوند، اما گاهی سرور تمام پیام‌ها را همان‌طور که در صندوق ورودی دیده می‌شوند بر نمی‌گرداند. دلیل آن می‌تواند منطقه زمانی سرور باشد چون ممکن است برای همه سرورها مثل جیمیل. Aspose دستورات مانند 008 SEARCH ON 4-May-2014 را بر اساس پروتکل IMAP اما نتیجه ممکن است به دلیل تنظیمات منطقه زمانی سرور متفاوت باشد. یک عضو جدید در ImapMessageInfo به عنوان InternalDate که به فیلتر کردن پیام‌ها کمک بیشتری می‌کند. کد زیر استفاده از InternalDate برای فیلتر کردن پیام‌ها.

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

فیلتر ایمیل‌های حساس به حروف بزرگ/کوچک

کد زیر نشان می‌دهد چگونه از فیلتر ایمیل‌های حساس به حروف بزرگ و کوچک استفاده کنیم.

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

مشخص کردن رمزگذاری برای سازندهٔ پرس‌وجو

API‌های ImapQueryBuilder سازنده می‌تواند برای تعیین رمزگذاری رشتهٔ جستجو استفاده شود. این کار همچنین می‌تواند با استفاده از DefaultEncoding ویژگی MailQueryBuilder. کد زیر نشان می‌دهد چگونه رمزگذاری را برای سازندهٔ پرس‌وجو مشخص کنیم.

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

فیلتر کردن پیام‌ها با پشتیبانی از صفحه‌بندی

این ImapClient قابلیت جستجوی پیام‌ها از صندوق پست و فهرست‌کردن آن‌ها با پشتیبانی از صفحه‌بندی را فراهم می‌کند. کد زیر نشان می‌دهد چگونه پیام‌ها را با پشتیبانی از صفحه‌بندی فیلتر کنیم.

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

فیلتر کردن پیام‌ها با پرچم سفارشی

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

فیلتر کردن پیام‌ها با استفاده از جستجوی سفارشی

به عنوان مثال، استاندارد RFC 3501 اجازه جستجوی پیام بر پایه وجود پیوست‌ها را نمی‌دهد. ولی Gmail ارائه می‌دهد افزونه‌های IMAP که امکان انجام چنین جستجویی را فراهم می‌کند. Aspose.Email ارائه می‌دهد customSearch متد از ImapQueryBuilder کلاسی برای ساخت پرس‌وجوی متناظر.

نمونه کد زیر نشان می‌دهد چگونه فهرستی از پیام‌های ایمیل حاوی پیوست را از سرور با استفاده از پروتکل IMAP و معیار جستجوی سفارشی بازیابی کنیم:

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