概要
タイトル通り
環境
- Windows 11
スクリプト
param(
[string]$Keyword = "test",
[switch]$SearchBody = $false
)
try {
Write-Host "Connecting to Outlook..."
$ErrorActionPreference = "Stop"
$Outlook = New-Object -ComObject Outlook.Application
$Namespace = $Outlook.GetNamespace("MAPI")
$Namespace.Logon()
$Inbox = $Namespace.GetDefaultFolder(6)
Write-Host "Searching in $($Inbox.Name)"
Write-Host "Keyword: $Keyword"
Write-Host "Search Body: $SearchBody"
$Items = $Inbox.Items
Write-Host "Total items: $($Items.Count)"
$FoundItems = @()
$count = 0
foreach ($Item in $Items) {
$count++
if ($count % 100 -eq 0) {
Write-Host "Processing item $count..."
}
if ($SearchBody) {
if ($Item.Subject -match $Keyword -or $Item.Body -match $Keyword) {
$FoundItems += $Item
}
}
else {
if ($Item.Subject -match $Keyword) {
$FoundItems += $Item
}
}
}
Write-Host "Found: $($FoundItems.Count) emails"
if ($FoundItems.Count -gt 0) {
foreach ($MailItem in $FoundItems) {
Write-Host "-----"
Write-Host "Subject: $($MailItem.Subject)"
Write-Host "Sender: $($MailItem.SenderName)"
Write-Host "Received: $($MailItem.ReceivedTime)"
}
}
else {
Write-Host "No emails found."
}
if ($Inbox) { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Inbox) | Out-Null }
if ($Namespace) { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Namespace) | Out-Null }
if ($Outlook) { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Outlook) | Out-Null }
Write-Host "Done."
}
catch {
Write-Host "Error: $($_.Exception.Message)"
}
最後に
日本語で検索すると文字コードエラーになる場合があるのでその場合は検索キーワードを引数で受け取るようにしましょう
メールの件数が多いとかなり時間がかかるのでタイトルだけで検索するなどの工夫をしましょう
進捗がわかりづらい場合などがあるので 100件ずつ分割して検索してもいいと思います
0 件のコメント:
コメントを投稿