กรองข้อความจากเซิร์ฟเวอร์โดยใช้ IMAP Client
นี้ ImapClient class ให้ listMessages() เมธอดที่ดึงข้อความทั้งหมดจากกล่องจดหมาย เพื่อดึงเฉพาะข้อความที่ตรงกับเงื่อนไขบางอย่าง ให้ใช้เมธอดโอเวอร์โหลด listMessages() เมธอดที่รับ MailQuery เป็นอาร์กิวเมนต์. MailQuery คลาสให้คุณสมบัติต่างๆ สำหรับระบุเงื่อนไข เช่น วันที่, หัวเรื่อง, ผู้ส่ง, ผู้รับ เป็นต้น ตัวอย่างแรกแสดงวิธีกรองข้อความตามวันที่และหัวเรื่อง เรายังแสดงวิธีกรองตามเกณฑ์อื่นและวิธีสร้างคำค้นที่ซับซ้อนมากขึ้น API ยังให้ความสามารถในการใช้เกณฑ์การค้นหาแบบแยกแยะตัวพิมพ์เพื่อให้ตรงกับเงื่อนไขการกรองอย่างแม่นยำ API ยังอนุญาตให้ระบุการเข้ารหัสของสตริงการค้นหาเพื่อกรองข้อความจากกล่องจดหมาย
การกรองข้อความจากกล่องจดหมาย
- เชื่อมต่อและเข้าสู่ระบบเซิร์ฟเวอร์ IMAP
- สร้างอินสแตนซ์ของ MailQuery และตั้งค่าคุณสมบัติ
- เรียกใช้ 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. ตัวอย่างโค้ดต่อไปนี้แสดงวิธีกรองอีเมลตาม:
- วันที่วันนี้.
- ช่วงวันที่.
- จากผู้ส่งเฉพาะ.
- จากโดเมนเฉพาะ.
- จากผู้รับเฉพาะ.
วันที่วันนี้
โค้ดตัวอย่างต่อไปนี้แสดงวิธีกรองอีเมลตามวันที่วันนี้.
// 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);