Public/Get-Mail.ps1
|
function Get-Mail { #Requires -Version 5.1 <# .SYNOPSIS Searches Gmail messages for one mailbox. .DESCRIPTION Queries messages in a mailbox using Gmail search syntax and returns message metadata in a PowerShell-friendly object format. .PARAMETER Email Mailbox email address to search. .PARAMETER Query Optional Gmail search query. Examples: "snowflake", "from:example.com", "subject:\"invoice\" newer_than:30d" Default: -in:spam -in:trash .PARAMETER MaxResults Maximum number of messages to return. .EXAMPLE Get-Mail -Email stephen.tracy@northone.com -Query "snowflake" .EXAMPLE Get-Mailbox -Email stephen.tracy@northone.com | Get-Mail -Query "from:snowflake.com" -MaxResults 200 .OUTPUTS PSCustomObject with Email, Query, Id, ThreadId, Date, Subject, From, To, MessageId. #> [CmdletBinding()] param( [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string] $Email, [Parameter(ValueFromPipelineByPropertyName)] [bool] $Suspended, [Parameter(ValueFromPipelineByPropertyName)] [bool] $Archived, [Parameter()] [string] $Query, [Parameter()] [ValidateRange(1, 1000000)] [int] $MaxResults = 100 ) process { $activity = 'Get-Mail' if ($Suspended) { Write-Warning "Skipping $Email - account is suspended" return } if ($Archived) { Write-Warning "Skipping $Email - account is archived" return } $effectiveQuery = if ([string]::IsNullOrWhiteSpace($Query)) { '-in:spam -in:trash' } else { $Query.Trim() } Write-Verbose "$activity : $Email" Write-Verbose "Query : $effectiveQuery" Write-Verbose "Max : $MaxResults" Write-Progress -Activity $activity -Status "Searching messages for $Email..." -PercentComplete 20 $rows = @(& gam user $Email print messages query $effectiveQuery max_to_print $MaxResults 2>$null | ConvertFrom-Csv) Write-Progress -Activity $activity -Status "Formatting results ($($rows.Count) messages)..." -PercentComplete 90 foreach ($row in $rows) { [PSCustomObject]@{ Email = $row.User Query = $effectiveQuery Id = $row.id ThreadId = $row.threadId Date = $row.Date Subject = $row.Subject From = $row.From To = $row.To MessageId = $row.'Message-ID' } } Write-Progress -Activity $activity -Completed } } |