MS Graph APIを使用したメールメッセージ検索と削除

ExchangeOnline上で特定の送信者からのメッセージを全削除したいと思い、MS Graphを使用してメッセージ一覧を取得するプログラムを書いてみた。

最初は、$filterを使用するつもりだったが、シンタックスがよく分からなくて断念。で、調べてみると、$filterより$searchの方が柔軟性がありそうなので、そちらを使用することにした。

$searchの対象だが、メッセージの場合、下記の物を検索対象として使用できる。

attachment添付ファイル名
ex) attachment:.ppt
bcc検索対象がBcc宛先メールアドレスあるいは氏名のフル指定または一部
ex) bcc:xxx@yyy等
bodyメールメッセージ本文
ex) body:テスト
cc検索対象がCc 指定方法はBcc同様
ex) cc:xxx
from検索対象が送信元 指定方法はBccと同様
ex) from:xxx@yyy.com
hasAttachment添付ファイル有/無(true/false)
ex) hasAttachment:true
importance重要度(low,midum,high)
ex) importance:high
kind種別(docs, email, faxes, im, journals, meetings, notes, posts, rssfeeds, tasks, voicemail)
ex) kind:email
participants検索対象:to, cc, bcc(指定方法はbccと同様)
received検索対象は受信日付
ex)
日付指定received:MM/DD/YYYY
範囲指定received>=MM/DD/YYYY AND received<=MM/DD/YYYY
recipientsparticipantsと同様
sent検索対象は送信日付。指定方法は受信日付と同様
size検索対象はメッセージサイズ(バイト数)
ex)
size:1..5000
size>=10000
subject検索対象は件名
ex) subject:テスト
to検索対象はTo 指定方法は(bccと同様)
ex) to:xxx@yyy.co.jp
検索対象と指定方法

上記はANDやORによって結合可能。()で優先順位の変更もできる。詳しくは下記を参照。
Use the $search query parameter in Microsoft Graph – Microsoft Graph | Microsoft Learn
Message properties and search operators for In-Place eDiscovery in Exchange Server | Microsoft Learn

例)送信元ドメインがxxx.co.jpまたはyyy.comで2024/5/10以降に受信したメッセージを検索

“(from:xxx.co.jp OR from:yyy.com) AND received>=05/10/2024”

C#からMS Graph APIにこれらの条件を設定するには、メッセージの取得時にQueryParamters.Searchに渡す形となる。

// Graph Client取得
var cli = new GraphServiceClient(cred);
・・・
//
string query = $"(from:{dom1} OR from:{dom2}) AND received>={FromDate.ToString("MM/dd/yyyy")}";
// メールメッセージ検索
var res = await cli.Me.Messages.GetAsync(
    opt=>{
        opt.QueryParameters.Search = @$"""{query}""";
        opt.QueryParameters.Select = ["id","sender","subject","receivedDateTime"];
        opt.QueryParameters.Top = 2000;
    }
);

という感じでメッセージを取得して、同時に取得したメッセージのIdを利用して削除することができた。

削除はDeleteAsyncを使用して行なう。一応、下記にコードを書いておく。

foreach(var itm in res.Value) {
    Console.WriteLine($"{itm.Sender?.EmailAddress?.Address},{itm.Subject}");
    await cli.Me.Messages[itm.Id].DeleteAsync();
}

※CLIで試験後、Blazorでログイン⇒メッセージ検索+選択削除のアプリを作成した。

忘れない様にメモ。

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, Microsoft Graph, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください