IMAP クライアントを使用してサーバーからメッセージをフィルタリング

この ImapClient class は以下を提供します listMessages() メールボックスからすべてのメッセージを取得するメソッドです。条件に合致するメッセージだけを取得するには、オーバーロードされた listMessages() を受け取るメソッド MailQuery を引数として。 MailQuery クラスは、日付、件名、送信者、受信者など、条件を指定するためのさまざまなプロパティを提供します。最初の例は、日付と件名に基づいてメッセージをフィルタリングする方法を示します。また、他の条件でフィルタリングする方法や、より複雑なクエリを構築する方法も示します。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 プロパティを別々のステートメントで設定すると、すべての条件が一致します。たとえば、日付範囲内かつ特定のホストからのメッセージを取得したい場合、3 つのステートメントを書く必要があります。

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() 2つを受け取るメソッド MailQuery インスタンスをパラメータとして使用します。指定された2つの条件のいずれかに一致するメッセージを取得します。以下のコードスニペットは、件名に “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 は、RFC に従って 008 SEARCH ON 4-May-2014 のようなコマンドを送信します。 IMAP プロトコル ただし、結果はサーバーのタイムゾーン設定により異なる場合があります。新しいメンバーが追加されました。 IMAPメッセージ情報 として 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 の IMAPクエリビルダー コンストラクタは検索文字列のエンコーディングを指定するために使用できます。これは以下を使用して設定することもできます。 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 メソッド( IMAPクエリビルダー 対応するクエリを作成するクラス。

以下のコードサンプルは、IMAP プロトコルとカスタム検索条件を使用して、添付ファイルがあるサーバー上のメールメッセージリストを取得する方法を示します。

ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);