functions/Send-MDMail.ps1
function Send-MDMail { <# .SYNOPSIS Queues current email for delivery. .DESCRIPTION Uses the data prepared by Set-MDMail or Add-MDMailContent and queues the email for delivery. .PARAMETER TaskName Name of the task that is sending the email. Used in the name of the file used to queue messages in order to reduce likelyhood of accidental clash. .PARAMETER PersistAttachments Attachments will be serialized with the queued email allowing the source files to be removed immediately. .EXAMPLE PS C:\> Send-MDMail -TaskName "Logrotate" Queues the currently prepared email under the name "Logrotate" #> [CmdletBinding()] Param ( [Parameter(Mandatory = $true)] [string] $TaskName, [switch]$PersistAttachments ) begin { # Ensure the pickup patch exists if (-not (Test-Path (Get-PSFConfigValue -FullName 'MailDaemon.Daemon.MailPickupPath'))) { try { $null = New-Item -Path (Get-PSFConfigValue -FullName 'MailDaemon.Daemon.MailPickupPath') -ItemType Directory -Force -ErrorAction Stop } catch { Stop-PSFFunction -String 'Send-MDMail.Folder.CreationFailed' -StringValues (Get-PSFConfigValue -FullName 'MailDaemon.Daemon.MailPickupPath') -ErrorRecord $_ -Cmdlet $PSCmdlet -EnableException $true } } } process { # Don't send an email if nothing was set up if (-not $script:mail) { Stop-PSFFunction -String 'Send-MDMail.Email.NotRegisteredYet' -EnableException $true -Cmdlet $PSCmdlet } $script:mail['Taskname'] = $TaskName if ($PersistAttachments) { # Add the attachments bytes to the mail object if (-not $script:mail["AttachmentsBinary"]) { $script:mail["AttachmentsBinary"] = @() } foreach ($attachment in $script:mail['Attachments']) { $script:mail['AttachmentsBinary'] = @($script:mail['AttachmentsBinary']) + @{Name = (split-path -Path $attachment -Leaf); Data = [System.IO.File]::ReadAllBytes($attachment)} } } # Send the email Write-PSFMessage -String 'Send-MDMail.Email.Sending' -StringValues $TaskName -Target $TaskName try { [PSCustomObject]$script:mail | Export-Clixml -Path "$(Get-PSFConfigValue -FullName 'MailDaemon.Daemon.MailPickupPath')\$($TaskName)-$(Get-Date -Format 'yyyy-MM-dd_HH-mm-ss').clixml" -Depth 4 -ErrorAction Stop } catch { Stop-PSFFunction -String 'Send-MDMail.Email.SendingFailed' -StringValues $TaskName -ErrorRecord $_ -Cmdlet $PSCmdlet -EnableException $true -Target $TaskName } # Reset email, now that it is queued $script:mail = $null try { Start-ScheduledTask -TaskName MailDaemon -ErrorAction Stop } catch { Stop-PSFFunction -String 'Send-MDMail.Email.TriggerFailed' -StringValues $TaskName -ErrorRecord $_ -Cmdlet $PSCmdlet -EnableException $true -Target $TaskName } } } |