סינון הודעות מהשרת באמצעות לקוח IMAP

ה ImapClient class מספקת את listMessages() מתודה אשר מקבלת את כל ההודעות מתיבת דואר. כדי לקבל רק הודעות שתואמות תנאי מסוים, השתמש ב- listMessages() מתודה אשר מקבלת MailQuery כארגומנט. ה- MailQuery המחלקה מספקת מגוון מאפיינים לציון תנאים, לדוגמה תאריך, נושא, שולח, נמען וכד’. הדוגמה הראשונה מדגימה כיצד לסנן הודעות בהתבסס על תאריך ונושא. אנו גם מציגים כיצד לסנן לפי קריטריונים נוספים וכאיך לבנות שאילתות מורכבות יותר. ה-API גם מספק את היכולת להחיל קריטריונים של חיפוש רגיש לרישיות כדי להתאים לקריטריוני סינון מדויקים. בנוסף, ה-API מאפשר לציין את קידוד מחרוזת החיפוש עבור סינון הודעות מתיבת הדואר.

סינון הודעות מתיבת דואר

  1. התחבר והתחבר לשרת IMAP
  2. צור מופע של MailQuery ולקבוע את המאפיינים
  3. הפעל את ImapClient.listMessages(MailQuery query) method והעבר את 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 עם זאת התוצאה יכולה להשתנות עקב הגדרות אזור זמן של השרת. חבר חדש נוסף ב- מידע הודעה Imap כ־ 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 בונה שאילתות Imap הבנאי יכול לשמש לציון הקידוד עבור מחרוזת החיפוש. ניתן גם להגדיר זאת באמצעות ה- 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 שיטה של בונה שאילתות Imap מחלקה ליצירת שאילתה תואמת.

דוגמת הקוד למטה מראה כיצד לאחזר רשימת הודעות אימייל מהשרת שיש להן קבצים מצורפים, באמצעות פרוטוקול IMAP וקריטריון חיפוש מותאם אישית:

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