IMAP メールフィルタリング - 方法、基準とコード例

基本的なメッセージフィルタリング

この ImapClient class は以下を提供します ListMessages() メールボックスからすべてのメッセージを取得するメソッドです。条件に合致するメッセージだけを取得するには、オーバーロードされた ListMessages() を受け取るメソッド MailQuery を引数として。 MailQuery クラスは、日付、件名、送信者、受信者など、条件を指定するためのさまざまなプロパティを提供します。最初の例は、日付と件名に基づいてメッセージをフィルタリングする方法を示します。また、他の条件でフィルタリングする方法や、より複雑なクエリを構築する方法も示します。API は、正確なフィルタリング条件に一致させるためのケースセンシティブ検索基準を適用する機能も提供します。さらに、メールボックスからメッセージをフィルタリングする際の検索文字列のエンコーディングを指定することもできます。

メールボックスからメッセージをフィルタリング

  1. IMAP サーバーに接続し、ログインする
  2. インスタンスを作成します MailQuery そしてプロパティを設定します
  3. 呼び出す ImapClient.ListMessages(MailQuery query) メソッドに渡す MailQuery パラメータを使用して、フィルタリングされたメッセージのみを取得します。

以下のコードスニペットは、IMAP メールボックスに接続し、本日到着し件名に "newsletter" が含まれるメッセージを取得する方法を示します。

// Connect and log in to IMAP
const string host = "host";
const int port = 143;
const string username = "user@host.com";
const 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.Subject.Contains("Newsletter");
builder.InternalDate.On(DateTime.Now);
// Build the query and Get list of messages
MailQuery query = builder.GetQuery();
ImapMessageInfoCollection messages = client.ListMessages(query);
Console.WriteLine("Imap: " + messages.Count + " message(s) found.");
// Disconnect from IMAP
client.Dispose();

特定の条件でメッセージをフィルタリング

上記のコードサンプル メールの件名と日付に基づいてメッセージをフィルタリングします。他のプロパティを使用して、サポートされている他の条件も設定できます。以下は、… を使用して条件を設定する例です。 MailQuery。以下のコードスニペットは、次の条件でメールをフィルタリングする方法を示します。

  1. 本日の日付。
  2. 日付範囲。
  3. 特定の送信者から。
  4. 特定のドメインから。
  5. 特定の受信者から。

本日

以下のコードスニペットは、本日の日付でメールをフィルタリングする方法を示します。

// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.InternalDate.On(DateTime.Now);

日付範囲

以下のコードスニペットは、日付範囲でメールをフィルタリングする方法を示しています。

// Emails that arrived in last 7 days
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));

特定の送信者

以下のコードスニペットは、特定の送信者でメールをフィルタリングする方法を示します。

// Get emails from specific sender
builder.From.Contains("saqib.razzaq@127.0.0.1");

特定のドメイン

以下のコードスニペットは、特定のドメインでメールをフィルタリングする方法を示します。

// Get emails from specific domain
builder.From.Contains("SpecificHost.com");

特定の受信者

以下のコードスニペットは、特定の受信者でメールをフィルタリングする方法を示します。

// Get emails sent to specific recipient
builder.To.Contains("recipient");

高度なクエリ構築

異なる場合 MailQueryBuilder プロパティを別々のステートメントで設定すると、すべての条件が一致します。たとえば、日付範囲内かつ特定のホストからのメッセージを取得したい場合、3 つのステートメントを書く必要があります。

ANDでクエリを結合

以下のコードスニペットは、AND を使用してクエリを組み合わせる方法を示しています。

// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago
builder.From.Contains("SpecificHost.com");
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));

ORでクエリを結合

MailQueryBuilder 提供します Or() 2つを受け取るメソッド MailQuery インスタンスをパラメータとして使用します。指定された2つの条件のいずれかに一致するメッセージを取得します。以下のコードスニペットは、件名に “test” が含まれるか、送信者が “noreply@host.com” のメッセージをフィルタリングする方法を示します。また、OR を使用してクエリを組み合わせる方法も示しています。

// Specify OR condition
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com"));

InternalDate に基づくフィルタリング

メッセージは InternalDate に基づいてサーバーから抽出できますが、サーバーが受信トレイに表示される全てのメッセージを返さないことがあります。その理由はサーバーのタイムゾーンで、すべてのサーバーが UTC ではないためです。例えば Gmail。Aspose は、RFC に従って 008 SEARCH ON 4-May-2014 のようなコマンドを送信します。 IMAP プロトコル ただし、結果はサーバーのタイムゾーン設定により異なる場合があります。新しいメンバーが追加されました。 IMAPメッセージ情報 として InternalDate これによりメッセージのフィルタリングがさらに容易になります。以下のコードスニペットは、使用例を示します。 InternalDate メッセージをフィルタリングするために。

