กรองข้อความจากเซิร์ฟเวอร์โดยใช้ IMAP Client

นี้ ImapClient class ให้ 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 อย่างไรก็ตามบางครั้งเซิร์ฟเวอร์อาจไม่ส่งคืนข้อความทั้งหมดตามที่เห็นในกล่องจดหมาย สาเหตุอาจมาจากโซนเวลาของเซิร์ฟเวอร์ที่อาจไม่เป็น 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();

ระบุการเข้ารหัสสำหรับตัวสร้างคำค้นหา

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