Tìm kiếm và lọc email IMAP trong Python
Để lấy tất cả tin nhắn từ một hộp thư, Aspose.Email cung cấp phương thức ’list_messages’ của ImapClient lớp. Để chỉ lấy những tin nhắn thỏa mãn các điều kiện nhất định, bạn có thể sử dụng phương thức ’list_messages’ được overload và chấp nhận một MailQuery được truyền làm đối số. Các MailQuery lớp cung cấp nhiều thuộc tính để định nghĩa các điều kiện này, như ngày, tiêu đề, người gửi và người nhận.
Mẫu mã đầu tiên minh họa cách lọc tin nhắn dựa trên cả ngày và tiêu đề. Các ví dụ bổ sung cho thấy việc lọc theo các tiêu chí khác và xây dựng các truy vấn phức tạp hơn. Hơn nữa, API hỗ trợ tiêu chí tìm kiếm phân biệt chữ hoa/thường để lọc chính xác và cho phép bạn chỉ định mã hoá của chuỗi tìm kiếm khi lọc tin nhắn từ hộp thư.
Lọc và lấy tin nhắn từ máy chủ IMAP
Xây dựng truy vấn IMAP đơn giản
Sử dụng đoạn mã sau để kết nối tới hộp thư IMAP và lấy các tin nhắn đã đến hôm nay và có từ "newsletter" trong tiêu đề.
- Kết nối tới máy chủ IMAP bằng cổng 993 cùng tên người dùng và mật khẩu.
- Chọn thư mục "Inbox" để làm việc với email đến.
- Tạo một thể hiện của ImapQueryBuilder để xây dựng truy vấn tìm kiếm.
- Xác định tiêu chí tìm kiếm, ví dụ, tiêu đề email phải chứa "Newsletter" và ngày nội bộ phải trùng với ngày hôm nay.
- Tạo truy vấn tìm kiếm bằng cách lấy nó từ trình xây dựng.
- Sử dụng truy vấn để liệt kê các tin nhắn đáp ứng tiêu chí.
- In tổng số tin nhắn phù hợp với tiêu chí tìm kiếm.
Xây dựng Tiêu chí Tìm kiếm Phức tạp
Aspose.Email cũng cho phép xây dựng tiêu chí tìm kiếm phức tạp để truy vấn và lọc các tin nhắn email như ngày giao, trong một khoảng thời gian, người gửi cụ thể, miền cụ thể hoặc người nhận cụ thể. Đối với mục đích này, sử dụng MailQueryBuilder lớp và các thuộc tính của nó. Các mẫu mã dưới đây sẽ cho bạn cách lấy tin nhắn theo tiêu chí cụ thể.
Lọc Email theo Ngày Hôm Nay
Để lấy các tin nhắn theo ngày giao, sử dụng thuộc tính ‘internal_date’ của MailQueryBuilder lớp như được minh họa trong đoạn mã mẫu dưới đây:
import aspose.email as ae
from datetime import datetime
builder = ae.tools.search.MailQueryBuilder()
builder.internal_date.on(datetime.now())
Lọc email theo khoảng ngày
Để lấy tin nhắn trong một khoảng thời gian, sử dụng cùng thuộc tính ‘internal_date’ chỉ định khoảng ngày như trong đoạn mã mẫu dưới đây:
import aspose.email as ae
from datetime import datetime, timedelta
builder = ae.tools.search.MailQueryBuilder()
# Emails that arrived in last 7 days
builder.internal_date.before(datetime.now())
builder.internal_date.since(datetime.today() - timedelta(days=7))
Lọc Email theo Người gửi Cụ thể
Để lấy tin nhắn từ người gửi cụ thể, sử dụng thuộc tính ‘from_address’ của MailQueryBuilder lớp như được minh họa trong đoạn mã mẫu dưới đây:
import aspose.email as ae
builder = ae.tools.search.MailQueryBuilder()
builder.from_address.contains("saqib.razzaq@127.0.0.1")
Lọc email theo miền cụ thể
Để lấy tin nhắn từ một miền cụ thể, sử dụng thuộc tính ‘from_address’ như trong đoạn mã mẫu dưới đây:
import aspose.email as ae
builder = ae.tools.search.MailQueryBuilder()
builder.from_address.contains("SpecificHost.com")
Lọc email theo người nhận cụ thể
Để lấy tin nhắn gửi tới một người nhận cụ thể, sử dụng thuộc tính ’to’ như trong đoạn mã mẫu dưới đây:
import aspose.email as ae
builder = ae.tools.search.MailQueryBuilder()
builder.to.contains("recipient")
Lọc tin nhắn theo ngày nội bộ
Xây dựng truy vấn dựa trên các điều kiện đã chỉ định như "ngày nội bộ" và "tiêu đề chứa". "Ngày nội bộ" đề cập đến ngày và thời gian mà một tin nhắn email được nhận hoặc thêm vào máy chủ email và có thể được đặt bằng thuộc tính ‘internal_date’ của ImapQueryBuilder lớp. Đoạn mã dưới đây minh họa cách lấy các email cụ thể từ hộp đến dựa trên tiêu đề và tiêu chí ngày:
import aspose.email as ae
from datetime import datetime
client = ae.clients.imap.ImapClient("imap.domain.com", 993, "user@domain.com", "pwd")
client.select_folder("Inbox")
# Set conditions, Subject contains "Newsletter", Emails that arrived today
builder = ae.clients.imap.ImapQueryBuilder()
builder.subject.contains("Newsletter")
builder.internal_date.on(datetime.now())
# Build the query and Get list of messages
query = builder.get_query()
messages = client.list_messages(query)
for info in messages:
print(f"Internal Date: {info.internal_date}")
Lọc tin nhắn theo cờ từ khóa tùy chỉnh
Tạo một truy vấn để tìm trong hộp thư IMAP các email chứa cờ từ khóa tùy chỉnh, cụ thể là "custom1" và "custom2". Để xây dựng truy vấn, sử dụng ImapQueryBuilder lớp lọc email khi lấy chúng từ máy chủ IMAP.
Đầu tiên, tạo một thể hiện của trình xây dựng truy vấn. Sử dụng has_flags phương pháp, thêm các điều kiện để chỉ bao gồm những email mang cờ từ khóa IMAP đã chỉ định. Các từ khóa tùy chỉnh trong IMAP, còn gọi là cờ do người dùng định nghĩa, cho phép người dùng gắn thẻ hoặc phân loại email cho nhiều mục đích, như đánh dấu trạng thái.
Đoạn mã dưới đây minh họa cách tạo truy vấn để lấy email dựa trên cờ từ khóa tùy chỉnh:
builder = ae.clients.imap.ImapQueryBuilder()
builder.has_flags(ae.clients.imap.ImapMessageFlags.keyword("custom1"))
builder.has_flags(ae.clients.imap.ImapMessageFlags.keyword("custom2"))
Xây Dựng Truy Vấn Phức Tạp
Đôi khi cần thỏa mãn hơn một truy vấn. Aspose.Email cho phép điều này bằng cách kết hợp các truy vấn trong nhiều câu lệnh. Tạo một MailQueryBuilder đối tượng và sử dụng các thuộc tính của nó để xây dựng các truy vấn cụ thể.
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.
import aspose.email as ae
from datetime import datetime, timedelta
builder = ae.tools.search.MailQueryBuilder()
builder.internal_date.before(datetime.now())
builder.internal_date.since(datetime.today() - timedelta(days=7))
builder.from_address.contains("SpecificHost.com")
Kết Hợp Truy Vấn với OR
Đoạn mã mẫu sau cho bạn cách kết hợp các truy vấn với OR.
builder.either(builder.subject.contains("test"), builder.from_address.contains("noreply@host.com"))
Áp dụng bộ lọc phân biệt chữ hoa chữ thường
API cũng cung cấp khả năng lọc email từ hộp thư dựa trên tiêu chí phân biệt chữ hoa chữ thường. Các phương thức sau của StringComparisonField lớp cung cấp khả năng tìm kiếm email với cờ phân biệt chữ hoa chữ thường.
- StringComparisonField.contains(value, ignore_case)
- StringComparisonField.equals(value, ignore_case)
- StringComparisonField.not_contains(value, ignore_case)
- StringComparisonField.not_equals(value, ignore_case)
Đoạn mã mẫu sau cho thấy cách triển khai khả năng này vào dự án của bạn:
builder = ae.tools.search.MailQueryBuilder()
builder.from_address.contains("noreply@host.com", True)
Thực hiện truy vấn tìm kiếm tùy chỉnh
Tạo một truy vấn tìm kiếm cho hộp thư IMAP mà lọc email dựa trên tiêu chí tìm kiếm Gmail tùy chỉnh — cụ thể là các email có đính kèm.
Bắt đầu bằng cách tạo một thể hiện của ImapQueryBuilder, giúp xây dựng các truy vấn tìm kiếm IMAP phức tạp. Sử dụng custom_search phương pháp để thêm chuỗi tìm kiếm đặc thù Gmail vào trình xây dựng truy vấn.
Chuỗi tìm kiếm X-GM-RAW "has:attachment" tận dụng thuộc tính IMAP mở rộng X-GM-RAW của Gmail, cho phép sử dụng cú pháp tìm kiếm mạnh mẽ của Gmail trong các truy vấn IMAP. Ở đây, toán tử has:attachment trả về tất cả email có đính kèm.
Đoạn mã sau minh họa cách lọc email để nhận tất cả tin nhắn có đính kèm:
builder = ae.clients.imap.ImapQueryBuilder()
builder.custom_search("X-GM-RAW \"has:attachment\"")
mailQuery = builder.get_query()
Phương thức này cho phép lọc nâng cao đặc thù Gmail để lấy các email mục tiêu.