تصفية الرسائل من الخادم باستخدام عميل IMAP

الـ ImapClient class يوفر الـ listMessages() طريقة التي تسترجع جميع الرسائل من صندوق بريد. للحصول على الرسائل التي تطابق شرطًا ما فقط، استخدم المنهج المتجاوز listMessages() طريقة التي تأخذ MailQuery كوسيط. الـ MailQuery توفر الفئة خصائص متعددة لتحديد الشروط، مثل التاريخ، الموضوع، المرسل، المستلم وما إلى ذلك. يوضح المثال الأول كيفية تصفية الرسائل بناءً على التاريخ والموضوع. نعرض أيضًا كيفية التصفية وفق معايير أخرى وكيفية بناء استعلامات أكثر تعقيدًا. توفر الواجهة أيضًا القدرة على تطبيق معايير بحث حساسة لحالة الأحرف لتطابق معايير التصفية الدقيقة. كما تسمح الواجهة بتحديد ترميز سلسلة البحث لتصفية الرسائل من صندوق البريد.

تصفية الرسائل من صندوق البريد

  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 ولكن أحيانًا لا يُرجع الخادم جميع الرسائل كما هو ظاهر في البريد الوارد. السبب قد يكون المنطقة الزمنية للخادم لأنها قد لا تكون UTC لجميع الخوادم مثل Gmail. يرسل 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();

تحديد الترميز لمُنشئ الاستعلام

واجهة برمجة التطبيقات في ImapQueryBuilder يمكن استخدام الباني لتحديد الترميز لسلسلة البحث. يمكن أيضًا ضبط ذلك باستخدام DefaultEncoding خاصية في MailQueryBuilder. يوضح المقتطف البرمجي التالي كيفية تحديد الترميز لـ query builder.

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