EWS を使用した Exchange サーバーメールボックスのメッセージフィルタリングとソート

EWS を使用したメッセージのフィルタリングとソート

この IEWSClient インターフェイスは以下を提供します ListMessages() メールボックスからすべてのメッセージを取得するメソッドです。条件に合致するメッセージだけを取得するには、オーバーロードされた ListMessages() メソッドは次を受け取ります MailQuery クラスを引数として使用します。 MailQuery クラスは、日付、件名、送信者、受信者などの条件を指定するためのさまざまなプロパティを提供します。また、API はメールボックスからメールを取得する際に大文字小文字を区別するフィルタを適用することも可能です。

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

メールボックスからフィルタされたメッセージを取得するには:

  1. Exchangeサーバーに接続します。
  2. インスタンスを作成する MailQuery そして、必要なプロパティを設定します。
  3. 呼び出す IEWSClient.ListMessages() メソッドに渡す MailQuery パラメータでフィルタされたメッセージのみ取得するようにします。

以下のコードスニペットは、IMAPメールボックスに接続し、件名に「Newsletter」という文字列が含まれ、かつ本日送信されたメッセージを取得する方法を示しています。

try
{                
    // Connect to EWS
    const string mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
    const string username = "username";
    const string password = "password";
    const string domain = "domain";

    IEWSClient client = EWSClient.GetEWSClient(mailboxUri, username, password, domain);

    // Query building by means of ExchangeQueryBuilder class
    ExchangeQueryBuilder builder = new ExchangeQueryBuilder();

    // Set Subject and Emails that arrived today
    builder.Subject.Contains("Newsletter");
    builder.InternalDate.On(DateTime.Now);

    MailQuery query = builder.GetQuery();

    // Get list of messages
    ExchangeMessageInfoCollection messages = client.ListMessages(client.MailboxInfo.InboxUri, query, false);
    Console.WriteLine("EWS: " + messages.Count + " message(s) found.");

    // Disconnect from EWS
    client.Dispose();                
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

今日の日付で

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

// 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");

MessageID で

以下のコードスニペットは、MessageID に基づいてすべてのメールをフィルタリングする方法を示します。

// Get email with specific MessageId
ExchangeQueryBuilder builder1 = new ExchangeQueryBuilder();
builder1.MessageId.Equals("MessageID");

メール配信通知で

以下のコードスニペットは、すべてのメール配信通知に基づいてすべてのメールをフィルタリングする方法を示します。

// Get Mail Delivery Notifications
builder1 = new ExchangeQueryBuilder();
builder1.ContentClass.Equals(ContentClassType.MDN.ToString());

メッセージサイズで

builder1 = new ExchangeQueryBuilder();
builder1.ItemSize.Greater(80000);

複雑なクエリの構築

異なる場合 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 を使用してクエリを組み合わせる方法を示しています。

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

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

以下のコードスニペットに示すように、フィルタ条件でIgnoreCaseフラグを指定することで、大小文字の区別に基づいてメールをフィルタリングできます。

// Query building by means of ExchangeQueryBuilder class
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();                
builder.Subject.Contains("Newsletter", true);
builder.InternalDate.On(DateTime.Now);
MailQuery query = builder.GetQuery();

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

int itemsPerPage = 5;
string sGuid = Guid.NewGuid().ToString();
string str1 = sGuid + " - " + "Query 1";
string str2 = sGuid + " - " + "Query 2";

MailQueryBuilder queryBuilder1 = new MailQueryBuilder();
queryBuilder1.Subject.Contains(str1);
MailQuery query1 = queryBuilder1.GetQuery();
List<ExchangeMessagePageInfo> pages = new List<ExchangeMessagePageInfo>();
ExchangeMessagePageInfo pageInfo = client.ListMessagesByPage(client.MailboxInfo.InboxUri, query1, itemsPerPage);
pages.Add(pageInfo);
int str1Count = pageInfo.Items.Count;
while (!pageInfo.LastPage)
{
    pageInfo = client.ListMessagesByPage(client.MailboxInfo.InboxUri, query1, itemsPerPage, pageInfo.PageOffset + 1);
    pages.Add(pageInfo);
    str1Count += pageInfo.Items.Count;
}

フィルタリングされたメッセージを昇順/降順でソート

メールフィルタリングは、メッセージを昇順/降順でソートすることでサポートできます。この場合、 OrderBy このメソッドは MailQueryBuilder クラスを使用してメール検索結果のソート順序を指定するために使用されます。検索クエリのソート基準を定義し、特定のプロパティに基づいて結果を昇順または降順にソートするかを指定できます。

このメソッドは ascending パラメータを受け取り、指定されたプロパティのソート順序を決定します。ascending が true の場合、検索結果は昇順にソートされます。false の場合は降順にソートされます。

MailQueryBuilder builder = new MailQueryBuilder();
builder.Subject.Contains("Report");
builder.InternalDate.Since(new DateTime(2020, 1, 1));
builder.Subject.OrderBy(true); // sort the subject ascending
builder.InternalDate.OrderBy(false); // sort the date descending

MailQuery query = builder.GetQuery();

// Get list of messages
ExchangeMessageInfoCollection messages = client.ListMessages(client.MailboxInfo.InboxUri, query, false);

上記のコードスニペットでは、OrderBy メソッドが2回適用されています。1回目は件名、2回目はメールの日付です。指定されたリクエストで ListMessages メソッドを実行すると、件名に「Report」という語句が含まれ、指定日以降に受信したメッセージの一覧が取得されます。同時に、結果は件名で昇順にソートされます。つまり、件名に基づいて A から Z のアルファベット順に並びます。また、結果は日付で降順にソートされ、最新のものから古いものへと順序付けられます。

AQS を使用したメッセージのフィルタリング

Aspose.Email for .NET を使用すれば、ユーザーは高度なクエリ構文(AQS)の強力な機能を活用して Exchange メールボックスから直接メッセージをフィルタリングできます。AQS は、日付、送信者、件名などの特定の条件に基づいてメールを正確に対象とするクエリを構築するための堅牢で直感的な手段を提供します。AQS を Aspose.Email for .NET と組み合わせてメールフィルタリングプロセスに統合する詳細な情報や、実装サンプルについては、 ExchangeメールボックスからAQSでメッセージをフィルタリング 記事。