Repository: microsoft/CSS-Exchange
File: M365/MDO/ResendFailedMail.ps1 (PowerShell)

Code before:
    } else {
        Write-Host "You have more than one Graph sessions. Please use just one session." -ForegroundColor Red
        exit
    }
    if (($graphConnection.TenantId) -ne ($exoConnection.TenantId) ) {
        Write-Host "`nThe Tenant Id from Graph and EXO are different. Please use the same tenant." -ForegroundColor Red
        exit
    }
}

$acceptedDomains = $null
try {
    $acceptedDomains = Get-AcceptedDomain -ErrorAction Stop
} catch {
    Write-Host "Error getting Accepted Domains:`n$_" -ForegroundColor Red
    exit
}

if ($null -eq $acceptedDomains) {
    Write-Host "We do not get accepted domains." -ForegroundColor Red
    exit
}

if ($acceptedDomains.count -eq 0) {
    Write-Host "No accepted domains found." -ForegroundColor Red
    exit
} else {
    $acceptedDomainList = New-Object System.Collections.Generic.List[string]
    $acceptedDomains | ForEach-Object { $acceptedDomainList.Add($_.DomainName.ToString()) }
}

$failedMessages = $null
$failedMessages = Get-MessageTrace -StartDate (Get-Date).AddDays(-$Days) -EndDate (Get-Date) | Where-Object { $_.Status -eq "Failed" }

if ($Sender) { $failedMessages = $failedMessages | Where-Object { $Sender -contains $_.SenderAddress } }
if ($Subject) { $failedMessages = $failedMessages | Where-Object { $Subject -contains $_.Subject } }
if ($Recipient) { $failedMessages = $failedMessages | Where-Object { $Recipient -contains $_.RecipientAddress } }
if ($MessageId) { $failedMessages = $failedMessages | Where-Object { $MessageId -contains $_.MessageId } }
if (-not $IncludeDuplicates) { $failedMessages = $failedMessages | Sort-Object MessageId -Unique }

$failedMessages = $failedMessages | Where-Object { $acceptedDomainList -contains $_.SenderAddress.Split("@")[1] }

$verifiedAcceptedSenderMessages = @()
foreach ($failedMessage in $failedMessages) {
    Write-Verbose "Checking $($failedMessage.SenderAddress)"
    $tempAddress = $null
    if ($recipientCache.ContainsKey($failedMessage.SenderAddress)) {
        Write-Verbose "Recipient $($failedMessage.SenderAddress) found in cache"
        $verifiedAcceptedSenderMessages += $failedMessage
    } else {
        try {

Review comment (suggestion):
Don't see a benefit to have these under two different `if` statements. Best to combined them and have one `Write-Host` and `exit`

Code after:
if ($MessageId) { $traceParams["MessageId"] = $MessageId }

try {
    [array]$failedMessages = Get-MessageTrace @traceParams -ErrorAction Stop
} catch {
    Write-Host "Error: $_.Exception.Message" -ForegroundColor Red
    exit
}

if ($failedMessages.count -ge 1000) {
    Write-Host "We get more than 1000 messages, please limit your search." -ForegroundColor Red
    exit
}

if (-not $IncludeDuplicates) {
    [array]$failedMessages = $failedMessages | Sort-Object MessageId -Unique
}

$verifiedAcceptedSenderMessages = New-Object System.Collections.Generic.List[object]
$count = 0
$totalMessages = $failedMessages.Count
foreach ($failedMessage in $failedMessages) {
    $count++
    Write-Progress -Activity "Checking Progress" -Status "$count of $totalMessages" -PercentComplete ($count / $totalMessages * 100) -CurrentOperation "Checking message $($failedMessage.MessageId) - Subject: $($failedMessage.Subject)"
    Write-Verbose "Checking $($failedMessage.SenderAddress)"
    $tempAddress = $null
    if ($recipientCache.ContainsKey($failedMessage.SenderAddress)) {
        Write-Verbose "RecipientAddress  $($failedMessage.SenderAddress) found in cache"
        if ($recipientCache[$failedMessage.SenderAddress]) {
            $verifiedAcceptedSenderMessages.Add($failedMessage)
        } else {
            Write-Verbose "Sender $($failedMessage.SenderAddress) is not a recipient in this tenant."
            Write-Verbose "Discarded $($failedMessage.MessageId) - Subject: $($failedMessage.Subject)"
        }
    } else {
        try {
            $tempAddress = Get-EXOMailbox $failedMessage.SenderAddress -ErrorAction Stop
            if ($null -eq $tempAddress) {
                Write-Verbose "Sender $($failedMessage.SenderAddress) is not a recipient in this tenant."
                Write-Verbose "Discarded $($failedMessage.MessageId) - Subject: $($failedMessage.Subject)"
                $recipientCache[$failedMessage.SenderAddress] = $false
            } else {
                Write-Verbose "Added to cache Recipient $($failedMessage.SenderAddress) with Id $($failedMessage.SenderAddress)"
                $recipientCache[$failedMessage.SenderAddress] = $true
                Write-Verbose "Verified $($failedMessage.SenderAddress)"
                $verifiedAcceptedSenderMessages.Add($failedMessage)
            }
        } catch {
            Write-Verbose "Error getting Sender Address $($failedMessage.SenderAddress)"
            Write-Verbose "Discarded $($failedMessage.MessageId) - Subject: $($failedMessage.Subject)"
            $recipientCache[$failedMessage.SenderAddress] = $false