Lọc tin nhắn từ máy chủ bằng khách hàng IMAP
Cái ImapClient class cung cấp listMessages() phương thức lấy tất cả các tin nhắn từ một hộp thư. Để chỉ lấy các tin nhắn phù hợp với một số điều kiện, sử dụng phiên bản quá tải của listMessages() phương thức nhận MailQuery được truyền làm đối số. Các MailQuery lớp cung cấp nhiều thuộc tính để xác định các điều kiện, chẳng hạn như ngày, tiêu đề, người gửi, người nhận v.v. Ví dụ đầu tiên minh họa cách lọc tin nhắn dựa trên ngày và tiêu đề. Chúng tôi cũng cho thấy cách lọc theo các tiêu chí khác và cách xây dựng các truy vấn phức tạp hơn. API cũng cung cấp khả năng áp dụng tiêu chí tìm kiếm phân biệt hoa thường để khớp chính xác tiêu chí lọc. API cũng cho phép chỉ định mã hoá chuỗi tìm kiếm để lọc tin nhắn từ hộp thư.
Lọc tin nhắn từ Hộp thư
- Kết nối và đăng nhập vào máy chủ IMAP
- Tạo một đối tượng của MailQuery và đặt các thuộc tính
- Gọi ImapClient.listMessages(MailQuery query) phương thức và truyền vào MailQuery với các tham số để chỉ nhận các tin nhắn đã lọc.
Đoạn mã sau cho bạn thấy cách kết nối tới hộp thư IMAP và nhận các tin nhắn đến hôm nay và có từ "newsletter" trong tiêu đề.
// 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();
Lấy Tin Nhắn Đáp Ứng Tiêu Chí Cụ Thể
Các mẫu mã ở trên lọc tin nhắn dựa trên tiêu đề email và ngày. Chúng ta cũng có thể sử dụng các thuộc tính khác để đặt các điều kiện được hỗ trợ. Dưới đây là một số ví dụ về việc thiết lập các điều kiện bằng cách sử dụng MailQuery. Các đoạn mã sau đây cho thấy cách lọc email trên:
- Ngày hôm nay.
- Một khoảng thời gian.
- Từ người gửi cụ thể.
- Từ miền cụ thể.
- Từ người nhận cụ thể.
Ngày hôm nay
Đoạn mã sau cho bạn thấy cách lọc email dựa trên Ngày hôm nay.
// 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());
Người gửi cụ thể
Đoạn mã sau cho bạn thấy cách lọc email dựa trên người gửi cụ thể.
// 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");
Miền cụ thể
Đoạn mã sau cho bạn thấy cách lọc email dựa trên miền cụ thể.
// 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");
Người nhận cụ thể
Đoạn mã sau cho bạn thấy cách lọc email dựa trên người nhận cụ thể.
// 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");
Xây Dựng Truy Vấn Phức Tạp
Nếu khác MailQueryBuilder các thuộc tính được đặt trong các câu lệnh riêng biệt, sau đó mọi điều kiện sẽ được khớp. Ví dụ, nếu chúng ta muốn lấy tin nhắn trong một khoảng thời gian và từ một máy chủ cụ thể, chúng ta cần viết ba câu lệnh.
Kết Hợp Truy Vấn với AND
Đoạn mã sau cho bạn thấy cách kết hợp các truy vấn bằng 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());
Kết Hợp Truy Vấn với OR
MailQueryBuilder cung cấp or() phương thức nhận hai MailQuery các thể hiện như tham số. Nó nhận các tin nhắn phù hợp với bất kỳ một trong hai điều kiện được chỉ định. Đoạn mã dưới đây cho thấy cách lọc tin nhắn mà có “test” trong tiêu đề hoặc “noreply@host.com” là người gửi. Đoạn mã sau cho bạn thấy cách kết hợp các truy vấn bằng 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"));
Lọc dựa trên InternalDate
Tin nhắn có thể được trích xuất từ máy chủ dựa trên InternalDate tuy nhiên đôi khi máy chủ không trả về tất cả tin nhắn như hiển thị trong hộp đến. Nguyên nhân có thể là múi giờ của máy chủ vì nó có thể không phải UTC cho mọi máy chủ như Gmail. Aspose gửi các lệnh như 008 SEARCH ON 4-May-2014 theo giao thức IMAP tuy nhiên kết quả có thể khác nhau do cài đặt múi giờ của máy chủ. Một thành viên mới đã được thêm vào ImapMessageInfo như InternalDate điều này hỗ trợ hơn trong việc lọc tin nhắn. Đoạn mã sau cho thấy cách sử dụng của InternalDate để lọc tin nhắn.
// 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();
Lọc Email Phân biệt Hoa Thường
Đoạn mã sau cho bạn thấy cách sử dụng lọc email phân biệt chữ hoa chữ thường.
// 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();
Chỉ định Encoding cho Query Builder
API của ImapQueryBuilder bộ khởi tạo có thể được dùng để chỉ định Encoding cho chuỗi tìm kiếm. Điều này cũng có thể được đặt bằng cách sử dụng DefaultEncoding thuộc tính của MailQueryBuilder. Đoạn mã sau cho bạn thấy cách chỉ định mã hoá cho bộ xây dựng truy vấn.
// 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();
Lọc tin nhắn với Hỗ trợ Phân trang
Cái ImapClient cung cấp khả năng tìm kiếm tin nhắn từ hộp thư và liệt kê chúng với hỗ trợ phân trang. Đoạn mã sau cho bạn thấy cách lọc tin nhắn với hỗ trợ phân trang.
// 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();
}
Lọc tin nhắn với Cờ Tùy chỉnh
// 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"));
Lọc tin nhắn bằng Tìm kiếm Tùy chỉnh
Ví dụ, tiêu chuẩn RFC 3501 không cho phép tìm kiếm tin nhắn dựa trên việc có đính kèm trong tin nhắn. Nhưng Gmail cung cấp Các mở rộng IMAP cho phép thực hiện tìm kiếm như vậy. Aspose.Email cung cấp customSearch phương thức của ImapQueryBuilder lớp để thực hiện truy vấn tương ứng.
Mẫu mã dưới đây cho thấy cách truy xuất danh sách các tin nhắn email từ máy chủ có đính kèm, sử dụng giao thức IMAP và tiêu chí tìm kiếm tùy chỉnh:
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);