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 |
recipients | participantsと同様 |
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でログイン⇒メッセージ検索+選択削除のアプリを作成した。
忘れない様にメモ。