// Connect and log in to IMAP
const string host = "host";
const int port = 143;
const string username = "user@host.com";
const 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.Subject.Contains("Newsletter");
builder.InternalDate.On(DateTime.Now);

// Build the query and Get list of messages
MailQuery query = builder.GetQuery();
ImapMessageInfoCollection messages = client.ListMessages(query);
foreach (ImapMessageInfo info in messages)
{
    Console.WriteLine("Internal Date: " + info.InternalDate);
}
            
// Disconnect from IMAP
client.Dispose();

大文字小文字を区別したフィルタリング

以下のコードスニペットは、ケースセンシティブなメールフィルタリングの使用方法を示します。

// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.Subject.Contains("Newsletter", true);
builder.InternalDate.On(DateTime.Now);
MailQuery query = builder.GetQuery();

クエリビルダーのエンコーディングを指定

API の IMAPクエリビルダー コンストラクタは検索文字列のエンコーディングを指定するために使用できます。これは以下を使用して設定することもできます。 DefaultEncoding MailQueryBuilder のプロパティです。以下のコードスニペットは、クエリビルダーのエンコーディングを指定する方法を示します。

// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Encoding.UTF8);
builder.Subject.Contains("ğüşıöç", true);
MailQuery query = builder.GetQuery();

カスタムフィルタリングオプション

カスタムフラグでメッセージをフィルタリング

ImapQueryBuilder queryBuilder = new ImapQueryBuilder();

queryBuilder.HasFlags(ImapMessageFlags.Keyword("custom1"));

queryBuilder.HasNoFlags(ImapMessageFlags.Keyword("custom2"));

フィルタリングのためのカスタム検索

たとえば、RFC 3501 標準ではメッセージ内の添付ファイルの有無に基づく検索は許可されていません。しかし Gmail は提供しています。 IMAP 拡張機能 このような検索を実行できるものです。次のコードスニペットは、対応するクエリの作成方法を示しています。

ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.CustomSearch("X-GM-RAW \"has:attachment\"");

MailQuery mailQuery = queryBuilder.GetQuery();
ImapMessageInfoCollection messageInfoCollection = imapClient.ListMessages(mailQuery);

ページングサポート付きメッセージのフィルタリング

この ImapClient メールボックスからメッセージを検索し、ページングサポート付きで一覧表示する機能を提供します。以下のコードスニペットは、ページングサポート付きでメッセージをフィルタリングする方法を示します。

///<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>
using (ImapClient client = new ImapClient("host.domain.com", 84, "username", "password"))
{
    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 - " + Guid.NewGuid(),
                "111111111111111");
            client.AppendMessage(ImapFolderInfo.InBox, message);
        }
        string body = "2222222222222";
        for (int i = 0; i < messagesNum; i++)
        {
            message = new MailMessage(
                "from@domain.com",
                "to@domain.com",
                "EMAILNET-35128 - " + Guid.NewGuid(),
                body);
            client.AppendMessage(ImapFolderInfo.InBox, message);
        }

        client.SelectFolder("Inbox");
        ImapQueryBuilder iqb = new ImapQueryBuilder();
        iqb.Body.Contains(body);
        MailQuery query = iqb.GetQuery();

        client.SelectFolder(ImapFolderInfo.InBox);
        ImapMessageInfoCollection totalMessageInfoCol = client.ListMessages(query);
        Console.WriteLine(totalMessageInfoCol.Count);

        //////////////////////////////////////////////////////

        List<ImapPageInfo> pages = new List<ImapPageInfo>();
        PageSettings pageSettings = new PageSettings();
        pageSettings.FolderName = ImapFolderInfo.InBox;

        ImapPageInfo pageInfo = client.ListMessagesByPage(query, new PageInfo(itemsPerPage, 0), pageSettings);
        pages.Add(pageInfo);
        while (!pageInfo.LastPage)
        {
            pageInfo = client.ListMessagesByPage(query, pageInfo.NextPage, pageSettings);
            pages.Add(pageInfo);
        }
        int retrievedItems = 0;
        foreach (ImapPageInfo folderCol in pages)
            retrievedItems += folderCol.Items.Count;
    }
    finally
    {
    }
}