IMAP 클라이언트를 사용하여 서버에서 메시지 필터링

다음은 ImapClient class는 다음을 제공합니다 listMessages() 메서드는 사서함의 모든 메시지를 가져옵니다. 특정 조건에 일치하는 메시지만 얻으려면 오버로드된 메서드를 사용하십시오 listMessages() 메서드는 ~를 받아들입니다 MailQuery 을 인수로 사용합니다.  MailQuery 클래스는 날짜, 제목, 발신자, 수신자 등과 같은 조건을 지정하기 위한 다양한 속성을 제공합니다. 첫 번째 예는 날짜와 제목을 기준으로 메시지를 필터링하는 방법을 보여줍니다. 또한 다른 기준으로 필터링하고 보다 복잡한 쿼리를 구축하는 방법을 보여줍니다. 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 프로토콜 하지만 결과는 서버 시간대 설정에 따라 다를 수 있습니다. 새 멤버가 다음에 추가되었습니다 ImapMessageInfo as 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);